プログラム作成実習

;*********************************************
; PIC16F628A
; 4bitデータシフトプログラム
; 「ディジタル回路」実験用教材
; yokoie 2005.06.16作製
;*********************************************
;入出力ピン対応表
; 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秒カウント用カウンタ
SHIFTDT 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に戻す
;ポートAから入力
LOOP
movf PORTA, W ;PORTA -> W
movwf SHIFTDT ;W -> SHIFTDT
;SHIFTDTの値をシフトしてPORTBへ出力する
DTOUT movf SHIFTDT, W ;SHIFTDT -> W
movwf PORTB ;W -> PORTB
call TIMER3 ;約0.5秒待機
bcf STATUS, C ;Cフラグをクリア
btfsc SHIFTDT, 3 ;SHIFTDTの第3ビットがLなら次をスキップ
bsf STATUS, C ;CフラグをHに
rlf SHIFTDT, F ;SHIFTDTを1ビット左へシフト
goto DTOUT ;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 ;プログラム終了