HD44780互換(命令互換)キャラクタLCDの制御

16文字×2行の「1602」に代表されるキャラクタLCDは、機器の状態表示やデバッグ表示の定番部品です。そのほとんどに搭載されているのが、1980年代に登場し、いまも業界標準として使われ続けているコントローラ、HD44780(日立製作所製キャラクタLCDコントローラ。後継互換品が各社から供給され、業界標準となっている)です。本記事では、4ビットモードでの接続と初期化シーケンス、文字表示の格納先であるDDRAMアドレス、カスタム文字の作り方、そして「何も表示されない」ときの切り分けを解説します。

ピン構成と4ビットモード

制御に使う信号は、レジスタ選択のRS、読み書き選択のR/W、E(Enable)信号、データバスのDB0〜DB7です。確定(ラッチ)タイミングはEの立ち下がりです。これに電源とコントラスト調整用のV0(可変抵抗でコントラスト電圧を与えるピン)が加わります。なお、モジュールや資料によってVo・V0・VEEと表記が異なります。VEEは負電圧供給ピンを指す場合もあるため、モジュール固有の仕様書で必ず確認してください。

データバスは8本すべて使う8ビットモードのほか、上位4本(DB4〜DB7)だけで済ませる4ビットモードがあり、マイコンでは配線が少ない4ビットモードが定番です。4ビットモードでは1バイトを上位ニブル(bit7..4)→下位ニブル(bit3..0)の順に、DB4〜DB7へ載せて2回転送します。この2回はセットで完結させる必要があります。中断・割り込みなどで上位/下位ニブルの境界がずれると、以後のデータ解釈がずれ続けるため文字化けします(復旧には再初期化が有効です)。上位・下位の2回のEパルスは、同一タスクまたは同一のクリティカルセクションで完結させてください。分断されないようにするための具体的な手段としては、RTOSを使うなら送信関数をミューテックスで排他制御する、ベアメタルなら上位・下位の転送処理中だけ割り込みを禁止(マスク)する、といった方法があります。

コマンドとデータの送り分け

RS=0でコマンド(画面クリアやカーソル移動などの指示)、RS=1で表示データ(文字コード)を送ります。いずれもRS・R/W・データバスを安定させたうえでEにパルスを与え、規定のセットアップ時間とホールド時間を満たすようにします。結果として、値はEの立ち下がり側で確定します。R/Wは読み出し(ビジーフラグ確認)に使いますが、読まずに「コマンドごとに規定時間待つ」方式にすればGND固定にでき、配線をさらに1本減らせます。

初期化シーケンス:多くの人がつまずくポイント

HD44780にはハードウェアリセット端子がなく、内部の電源ONリセットも電源の立ち上がり条件を満たした場合にしか働きません。マイコンだけが再起動した場合などは、LCDが8ビットモードなのか4ビットモードなのか、4ビット転送の前半なのか後半なのかすら分からない状態から始まります。そこでデータシートは、どんな状態からでも確実に8ビットモードへ確定させる手順を規定しています。

  • 電源投入後、規定時間待つ(LCDの内部リセット完了待ち。VCC≧4.5 Vなら15 ms以上、VCC≧2.7 Vなら40 ms以上)。
  • データバス(DB4〜DB7)に「Function Set(8ビット指定)」の上位4ビットにあたるニブル 0b0011(=0x03。8ビットバス時の 0x30 の上位4ビットに相当)を、規定の待ち時間(ウェイト)(1回目送信後:4.1 ms以上、2回目送信後:100 µs以上)を挟みながら3回送り、3回目の送信後も約37 µs以上待ってから次のステップへ進む → どの状態にいても8ビットモードに確定する。
  • データバス(DB4〜DB7)に4ビット指定にあたるニブル 0b0010(=0x02)を送って4ビットモードへ移行。4ビット接続の実装では、慣例的に0x33 → 0x32(いずれも上位ニブル送信を意識した表現)と説明されることがあります。この記事はニブル単位の手順で記述しています。
  • 以後は4ビット×2回の転送で、Function Set(4ビット・2行・5×8フォント)→ 表示OFF → 画面クリア → エントリモード設定 → 表示ON。

各ステップの待ち時間はデータシートに規定があります。待ち時間方式は簡単ですが、必要な時間はコマンドごとに異なります。とくに画面クリア(0x01)とカーソルホーム(0x02)は他のコマンドより長い待ちが必要です(他の多くのコマンドが約37 µsであるのに対し、この2つは約1.52 msです)。ビジーフラグを読まない場合は、データシートに規定された各コマンドの最大実行時間に、低温・低VCC・低クロックなどの最悪条件分のマージンを加えた値で待ちます。画面クリアとカーソルホーム以外のコマンドも、同様に最大値を基準に待ち時間を設定してください。この手順と待ち時間を省略すると、まったく表示されない、電源を再投入すると復旧することがある、といった不安定な動きになります。初期化に失敗したLCDが、コントラストだけ効いて1行目に黒い帯(全ドット点灯)を出したままになるのも定番の症状です。

文字の表示とDDRAMアドレス

文字は表示RAM(DDRAM)に文字コードを書くと表示されます。位置はDDRAMアドレス設定コマンド(0x80+アドレス)で指定し、1行目は0x00から、2行目は0x40から始まります。たとえば2行目の先頭へ移動するコマンドは 0x80 + 0x40 = 0xC0 です。HD44780系は表示桁数より大きいDDRAM(一般に80文字分)を持ち、モジュール形状ごとに表示窓への割り当てが異なるため、1行目の続きが2行目になるわけではない点に注意が必要です。16文字×2行なら1行目は0x00〜0x0F、2行目は0x40〜0x4Fです。「2行目に書いたつもりが表示されない」ときは、まずこのアドレスを疑います。なお、国内流通品の多くは日本語フォント版(ROMコードA00)で、カタカナの文字コードも収録されています。ただし海外製の低価格モジュールにはA02(欧州文字版)やA01(西欧文字版)など複数のROMバリエーションがあるため、購入前にモジュールのROMコードを仕様書で確認してください。

カスタム文字(CGRAM)

5×8ドットの自作パターンを最大8文字まで登録できるのがCGRAMです。1文字あたり8バイト(各行のドットパターンを1バイトずつ)で定義します。各行は5ドット分(下位5ビット相当)を主に使用します(残りビットは未使用/実装依存)。CGRAMアドレス設定コマンドでパターンを書き込むと、文字コード0x00〜0x07で呼び出せます。バッテリ残量アイコンや単位記号(℃など)、簡易レベルメータなど、組み込み機器の表示を一段わかりやすくできる機能なので、活用するとよいでしょう。

「表示されない」ときの切り分け

  • 電源とバックライトを確認する → VCC・GNDの配線、バックライト(A/K)の点灯、V0可変抵抗の配線を最初に確認する。
  • まったく何も見えない → コントラスト(V0)の調整不足が最多。可変抵抗を回して、まず黒帯が見える状態を作る。
  • 黒帯は出るが文字が出ない → 初期化シーケンスの不備(待ち時間不足・手順抜け)か、E信号のパルスが正しく出ていない。
  • ときどき表示が文字化けする → 4ビット転送の上位・下位がずれた可能性。ノイズや割り込みによる分断を疑い、復旧手段として定期的な再初期化を入れる設計も実用的。
  • 2行目だけ出ない → DDRAMアドレス(0x40)の間違い、または1行表示モードで初期化している。

まとめ

HD44780互換コントローラは「初期化シーケンスを規定どおり踏む」「DDRAMのアドレス(番地)を理解する」の2点を押さえれば安定して使えます。一度ドライバを部品化しておけば、表示付き機器の試作スピードが大きく上がります。

組み込みソフトの世界 トップへ戻る