目次>5章 第2ステップ(色々な実験)>スイッチでLEDの点滅パターンを変更>ソース
スイッチでLEDの点滅パターンを変更(ソース)
更新日2005.10.2
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ==============================
; CLOCK 10MHz
; PORTB 0:LED緑,1:LED赤
;
LIST P=PIC16F84A ; LIST宣言で、使用するPICをPIC16F84Aと定義する
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cnt04 EQU 0Ch ; 0.4mS待つサブルーチン用カウンタ
cnt20 EQU 0Dh ; 20mS待つサブルーチン用カウンタ
old_sw EQU 0Eh ; 前回SW状態
mode EQU 0Fh ; LED表示モード
cnt500 EQU 10h ; 500mSをカウント(20mS×25)
ORG 0 ; リセットベクタ(0番地)を指定する。
INIT
; << PICの初期化 >>
CLRF PORTB ; PORTBを全てOFF
BSF STATUS,RP0 ; ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
CLRF TRISB ; ファイルレジスタTRISBをクリア(0) → PORTBは全て出力
MOVLW 01h
MOVWF TRISA ; ファイルレジスタTRISAの0ビット目のみON → RA0は入力
BCF STATUS,RP0 ; STATUSのRP0をクリア(0) → バンク0
CLRF old_sw ; 0 → 前回SW状態
MOVLW 01h
MOVWF mode ; 1 → LED表示モード
MOVLW D'25'
MOVWF cnt500 ; 25 → 500mSカウンタ(20mS×25)
; << メイン処理 >>
MAIN
BTFSC PORTA,0 ; スイッチの状態チェック
GOTO SW_ON ; スイッチがONの時
SW_OFF ; スイッチがOFFの時
CALL T20mS ; 20mS待つ
BTFSS PORTA,0 ; スイッチの状態チェック
CLRF old_sw ; OFFなら0→前回SW状態
GOTO DISP ; LED表示処理へ
SW_ON ; スイッチがONの時
CALL T20mS ; 20mS待つ
BTFSS PORTA,0 ; スイッチの状態チェック
GOTO DISP ; OFFならLED表示処理へ
BTFSC old_sw,0 ; 前回のスイッチ状態はOFF?
GOTO DISP ; ONならLED表示処理へ
BSF old_sw,0 ; 前回のスイッチ状態がOFFなら1→前回SW状態
INCF mode,F ; 表示モード+1
DISP
MOVLW D'1'
SUBWF mode,W
BTFSC STATUS,Z
GOTO DISP1 ; 表示モードが1の時
MOVLW D'2'
SUBWF mode,W
BTFSC STATUS,Z
GOTO DISP2 ; 表示モードが2の時
MOVLW D'3'
SUBWF mode,W
BTFSC STATUS,Z
GOTO DISP3 ; 表示モードが3の時
; 表示モードが1〜3以外の時
MOVLW D'1'
MOVWF mode ; 1 → 表示モード
GOTO MAIN
DISP1 ; 表示モードが1の時 緑色LEDのみ点灯
MOVLW 01h
MOVWF PORTB ; PORTBのRB0のみONにする(緑色LED点灯)
GOTO MAIN
DISP2 ; 表示モードが2の時 緑と赤のLEDを0.5秒毎に交互に点灯
DECFSZ cnt500
GOTO MAIN
; 500mS経過
MOVLW D'25'
MOVWF cnt500 ; 25 → 500mSカウンタ(20mS×25)
BTFSS PORTB,0
GOTO DISP21
MOVLW 02h
MOVWF PORTB ; RB0=0 RB1=1 緑消灯,赤点灯
GOTO MAIN
DISP21
MOVLW 01h
MOVWF PORTB ; RB0=1 RB1=0 緑点灯,赤消灯
GOTO MAIN
DISP3 ; 表示モードが3の時 赤色LEDのみ点灯
MOVLW 02h
MOVWF PORTB ; PORTBのRB1のみONにする(赤色LED点灯)
GOTO MAIN
; << 20mS待つサブルーチン >>
T20mS
MOVLW D'50' ; 50(20mS)
; MOVLW D'100' ; 100(40mS)
MOVWF cnt20 ; (ループ回数として50をセット)
T20LP CALL T04mS ; 0.4mS待つ
DECFSZ cnt20,F ; ループ回数−1して0になったら次の命令をスキップ
GOTO T20LP ;
RETURN ; このサブルーチン呼出し元に戻る
; << 0.4mS待つサブルーチン >>
T04mS
MOVLW D'249' ; 249
MOVWF cnt04 ; (ループ回数として249をセット)
T04LP NOP ; 何もせず1サイクル消費
DECFSZ cnt04,F ; ループ回数−1して0になったら次の命令をスキップ
GOTO T04LP
RETURN ; このサブルーチン呼出し元に戻る
END ; プログラムの終了をアセンブラに指示する
; =========================== ここまで ===============================