LCD出力 - 3種類の表示出力をサポート

もともとPSoCは3種類(キャラクタディスプレイ、I2C経由キャラクタディスプレイ、セグメントLED)の表示出力を標準でサポートしている。このうちキャラクタディスプレイは日立製作所のHD44780というLCDコントローラをサポートしている。これは要するに、よく売られている16桁×2行のLCDそのものである。今回は、これも秋月電子通商で売られていたSC1602BBWB-XAを使ったが、これもHD44780互換である。

このLCDであるが、バックライト端子はあるものの、これを使わなくても基板上を1カ所ショート&抵抗を1本はんだ付けすることで、VDDからバックライト電源を取れるようになるので、今回もこれを利用した(この関係で図1にはバックライト用電源が配線してない)(Photo32)。

Photo32:写真で左上のJ3をはんだでショートさせ、またR9に100Ωの抵抗をはんだ付けすると、バックライトが点灯する。詳しくはLCDディスプレイ添付の説明書を参照

余談になるが、PSoC 4のLCDライブラリは、きちんとR/!W端子の配線も管理しているようだ。例えばArduinoのWireライブラリを使う場合、R/!WはGNDに落としておけば勝手に表示されるが、PSoC 4で同じ事をやったらプログラムが無限待ち状態になってしまった。

また文字の濃さはVccの電圧でコントロールすることになるので、ポテンショメータを入れて適当に調整しないと、文字が一切見えないことになる。このVccは電流そのものはほとんど流れないため、抵抗値は適当である。リファレンスでは10KΩのポテンショメータを使う事になっているが、手持ちが100KΩしかなかったので流用しても特に問題はなかった。

さて、配線さえ間違えなければLCDのプログラミングそのものは非常に簡単である。まず最初に

    LCD_Start();                // LCD初期化

を呼び出す。配線が間違ってなければここですぐ戻ってくるので、後は例えば

        LCD_Position(0u, 0u);
        LCD_PrintString("Temp:");

といった具合に表示位置を指定して文字列を入れるだけである。また画面を消去したければ

        LCD_ClearDisplay();

でクリアされる。

問題は、LCDライブラリはあくまで文字列しか扱わないことで、なので今回の様に測定した数字を表示させたいときは、どこかで数字→文字列変換が必要になる。一番楽なのはstring.hあたりをincludeしてsprintf()を使うことであり、実際これは用意されているのだが、これをやると圧倒的にFlash Memoryを食い尽くしてしまう。実際これをやったところ、Flash Memoryの利用率が90%を軽く越えてしまい、途中でプログラムがFlash Memoryに収まらないという状況に陥った。

これを解決すべく、冒頭に突っ込んだのがInt2String()とFloat2String()の2つの関数である。名前の通り、整数を文字列に変換するルーチンと小数を文字列に変換するルーチンであり、機能的にも随分限られる(例えば数字の桁は8桁を超えないとか、小数は小数点以下第一位までしか扱わないなど、いくつかの暗黙の前提もある)が、これをsprintf()の代わりとしてstring.hを外すことでFlash Memoryの占有率は一時的には17%ほどまで落ちた。このロジックそのものはまだ最適化の余地は多いと思うが、とりあえず「動けばよい」を優先したものである。