1つのポートで液晶表示器 SC1602BS*B の制御

PIC16F84 で液晶表示器 SC1602BS*B の制御 では PortA と PortB で通信しましたが、こちらではPortBにまとめました。
一つにまとめたのでポート節約に便利かも。
PortB だけでなく、PortA とか他のポートにも書き換えやすいはず。
実験してないのですが(^^;

 

 

■目次


■回路図

16F84 版 16F628 版 16F877 版

 

■プログラム

16F84 だけでなく他のデバイスにも移植しやすいようサブルーチン化を進めました。
他、ラベル名や変数の先頭に LCD とつけたりして、使い回しやすくしてます。

3つのデバイスに移植してみました。
インクルード・変数定義・ポート初期設定・Wait(延滞時間) を書き換えるだけで、他のデバイスに移植できると思います。
たぶん・・・
たぶんですが・・(^^;

プログラムダウンロード
16F84 版 16F628 版 16F877 版
lcd1port_16f84.asm (6KB)

lcd1port_16f628.asm (7KB)

lcd1port_16f877.asm (6KB)

修正履歴

■04/01/09
【 PORTB以外で動かないバグを修正】
16F877版をいじっているときに発覚。PORTB から PORTEに移植したにもかかわらず、BUSYチェックが TRISB を操作してるままでした。
   #DEFINE LCDTRIS TRISB
こんな宣言がつきました。

【液晶表示器に繋げるポートを、いったん CLRF するようにしました】

■04/01/07
公開

 

■結果

Hello
と点滅表示されるだけです。でも嬉しいんです(笑)

他デバイスの移植失敗するかなー?と思ったのですが、意外とすんなり行きました。
もっとつまづくと思っていたのに。
スムーズにいっちゃうとかえって不安です・・。

 

■あとがき

一つのポートにまとめたおかげで、他ポートが有効利用!
便利になりましたー。

今回も色々なHPを参考にさせていただきました。
特に
   PICな日曜日 の16F877体制確立
に大変お世話になりました。いや、もう、そのまんまコピペな感じ(^^;

 

「どーして、1つのポートで通信できるの?」
たいした制御してません。
下のように、PortBの下位4bitに影響が出ないように、AND・OR演算がんばっているからです。

#DEFINE	LCDPORT	PORTB		LCDPORTをPORTBに読み替えて
LCDCHR
MOVWF LCDCHAR
CALL LCDBUSYCK ;BUSYチェック
MOVF LCDCHAR,W
ANDLW b'11110000' ;上位4bitをマスク
MOVWF LCDTEMP ;LCDTEMPにとっておく ←このへんがんばった

MOVF LCDPORT,W ←このへん
ANDLW b'00001111' ;現在のLCDPORT下位4bitを取り出して ←このへん
IORWF LCDTEMP,W ;上で取っておいたLCDTEMPと合成 ←このへん
MOVWF LCDPORT ;WをPortに反映。

トリックもなにもないですな。
文字で説明するのも大変なので、筆算して色々みてみてください。

 

 

・・・・・・「がんばってる」なんて偉そうに書いてみたけど、実際 PortB 0-3bit が保護されてるかは検証してません。
いいのか?そんなんで?
ま、いいか・・どーせここはネットの辺境だし。ウヒョヒョ

 

戻る