;**********************
;赤外線リモコン回路Ver.2
;
;PIC16F84A:10MHz用(1cycle=0.4μs)
;
;ボタンを1回押すと,RB1を出力
;再度押すと出力停止
;
;Ver.2 RB4のロジックを反転SWを押すとオフ(1)離すとオン(0)

; ピン・アサイン
; RA0 
; RA1 
; RA2 
; RA3 
; RA4 
; RB0 
; RB1 →Tr駆動用出力(1でON,0でOFF)
; RB2 →ON確認用LED(1でON,0でOFF)
; RB3 →OFF確認用LED(0でON,1でOFF)
; RB4 ←SW(押すと1,離すと0)
; RB5 
; RB6 
; RB7
;
;***************************************

LIST P=PIC16F84A
INCLUDE "P16F84A.INC"

;****************
; 変数レジスタ定義
;****************

LED equ 0CH
COUNT1 equ 0DH
COUNT2 EQU 0EH
LP_CNT equ 0FH

;**********************
; ポート・セット,初期化
;**********************
org 0 ;プログラム開始アドレス

bsf STATUS, RP0 ; RP0=1にして,バンク0→1にする
movlw b'00010000' ; PORTB入出力設定:RB4を入力(1),ほかは出力(0)に設定
movwf TRISB
bcf STATUS, RP0 ; TRIS設定が終了したのでバンクを元にもどす

bcf PORTB,1 ; ポートBの1ビット目を0にして出力停止
bcf PORTB,2 ; ポートBの2ビット目を0にしてON確認LED消灯
bsf PORTB,3 ; ポートBの3ビット目を1にしてLED点灯

clrf LED ; 変数LEDを0にしておく

;****************************
;メインルーチン
;****************************

MAIN
btfss LED, 0
goto LED_OFF

;********************************
; LED点滅
;********************************

bsf PORTB,1 ; ポートBの1ビット目を1にして出力
bsf PORTB,2 ; ポートBの2ビット目を1にしてON確認LED点灯
bcf PORTB,3 ; ポートBの3ビット目を0にしてLED消灯

movlw 30H ;48回SWチェック約100ms
movwf LP_CNT

ON_LOOP
btfsc PORTB, 4
goto LED_ON_CHANGE
call TIME20M
decfsz LP_CNT, f
goto ON_LOOP

goto MAIN

;スイッチが押された場合の処置

LED_ON_CHANGE
call TIME20M
call TIME20M
btfsc PORTB, 4
goto LED_ON_CHANGE

bcf LED, 0
goto MAIN

;出力停止
LED_OFF
bcf PORTB,1 ; ポートBの1ビット目を0にして出力停止
bcf PORTB,2 ; ポートBの2ビット目を0にしてON確認LED消灯
bsf PORTB,3 ; ポートBの3ビット目を1にしてLED点灯
btfsc PORTB, 4
goto LED_OFF_CHANGE
call TIME20M
goto LED_OFF

;スイッチが押された場合の処置

LED_OFF_CHANGE
call TIME20M
call TIME20M
btfsc PORTB, 4
goto LED_OFF_CHANGE

call TIME20M
call TIME20M
btfsc PORTB, 4
goto LED_OFF_CHANGE

bsf LED, 0
goto MAIN

;**************************
;タイマサブルーチン
;TIME1M :1ms
;TIME20M:20ms
;**************************

TIME1M
movlw 0F9H
movwf COUNT1

LOOP1
nop
nop
nop
nop
nop
nop
nop
decfsz COUNT1, f
goto LOOP1
nop
nop
nop
nop
nop
nop
nop
return

TIME20M
movlw 14H
movwf COUNT2

LOOP2
call TIME1M
decfsz COUNT2, f
goto LOOP2
return


end