;電子シャッター PIC16F84A Ver. 0.4
;SH16F844.ASM 
;RA4 signal input, RB4 shutter output , クロック4MHz
LIST P=PIC16F84A
INCLUDE "P16F84A.INC"
__CONFIG _HS_OSC & _PWRTE_ON & _CP_OFF & _WDT_OFF
CNT1 EQU 0CH ;400msec wait timer に使用
CNT2 EQU 0DH ;20msec wait timer に使用
CNT3 EQU 0EH ;パルスチェックに使用
ORG 0
MAIN
BSF STATUS,PR0 ;バンク1に切り替え
CLRF TRISB ポートBをすべて出力にセット
BCF STATUS,PR0 バンク0に戻る
BCF PORTB,4 RB4 を Low
MOVLW 0H
MOVWF CNT3 ;CNT3 をクリア
;メインループ
LOOP
TP1 BTFSS PORTA,4 ;RA4 が High の場合次の命令をスキップ
GOTO TP1
TP2 BTFSC PORTA,4 ;RA4 が Low の場合次の命令をスキップ
GOTO TP2
TP3 CALL WAIT400 ;400msec
CALL WAIT400 ;800msec
CALL WAIT400 ;1200msec
CALL WAIT400 ;1600msec
BTFSS CNT3,0 ;CNT3 が 0 でない場合次の命令をスキップ
CALL WAIT020 ;1620msec
TP4 BTFSS PORTA,4 ;RA4 が High  の場合次の命令をスキップ
GOTO CHECK
BCF PORTB,4 ;RB4 を Low
MOVLW 0H
MOVWF CNT3 ;CNT3 をクリア
GOTO LOOP
CHECK BTFSC CNT3,0 ;CNT3 が 0 なら次の命令をスキップ
GOTO SHUTTER
INCF CNT3,F ;CNT3 をインクリメント
GOTO LOOP
SHUTTER
BSF PORTB,4 ;RB4 を High
GOTO LOOP
;400msec wait timer
WAIT400
MOVLW 064H ;100
MOVWF CNT1
TIMLP1 NOP
DECFSZ CNT1,F
GOTO TIMLP1
RETURN
;20msec wait timer
WAIT020
MOVLW 07H ;7
MOVWF CNT2
TIMLP2 DECFSZ CNT2,F
GOTO TIMLP2
RETURN
END