LCDキャラクタディスプレイモジュールを使う、データ送信編。
長々とブログの更新を休んでおりましたが、再開することに致しました。
今回から、LCDキャラクタディスプレイモジュールにPICで文字を表示させることを目標に致します。
今回使用する回路は、下記の回路図の通りです。
右側のVR30K廻りの回路は、LCDの文字の表示濃度を調整するための回路(付けないと文字が表示されません)です。
ディスプレイに送るデータは4ビットで、ディスプレイ側の受けはD4~D7です。(今回、データは4ビットモードで使うため、仕様によりこのようになる)
送り側のPICは、IOポートBの上位4ビット(BR4~BR7)を使いました、Bポート下位4ビットや他のポートでも、問題はありません。
ディスプレイ側のR/Wポートは、書き込み(PICからディスプレイにデータを送る)か、読み込み(ディスプレイのデータをPICで読む)かの指定で、
0で書き込み1で読み込みとなります、今回は、書き込みしかしませんから、プログラムで0を設定すれば、変更の必要はありません「RA1=0」
(PICのRA1ポートはオープンにして、ディスプレイ側のR/Wポートをグランドへ接続してもよい)。
ディスプレイ側のRSポートは、レジスタ選択信号で、0で制御レジスタ選択、1でデータレジスタ選択となります、制御レジスタには、ディスプレイへの制御コマンドを
ディスプレイ側のEポートは、データ取り込み信号で、データをPICから出力してから、0~1に立ち上げ、規定時間たってから1~0にします、データは、Eが1~0
になった時点でディスプレイに取り込まれます。
上の説明のタイムチャートが下の図です。
上の資料から、1回のデータ送信には、最低0.5μSの時間が必要(ディスプレイによっては1μSのものもある)、それより早いとディスプレイ側で処理が間に合わない
ことになります。
ところで、今回のPICの動作周波数は、4MHzですから、機械語の1命令は1μSであり、C言語の1命令は数個の機械語に変換されるので、C言語1命令は2μS以上
かかるので、上の問題は回避できます、しかし、動作周波数が20MHz等の早い動作を必要とする場合などは、考慮(ディレイ命令の挿入)する必要が出てきます。
以上、たくさん書きましたが、結論として、
一回データのディスプレイへの送信は、E(RA0)を0に設定してから、RS(RA2を0に設定し、R/W(RA1)を0に設定後、ポートBのRB4~RB7に上位
データ(書き込むデータの上位4ビット)を設定してから、E(RA0)を1に設定しすぐに0に戻し、ポートBのRB4~RB7に下位データ(書き込むデータの下位
4ビット)を設定してから、E(RA0)を1に設定しすぐに0に戻せば、1個のデータをディスプレイに送ったことのなります。
以下は、C言語で作った1個のデータを送るサブルーチンです。
サブルーチンを呼ぶ前に、送るデータをTXdetaに入れておきます。
プログラムの解説
3~5行目;使う変数の定義。
6~11行目;LCDに送るデータの作成(上位バイトと下位バイトが必要)。
12~13行目;LCDのRSポートとEポートの設定、
14行目;LCDのデータポートに上位バイトデータ出力。
15~16行目;Eポートへの取込み指示信号、ここでLCDがデータラインの上位バイトデータを取り込む。
17行目;LCDのデータポートに下位バイトデータ出力。
18~19行目;Eポートへの取込み指示信号、ここでLCDがデータラインの下位バイトデータを取り込む。
20行目;LCDのデータ処理が終わるのを待つ(命令によっては処理に時間がかかるものもあるので入れたがよい、短くても2~3mSあったがよい)。
ここで、4~9行目が複雑になっていますが、LCDへの書き込みでRBポートの下位バイトの値が変わらないようにしているためで、今回の回路の様にRB0~RB3を
使用しない場合は、考慮する必要はありません(5・6・8・11行は不要)、他の回路でこのサブルーチンを使えるようにしたかっただけです。
5~11行目の解説 (例;元のPOTBデータ0x12、送るデータ0x89とする)
5行目;ポートB下位バイトデータ保存用変数定義。
6行目;ポートBのデータの下位4ビットを抽出し保管(0x12→0x02)。
7行目;送るデータの上位4ビットを抽出し保管(0x89→0x80)。
8行目;送るデータの上位4ビットとポートBのデータの下位4ビットをつなぐ(したがって、HIdetaには、送るデータの上位4ビットと元のPORTBの下位4ビットが収まる)(0x02or0x80→0x82)。
9行目;送るデータの下位4ビットを抽出し保管(0x89→0x09)。
10行目;送るデーだの下位4ビットを左に4ビットシフトし上位4ビットにして保管0x09→0x90)。
11行目;送るデータの下位位4ビットとポートBのデータの下位4ビットをつなぐ(したがって、LOdetaには、送るデータの下位4ビットと元のPORTBの下位4ビットが収まる)(0x02or0x90→0x92)。
したがって、ポートBには、上位ビットの時0x82が下位ビットの時0x92が書き込まれるので、上位ビットとして8が送られ下位ビットとして9が送られ、ポートBの下位4ビットには、2が書き込まれるので、ポートBの下位4ビットは変化しない。
これで、PICからLCD表示機にデータを送ることができたので、このサブルーチンを利用して、LCD表示機を初期化することを次回の目標にします。