« PICのお勉強(6) RLFとRRLでLEDの順送り往復点灯 | トップページ | コッククロフト・ウォルトンの回路 »

2012年1月 2日 (月)

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

| |

« PICのお勉強(6) RLFとRRLでLEDの順送り往復点灯 | トップページ | コッククロフト・ウォルトンの回路 »

PICマイコン」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: PICのお勉強(7) テーブルを使ってLEDフラッシャ:

« PICのお勉強(6) RLFとRRLでLEDの順送り往復点灯 | トップページ | コッククロフト・ウォルトンの回路 »