プログラム作成実習
;********************************************* ; 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 ;プログラム終了