第五章 続続とりあえずやってみよう

 
   では前回 レジスタやらの説明をしたので 本題の解説に入りましょう
   前回話をしたように
   LEDを全てつける(ポートBを全て出力にする)には これだけのプログラムが必要でしたね

その1 バンク1に切り替え(STATUSを 00100000 にする)
その2 TRISBを全て出力にする(00000000 にする)
その3 バンクを0に戻す(STATUSを 00000000 にする)
その4 PORTBを全て出力にする(11111111 にする)

   では それをもとに プログラムを考えてみましょう
〜プログラム解説〜

	
	LIST	P=PIC16F84A

	BSF	03H,5
	CLRF	06H
	BCF	03H,5

	MOVLW	0FFH
	MOVWF	06H

	END

 
   では解説をします

     LIST   P=PIC16F84A

   これは MPLABに 「このプログラムは PIC16F84A のプログラムです」 と教えるためのものです
   これによって このMPLABは PIC16F84A用にアセンブルなんかを考えてくれます
 

     BSF   03H,5

   TRISBを触るためには バンク1にする必要があるといいました
   そしてバンク1にするには STATUSの5ビット目を 1にすればいいとも言いました
   これが その バンク1への切り替えです
   BSF は 決められたレジスタの 決められたビットを 1にする命令です
   この場合 レジスタは 03H ビットは5です
   03はSTATUSです だからSTATUSを操作するためには 03H と書きます
   これ(03H)は 03っていう数字が 16進数だということを示すためです
   MPLABでは数字を 0とHで囲むと 16進数として 数字が判断されます
   だから 010H も16進数ですし 0FFH も16進数です
   そして 03H は 03 ですから STATUSのことだというのが すぐに分かると思います
   そして決められたビットは 5ビット目 だから
   BSF 03H,5 は 03(STATUS)の5ビット目を1にする ということになります
   5ビット目を1にするのだから 00000000 が 00100000 となって
   バンク1への切り替えがこれで出来たことになります
 

     CLRF   06H

   多分 ”ぴん” ときたと思いますけど
   バンク1へ切り替えたので 次は TRISB(06)を 全て出力にします
   つまり TRISBを すべて0にします
   ということで
   CLRF は 指定したレジスタの内容を全て0にする ものです
   そして 指定したレジスタは 06 つまり TRISBですので(今はバンク1だから バンク0なら06は PORTB)
   TRISBが 全て0(00000000) になったので ポートBは 全て出力モードになったわけです
 

     BCF   03H,5

   これは BSFの逆の BCF です 指定したレジスタの 指定したビットを0にします
   この場合 STATUSの 5ビット目を0にしますから 00100000が 00000000 になって
   バンクが0になったわけです
 

     MOVLW   0FFH

   これはちょっとややっこしいものです
   PORTBをすべて1にしたいわけですが 全て0にするCLRFはあっても 全て1にする命令はないのです
   それに 11111111を書きこみたいわけですが 数字を直接レジスタに書きこむ命令もありません
   そこで 「1度 ワーキングレジスタ という 特殊なレジスタをすべて1にして
   そのワーキングレジスタ(W と省略する)の内容を PORTB に書きこむ」 という風にしなければならないのです
   
   こんな感じにね
 
   そこで これは Wを全て1にするというものです
   MOVLW は ワーキングレジスタに 数字を入力するというものです
   この場合 数字は 0FFH これは2進数に直すと 11111111 となります
   つまり8ビット全てが1になるので これを後でPORTBに書きこめばOKですね
 

     MOVWF   06H

   これは そのまま MOVWF は ワーキングレジスタの内容を 指定したレジスタに書き写す というものです
   ここで 指定したレジスタは 06 つまりPORTB(バンクは0だから) そして ワーキングレジスタは
   さっきFF(11111111)を書きこんだので それがPORTBに書かれるわけですから
   PORTBは 11111111 つまり ポートBは全て出力になって 電気が流れたわけです
   
   これで LEDが全てついたわけですね
 

     END

   これは MPLABに 「これでプログラムは終わりだよ」と 教えるためのものです
   まぁ おまじないですね
 
   どう? 分かりましたか?
   こんな感じです
   ためしに MOVLW 0FFH のところを MOVLW 01H にしたり MOVLW 0FH MOVLW 011H のように
   数字を変えて やってみてはどうでしょう? PORTB に書き込まれる数字が 00000001 のようになって
   つくLEDが変わって面白いと思います
 
   次は 03H などを STATUS のように書くための方法を紹介します
 

まとめ〜

ワーキングレジスタ ・・・ レジスタに直接数字を書き込むときなどによく使う
                一時的にデータを保存する 特殊なレジスタ

LIST P= ・・・ P=のところに 使うデバイス(PIC)の種類を書く
           例) LIST P=PIC16F84A

BSF f,d  ・・・ 指定したレジスタ(f)の指定したビット(d)を1にする
           例) BSF 03H,5

BCF f,d  ・・・ 指定したレジスタ(f)の指定したビット(d)を0にする
           例) BCF 03H,5

CLRF f  ・・・ 指定したレジスタ(f)をすべて0にする
           例) CLRF 06H

MOVLW k ・・・数字(k)をワーキングレジスタに書き込む
           例) MOVLW 0FFH

MOVWF f ・・・指定したレジスタにワーキングレジスタの内容を書きこむ
           例)MOVWF 03H

 

戻る ホームへ コウザへ 次へ