信大ロボ研のブログ

信州大学ロボット研究会のブログです。

PIC16F84AによるLCD制御報告

こんにちは、2年のたぬです。

長らく更新をしませんでしたが、決して遊んでいたわけではありません。
LCDと格闘していただけです。
何日かかったのか分かりませんが、本日、尻尾をつかみました。

本日の成果は
LCDの4ビット初期化に成功
●CLEARコマンドの出力と反映に成功
●画面上に「HELLO」と表示させることに成功
●画面上に「HELLO WORLD」と表示させることに成功

以上です。

特別なことは何もしていません。
ググれば出てくることばかりです。
回路も、ググれば出てきます。
ソースコードも、ググれば私が制作したものよりも優れているものが出てきます。


回路は、簡単にいえばPORTAにE、RS、R/Wをつなげ、PORTBの7654にそれぞれDB7〜DB4をつなげているだけです。

ソースコードは載せませんが、概要は
PIC16F84A初期化
LCD初期化
HELLOWORLD表示ルーチン(メインルーチン)
BUSYフラグチェック関数(以下全てサブルーチン)
READ関数
データSEND関数
コマンドSEND関数
ワーキングレジスタ上位4ビットSEND関数
タイマー関数

SEND関数は、LCDに対してデータを送信する関数です。
データを送信するのか、コマンドを送信するのかによって、関数の始まりだけ分けています。RSとR/Wビットの操作と、データの上位4ビットと下位4ビットを、SWAPFを用いて入れ替えています。
ワーキングレジスタ送信関数を用いて、Wレジスタの上位4ビットを相手に対して送信します。この関数は、上の2関数からCALLしてきます。
また、初期化処理時に4ビットSEND関数が単品で使えるので、かなり便利です。

READ関数を用いて、4ビットのデータを2回読み込み、8ビットに変換しています。
PORTBの上位4ビットを、ANDWFを用いて上位4ビットだけ残します。
Wレジスタには、あらかじめ0xF0を書き込みます。
同様の方法で下位4ビットも読み込み、先に読み込んで保存しておいた上位4ビットとIORWFを用いて結合しています。
この関数は、BUSYチェック関数をわかりやすくするために分岐した関数なので、普段はBUSY関数の中に放り込んでおいても大丈夫です。

肝心なのはBUSYフラグチェック関数です。
ここで、PORTBを出力ピンから入力ピンに変え、READ関数を呼び出してリード。
リード後は、7番ピン(BUSYフラグピンになっている)がセットされているかチェックし、セットされていれば今の動作を繰りかえす、クリアならばPORTBを出力に戻してサブルーチンを終了する、ということをしています。
まあ、SEND関数を2行ミスっただけで何日も困っていたのは秘密です……。


ミスった結果……
ALL「S」とか……どんだけ〜