;電子シャッター PIC12C509A Ver. 0.4
;SH12C509.ASM 
;GP3 signal input, GP2 shutter output 
LIST P=PIC12C509A
INCLUDE "P12C509A.INC"
__CONFIG _MCLRE_OFF & _CP_OFF & WDT_OFF & IntRC_OSC
CNT1 EQU 07H ;400msec wait timer に使用
CNT2 EQU 08H ;20msec wait timer に使用
CNT3 EQU 09H ;パルスチェックに使用
ORG 0
MAIN
MOVLW 09FH ;1001 1111
OPTION ;OPTION レジスタの設定
;bit7=1 ディセイブル ピン変化によるウェィクアップ(GP0,GP1,GP3) 不使用
;bit6=0 イネーブル 弱プルアップ(GP0,GP1,GP3) 使用
;bit5=0 イネーブル タイマ 0 クロックソース選択ビット 内部命令サイクルクロックを使用
;bit4=1 タイマ 0 ソースエッジ選択ビット High->Low 今回使わないのでどちらでもいい  
;bit3=1 プリスケーラ割り当てビット 今回 WDT も TMR0 も使わないのでどちらでもいい
;bit2-0=111 プリスケーラ・レート選択ビット 今回使わないのでどちらでもいい
MOVLW 08H ;0000 1000
TRIS GPIO ;GP3 を入力に設定
MOVLW 00H
MOVWF GPIO
;メインループ
LOOP
TP1 BTFSS GPIO,3 ;GP3 が High の場合次の命令をスキップ
GOTO TP1
TP2 BTFSC GPIO,3 ;GP3 が 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 GPIO,3 ;GP3 が High  の場合次の命令をスキップ
GOTO CHECK
BCF GPIO,2 ;GP2 を Low
MOVLW 0H
MOVWF CNT3 ;CNT3 をクリア
GOTO LOOP
CHECK BTFSC CNT3,0 ;CNT3 が 0 の場合次の命令をスキップ
GOTO SHUTTER
INCF CNT3,F ;CNT3 をインクリメント
GOTO LOOP
SHUTTER
BSF GPIO,2 ;GP2 を High
GOTO LOOP
;400msec wait timer
WAIT400
MOVLW 064H ;100
MOVWF CNT1
TIMLP1 NOP
DECFSZ CNT1,F
GOTO TIMLP1
RETLW 0
;20msec wait timer
WAIT020
MOVLW 07H ;7
MOVWF CNT2
TIMLP2 DECFSZ CNT2,F
GOTO TIMLP2
RETLW 0
END