液晶モジュールに温湿度・気圧データを表示するプログラムを作成する前に、動作確認目的として簡単な文字列を表示するプログラムを作成します。動作確認で行うこと温湿度・気圧センサから読み取った値を液晶モジュールに表示する前に、簡単な文字列を液晶モジュールに表示するプログラムを作成して動作確認します。この記事では、固定の文字列(例えば「Hello!」など)を、液晶ディスプレイの左上の位置から表示するプログラムを作成してみます。40回でI2C通信の関数を作成しました。今回はそれらのI2C通信関数を使用して順番に機能関数を作成していきます。最初に作成する関数は、以下のI2C通信手順を実現する関数です。ACK/NACKについてはチェックしないことにします。いうのは、ACK/NACKチェックをしてNACK(了解できなかった)という場合のPICマイコン側での対処方法が難しいためです。このI2C通信手順を実現する関数名は「lcdI2CProtocol」とし、引数は、スレーブアドレス(address)、データ種別を示す1バイト(control_code)、データ1バイト(data)にします。ACK/NACKチェックはしませんので、関数は以下のように簡単に作成してみました。0x41);と記述すればOKです。0x41);」などと関数コールすればとりあえず文字表示できますが、このようにするとプログラム記述がちょっと面倒になります。いうのは、動作設定を行う場合、動作設定のためのデータを液晶モジュールに送信したあと、液晶モジュール側で設定処理が行われるためちょっとの時間待ってあげる必要があります。動作確認したところ、動作設定の場合は1つの設定を行うたびに1ms程度時間待ちをした方が安定して動作するようです。文字表示の場合は待ち時間なしで動作しました。実はデータシートを見ると、以下のようにそれぞれの動作設定後は26.3μsより長い時間待つ必要があります。いろいろな条件で試したところ、50μs〜70μsの処理待ちをしてもうまく動作しないケースがありました。深い意味はありませんが、動作設定後の待ち時間は1msでプログラムを作成しました。先ほどのlcdI2CProtocol関数を使用して、待ち時間込みの関数として「lcdSendCommandData」という関数を作成します。引数は動作設定データの1バイトとしました。return;}また文字表示ですが、こちらは色々試したところ表示文字データを液晶モジュールに送信したあと、特に待ち時間なしでも問題なく表示されていました。電源の状態によっては問題が発生する可能性がありますので、コメントとして記述しておきました。関数名は「lcdSendCharacterData」とし、引数は表示文字データの1バイトとしました。液晶モジュールの初期化関数は、データシートを元に作成しました。関数名は「lcdInitialization」として引数はありません。先ほどの初期化処理を参考に以下のように作成しました。電源電圧が3.3VなのでBooster=ONに設定。return;}なお、コントラスト設定はC5〜C0の6ビットで行います。上のプログラムの設定は0b100000(=32)としていますが、濃度調整をしたい場合はこの値を変更してみてください。0x6cの設定のあとはデータシートによると200ms以上のウエイトが必要となっていますので、200msのウエイトを入れてあります。表示内容をクリアする関数も作成しておきます。関数にするまでもないですが、わかりやすくしたいので「lcdClearDisplay」という関数を作成しておきます。表示内容をクリアするには、動作設定の0x01を液晶モジュールに送信するだけでOKです。以下のように作成しました。表示位置を指定する関数も作成しておきます。前回の記事で説明しましたが、以下のように座標位置指定できるようにしておきます。関数名は「lcdLocateCursor」とします。y)として、position_xとposition_yとしました。表示位置はアドレスで指定できることを説明しましたが、アドレスの計算は以下のようになります(前回の説明内容です)。xアドレスがわかったら、コマンドは第7ビットを1にすればいいので、コマンドは以下のようになります。0x80(|は論理和)これをこのままプログラムにすると以下のようになります。return;}ただ、このようにプログラムを作成すると冗長になってしまいますので、短くしたいと思います。y座標が0の時は0x00、1のときは0x40です。y」を計算すれば求めることができます。0x40となりますので、ここまで計算できれば、あとはx座標を加算して、コマンドにするためにさらに0x80を加算すればアドレスが求められます。これらのことから、表示位置指定の関数は以下のように作成してみました。文字を表示する場合、1文字の場合は簡単です。「A」という文字を表示したい場合、lcdSendCharacterData(0x41);または、’A’は0x41ですので、lcdSendCharacterData(‘A’);とすれば、現在設定されている表示位置に「A」が表示されます。文字列を表示した場合はどうすればよいでしょうか。「Hello!」と表示したい場合は、一文字ずつ上のようにlcdSendCharacterData関数で表示すればよいですが、この方法ですと面倒です。話が飛びますが、C言語を勉強された時、一番最初に出てきたのは「printf」だったのではないでしょうか。world.”);」というようなプログラムが出てきたのではないかと思います。このprintfを使って液晶モジュールに文字列が表示できれば便利ですよね。XCコンパイラでは、このprintf関数の出力先をカスタマイズできるようになっています。printf関数の引数の文字列は、通常ディスプレイなどに表示されます。XCコンパイラのprintf関数は、文字表示の部分はputch関数を使用しており、自分でputch関数を定義することにより、出力先をカスタマイズすることができるようになっています。putchは引数がchar型の1バイトですので、以下のようにputc関数を記述しておくと液晶モジュールに文字列を表示することができます。return;}この関数をプログラム内に記述しておけば、通常のprintf関数の表示先が液晶モジュールになります。printf関数ですので、文字列だけではなく、以下のように数字を表示することが可能となります。27.5次回の記事では、温湿度と気圧データを表示するプログラムを作成しますが、数値の表示はこのようなprintf関数を使用します。動作確認プログラムこれで必要な関数ができました。動作確認のプログラムは以下のようになります。注意点としては、電源投入後は液晶モジュールの動作が安定するまで100ms1程度ウエイトします。