前回と同じ回路で、スイッチを押すと1秒ごとにLEDが点滅するプログラムです。
まず、100usのルーチンを作り、それを利用して1sのルーチンを作ります。
これらのタイマールーチンは、様々な場面で活用することができます。
CONFIGとSETUPは同じです。
レジスタは、20hから確保します。
;----------------------
;レジスタ
;----------------------
CBLOCK 020h
CNT1s ;1sカウンタ
CNT5ms ;5msカウンタ
CNT100us ;100usカウンタ
ENDC
MAINプログラムは、RB0に接続されたタクトスイッチを押すと1秒ごとにLEDがON・OFFします。
MAIN
BTFSC PORTB,0 ;RB0=0(スイッチが押されたら)ならLED_BLINKへ
GOTO MAIN ;RB0=1ならMAINへ
LED_BLINK
MOVLW 01h
MOVWF PORTA ;LED ON
CALL wait1s ;1秒待つ
MOVLW 00h
MOVWF PORTA ;LED OFF
CALL wait1s ;1秒待つ
GOTO MAIN
;==============================
; タイマールーチン
;==============================
;--------------------
; 1s WAIT
;--------------------
wait1s
MOVLW d'200'
MOVWF CNT1s
wait1s_loop
CALL wait5ms
DECFSZ CNT1s,F
GOTO wait1s_loop
RETURN
;レジスタ
;----------------------
CBLOCK 020h
CNT1s ;1sカウンタ
CNT5ms ;5msカウンタ
CNT100us ;100usカウンタ
ENDC
MAINプログラムは、RB0に接続されたタクトスイッチを押すと1秒ごとにLEDがON・OFFします。
MAIN
BTFSC PORTB,0 ;RB0=0(スイッチが押されたら)ならLED_BLINKへ
GOTO MAIN ;RB0=1ならMAINへ
LED_BLINK
MOVLW 01h
MOVWF PORTA ;LED ON
CALL wait1s ;1秒待つ
MOVLW 00h
MOVWF PORTA ;LED OFF
CALL wait1s ;1秒待つ
GOTO MAIN
;==============================
; タイマールーチン
;==============================
;--------------------
; 1s WAIT
;--------------------
wait1s
MOVLW d'200'
MOVWF CNT1s
wait1s_loop
CALL wait5ms
DECFSZ CNT1s,F
GOTO wait1s_loop
RETURN
;--------------------
; 5ms WAIT
;--------------------
wait5ms
MOVLW d'50'
MOVWF CNT5ms
; 5ms WAIT
;--------------------
wait5ms
MOVLW d'50'
MOVWF CNT5ms
wait5ms_loop
CALL wait100us
DECFSZ CNT5ms,F
GOTO wait5ms_loop
RETURN
CALL wait100us
DECFSZ CNT5ms,F
GOTO wait5ms_loop
RETURN
;--------------------
; 100us WAIT
;--------------------
wait100us
;1サイクル(4クロック)0.5us
;100us=0.5us×200サイクル
MOVLW d'65' ;1
MOVWF CNT100us ;1
wait100us_loop
DECFSZ CNT100us,F ;1
GOTO wait100us_loop ;2
RETURN ;2+1
; 100us WAIT
;--------------------
wait100us
;1サイクル(4クロック)0.5us
;100us=0.5us×200サイクル
MOVLW d'65' ;1
MOVWF CNT100us ;1
wait100us_loop
DECFSZ CNT100us,F ;1
GOTO wait100us_loop ;2
RETURN ;2+1