当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのC言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、出てこないことの方が多いと思いますので、ご了承願います。

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表示機を初期化することを次回の目標にします。