PICによる計数実験
;*********************************************
; PIC16F628A
; 4bit計数プログラム
; 「ディジタル回路」実験用教材
;
;*********************************************
;入出力ピン対応表
; RA0,1,2,3 SW入力
; RB0,1,2,3 LED出力
LIST P=16F628, ST=OFF, R=DEC, F=INHX8M
INCLUDE <P16F628A.INC>
__CONFIG _LVP_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
; 変数の定義
; メインルーチン
CNT1 EQU 20h ;TIMER1用カウンタ
CNT2 EQU 21h ;TIMER2用カウンタ
CNT3 EQU 22h ;0.5秒カウント用カウンタ
Count EQU 23h ;シフトするデータを格納するレジス
; プログラム開始番地
org 0 ;Reset Start
MAIN
;ポート設定
movlw 0x07
movwf CMCON ;PORTAをIOとして使用する
bsf STATUS, RP0 ;BANK1にする
movlw B'00001111'
movwf TRISA ;RA3,2,1,0を入力に
movlw B'11110000'
movwf TRISB ;RB0,1,2,3を出力に
bcf STATUS, RP0 ;BANK0に戻す
movlw 0 ;初期化
movwf Count
;ポートAから入力し、ポートBに出力、
LOOP
movf Count,W ;Count -> W
movwf PORTB ;W -> PORTB
call TIMER3 ;約0.5秒待機
incf Count
movf Count,W
subwf PORTA,W ;w == PORTA ?
btfsc STATUS,Z ;同じでなければスキップ
clrf Count ;Count<0
goto LOOP ;DTOUTへ戻りシフトを繰り返す
;***** 約0.5秒のタイマー(@4MHz) *****
TIMER3 MOVLW d'10' ;10 ->W
MOVWF CNT3 ;W -> CNT3
TIMLP3 CALL TIMER1 ;50m秒待機
DECFSZ CNT3, F ;CNT3を減らし0なら次をスキップ
GOTO TIMLP3 ;CNT3がゼロになるまで繰り返す
RETURN ;戻る
; ***** 約50m秒のタイマ(@4MHz) *****
TIMER1 MOVLW d'99' ;TIMER2を99回実行する
MOVWF CNT1 ;CNT1 = 99
NOP ;何もしない命令で時間調整
NOP
TIMLP1 CALL TIMER2
DECFSZ CNT1, F ;CNT1を減らし、ゼロなら次をスキップ
GOTO TIMLP1
RETURN
; ***** 約500μ秒のタイマ(@4MHz) *****
TIMER2 MOVLW d'165' ;
MOVWF CNT2 ;CNT1 = 165
NOP ;
NOP ;NOPを2回入れることで、正確に500回となる。
TIMLP2 DECFSZ CNT2, F ;CNT1を減らしゼロなら次をスキップ
GOTO TIMLP2
RETURN
end ;プログラム終了