【初期化とメイン処理部の作成】
まず作らなければならないのは初期化処理とメインルーチンです。
この部分のフローチャートは下図ですから、これに従って作成します。
ラベルはSTARTとMAINとする
【初期化処理部】
初期化ですることは、まず、入出力ピンの入出力モードの設定で、
次は変数で初期化が必要なもののセットをします。
(1)入出力の設定の仕方
この設定の手順はパターンが決まっていて下記のようにします。
入出力はTRISA、TRISBというSpecial Function Registerで設定
します。
TRISA、TRISBの各ビットがPORTAとPORTBの各ピンに対応し、
入力のときは「1」に、 出力の時は「0」にセットします。
電源ON後やRESET後はすべて「入力」として設定されています。
TRISAやTRISBなどのSpecial Function Registerにアクセスする
時には、Page1に切り替えて行う必要があります。この詳細は
別ページを読んで頂くこととし、ここでは決まったパターンだと
思って下記の様にソースを書いて下さい。
ORG 0 ;0番地スタート
START ;STARTラベル
BSF STATUS,RP0 ;STATUSレジスタのRP0ビットを1に
;してBank1に切替える
MOVLW 0FFH ;入力モード用の1をセット
MOVWF TRISA ;PORTAをすべて入力モードに設定
CLRF TRISB ;PORTBを全て出力モードに設定
BCF STATUS,RP0 ;Bank0に戻る
MOVLW 0FFH ;8ビットの1をセット
MOVWF PORTB ;PORTBに全て1を出力して全消灯
これで入出力モードの設定とまずは全ての発光ダイオードを消灯
するところまで完了です。
ここで全く定義していないSTATUSとかRP0とかの多くのラベルが
いきなり使われていますが、これらは全て標準ヘッダーファイルの
中で定義されていますので、アセンブルしてもエラーにはなりません。
(2)変数の初期化
今回のプログラムは、初期化の中で設定が必要な変数は、今の
ところ、ありませんので、取りあえず何もせずです。
【メイン処理部】
メインでの処理は、キースイッチの入力があるかどうかのチェックを
繰り返すことです。
これには、入力の仕方と判断の仕方を、どうプログラムで書くかが
必要になります。
まず、入力の仕方ですが、入出力ピンも汎用レジスタと同様に扱う
と考えれば簡単です。
つまり入出力レジスタから、ワーキングレジスタにデータを取り出す
には、下記の様にします。
MOVF PORTA,W ;これでPORTAがWregに写される
また、今回の様に、キースイッチ入力があるかどうかを調べるには
下記の様にします。
BTFSS PORTA,4 ;PORTAのRA4が1ならスキップ
キースイッチ1はRA3に、キースイッチ2はRA4に接続されており、
かつ、キースイッチがOFFの時は入力は5ボルトで、これを読み
こむと「1」です。逆にONのときは、0ボルトとなりますから「0」に
なります。従ってキースイッチの入力チェックのメイン処理部は
下記の様にすることで実現できます。
MAIN
BTFSS PORTA,3 ;RA3のスイッチ1をチェック
CALL PATAN1 ;ONならパターン1の処理へ
BTFSS PORTA,4 ;RA4のスイッチ2をチェック
CALL PATAN2 ;ONならパターン2の処理へ
GOTO MAIN ;繰り返し
プログラムの中で良く使う手順の中に「条件判断と分岐」が
あります。PICでこれを実現する手法のいくつかを紹介します。
(1)終了判定による分岐
カウンタ(CONTR)が0になったことによる終了判定
DECFSZ CONTR,F ;CONTR-1しかつゼロ判定をする
GOTO CNTINUE ;まだ終了でないとき続ける
end process ;終了したとき
(2)フラグによる分岐
フラグ(FLG)の0ビット目がゼロとゼロでないときで
分岐する。ゼロならAへゼロで無ければBへ分岐
BTFSC FLG,0 ;0ビット目をテスト
GOTO B ;ゼロでないときBへ分岐
A zero case ;ゼロの時Aへ分岐
(3)レジスタのデータがゼロかどうかで分岐
レジスタ(DATA)がゼロならAへゼロでなければBへ分岐
MOVF DATA,W ;DATAをWregへロード
BTFSC STATUS,Z ;Zeroフラグをテスト
GOTO A
B not zero case
(4)比較結果で分岐(IF文)
DATA_AとDATA_Bを比較し、DATA_Aが大きければAへ
そうでなければBへ分岐
MOVF DATA_B,W ;DATA_Bをロード
SUBWF DATA_A,W ;DATA_A - DATA_B
BTFSC STATUS,C ;? DATA_A < DATA_B
GOTO A
B (Aが小さいときか等しい時)
(注)SUBWF命令は f-Wreg で結果が正のとき
Carry FlagがONとなる(Z80等と逆)
(5)データの値による分岐(CASE文)
DATAが1ならA、2ならB 3ならCその他ならDへ分岐する
MOVF DATA.W ;DATAをロード
MOVWF TEMP ;一時保存用のレジスタ
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;ゼロかつまり1かテスト
GOTO A ;1ならAへ分岐
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;2かをテスト
GOTO B ;Bへ分岐
DECF TEMP,F ;TEMP-1
BTFSC STATUS,Z ;3かをテスト
GOTO C ;Cへ分岐
GOTO D ;Dへ分岐