PICのお勉強(7) テーブルを使ってLEDフラッシャ
テーブルを使って,LEDをにぎやかにピカピカさせてみました。
ソースはこれ→lesson7.asm
メインプログラムは以下のようになっています。
;============================================================
MAIN
CALL LED_PTN ;LED点灯パターンを決めるサブルーチンへ
MOVWF PORTB ;LED点灯パターンをPORTBへ送る
CALL TIMELOOP1
INCF COUNT,F ;COUNTに1を足してCOUNTに格納
MOVLW D'34' ;LED点灯パターンの総数34をWレジスタに代入
SUBWF COUNT,W ;COUNT-Wレジスタの引き算。
BTFSC STATUS,C ;STATUSレジスタのCビットが0なら次行をスキップ
CLRF COUNT ;COUNTを0に戻す
GOTO MAIN
;=============================================================
まず最初にLEDの点灯パターン(34種類作りました)を決めるサブルーチンへ飛んで,点灯パターンのデータをひとつ貰ってきて,PORTBへ送ってLEDを点灯させます。
1回目はCOUNT(LED点灯パターンカウント値)は0で,34種類中の1番目のデータを貰い,2回目は2番目のデータを貰ってきますが,このサブルーチンについては後述します。
INCF(Increment F)でCOUNTの値に1を足して,COUNTに格納します。
SUBWF(Subtract W from F)でCOUNT値-34の計算をしてWレジスタに格納します。
次にBTFSC(Bit Test F,Skip if Clear)で,STATUSレジスタのCビット(キャリービット)の値をチェックします。
上でやった計算,COUNT値-34の値が負なら(つまりCOUNT値<34なら)Cビットは0になるので,次行をスキップしMAINに戻ります。逆にCOUNT値>=34だとCビットは1になるので,COUNT値が34になったら(つまり34種類の点灯パターンを実行し終わると)COUNT値を0にリセットし,最初にもどります。ああややこしい。
;=============================================================
LED_PTN ;LEDの点灯パターンを決めるサブルーチン
MOVF COUNT,W ;COUNTの数値をWレジスタに代入
ADDWF PCL,F ;「PCL(今のアドレス値)+Wレジスタ値」のアドレスへ
RETLW B'00000000' ;1 Wレジスタに00000000を代入してRETURN
RETLW B'00000001' ;2
RETLW B'00000011' ;3
RETLW B'00000111' ;4
RETLW B'00001111' ;5
RETLW B'00011111' ;6
RETLW B'00111111' ;7
RETLW B'01111111' ;8
RETLW B'11111111' ;9
中略
RETLW B'00000111' ;31
RETLW B'00000011' ;32
RETLW B'00000001' ;33
RETLW B'00000000' ;34
;=============================================================
このサブルーチンでやってることは,次のことです。
ADDWF(ADD W with F)で,実行アドレスにCOUNT値を足して,その結果のアドレスの点灯パターンデータを拾い上げているのです。つまり,COUNTが0だと00000000のデータ,COUNTが1だとその下の00000001のデータを拾うことになるわけです。
【今日覚えた命令】 CLRF,INCF,SUBWF,ADDWF,RETLW
| 固定リンク | 0
「PICマイコン」カテゴリの記事
- ZK-80で足し算(2020.07.23)
- TK-80互換機 ZK-80のキット(2020.07.21)
- PICのお勉強(37) C言語編 12F683でA/D変換(2015.06.02)
- UVレジンでLEDイルミネーション (2)(2015.05.15)
- PICのお勉強(35) C言語編 PWMでサーボモータを動かす(2014.10.05)
コメント