附録H: キャラクターLCD / 非公式訳

pp.545-549

1. キャラクターLCD

一般的なキャラクターLCD (液晶ディスプレイ)を図H.1に示します(詳しくは図中のキャプションを見てください)。この種のディスプレイにはI2Cなどのシリアルインターフェイスを備えたものもありますが、コストを抑えたい場合はLCDコントローラー(日立製HD44780Uまたは互換品)を介したパラレルインターフェイスで制御することがよくあります。

2. ディスプレイの各種端子

図H.1bに示す各信号の目的は下のとおりです。

  • E (イネーブル): LCDコントローラーのためのクロック信号。EのネガティブエッジでLCDコントローラーへ書き込みが行われます。EのポジティブエッジでLCDコントローラーからの読み出しが行われます。

  • RS (レジスタセレクト): RS=0のときはLCDコントローラーの命令レジスタが選択されます(たとえば初期化などを実行します)。RS=1のときはLCDコントローラーのデータレジスタが選択されます(LCDに表示する文字を指定する場合)。

  • R/W (読み出/書き込み): 1で読み出し、0で書き込み。R/W=0の場合は、Eのネガティブエッジのタイミングで、現在の命令またはデータがLCDコントローラーの命令レジスタまたはデータレジスタに書き込まれます。書き込み先のレジスタはRSによって選択されます。R/W=1の場合は、EのポジティブエッジのタイミングでLCDコントローラーのレジスタからデータが読み出されます。

  • DB (データバス): LCDコントローラーを相手にデータまたは命令を送受信するための双方向8ビットバスです。

  • BF (ビジーフラグ): LCDコントローラーがビジー状態にあるときはDB7に1が立ってLCDコントローラーへの書き込みが禁止されます。ただし命令を書き込むごとに、ビジー状態の解消されるまで十分な時間待機することにしておけば、このBF信号はわざわざ読む必要がありません。

3. 命令セット

LCDコントローラーの命令セットを図H.2に示します。併せて、それぞれの解説と実行に要する最長時間とを示します。前述したようにキャラクターLCDは、どの命令も実行に十分に時間がかけられるよう低速クロックで駆動するのが一般的です。そうすればBFを読む必要がなくなるからです。たとえば500 Hzで駆動すれば各命令に2 msかけることが可能です。

図H.2に示した最長実行時間は、LCDコントローラーの内蔵オシレーターの発信周波数f_oscillatorを270 kHzで駆動した場合の時間です。電源電圧に応じて75 kΩ (VDD=3 V)~91 kΩ (VDD=5 V)の抵抗を外づけすれば270 kHzに設定されます。抵抗値を変えればおおむね100 kHz~500 kHzの範囲で変更できます。その場合、各命令の実行時間は270 kHz/f_oscillatorを乗じた値となります。

4. 文字生成ROM

LCDコントローラの文字生成ROM (CGROM)には、7×5ドットで表現された文字があらかじめ全部で192文字入っています(図H.3)。10×5ドットの文字も32文字入っています。7×5ドットの文字を使用する場合は、1文字に8×5ドットの領域が使われて2行表示ができます。10×5ドットの文字を使用する場合は、1文字に11×5ドットの領域が使われて1行表示となります。ユーザーが自分で独自の文字を定義することも可能であるため、たとえば16×5ドットの領域を利用した文字なども表示できます。

5. LCDコントローラーの初期化手順

LCDコントローラの初期化方法は2つあります。1つは電源投入時に自動的に初期化する方法です。もう1つは命令によって初期化する方法です。電源の状態が自動初期化に見合わない場合や確実性を保ちたい場合は、命令によって初期化する方法を使用します。手順は以下のとおりです。常にR/W=0、RS=0です。また"-"はドントケアの意味です。

  1. 電源を入れます。
  2. VDDが4.5 Vに達したあとさらに15 ms以上待ちます。
  3. Function set命令DB=0011----を実行します。
  4. 4.2 ms以上待ちます。
  5. Function set命令DB=0011 N F --を実行します(N、Fには希望の値を入れる)。
  6. Display on/off control命令DB=00001000を実行します。
  7. Clear display命令DB=00000001を実行します。
  8. Entry mode set命令DB=000001 I/D Sを実行します (I/D、Sには希望の値を入れる)

(互換LCDコントローラーのなかにはもう少し簡単に初期化できるものもある)

6. LCDコントローラー用FSMの一般的な構成

図H.1のLCDに書き込むための一般的なFSMを図H.4に示します。Eのクロック周波数は500 Hz~600 Hz程度です。上側の囲みにある7つのステートが初期化シーケンスです(前述の初期化手順と比べてみてください)。下側の囲みにある2つのステートが、実際に文字を表示するアプリケーションシーケンスです。初期化の最中は命令レジスタへ書き込むのでRS=0にしておく必要があります。アプリケーションシーケンスでは、ReturnHomeステートを除いてRS=1にしてデータレジスターへ書き込まれるようにします。R/Wは図には示していませんが、書き込みしかしませんので常時Loにします。

初期化シーケンスではFunctionSetを3回繰り返していますが、これは単に4.2 ms以上という時間を費やすことだけが目的です。4回目のFunctionSetではN、Fの値を指定しなければなりません(今回の例では、2行表示なのでN=1、5×8ドット文字なのでF=0にしました。4回のFunctionSetは全部同じ値で構いません)。EntryModeステートではI/D=1 (DDRAMアドレスを自動インクリメント)、S=0 (表示シフトしない)にしました。

訳註:
I/D=1にすると、文字を表示するたびにカーソルが自動的に次の文字の位置へ移動する。S=1にすると、カーソルがLCDの右端に来てさらに文字を書き込んだときに表示が自動的にスクロールされる。

上のアプリケーションシーケンスの囲みに示した例は、クロック依存型FSMを使って8文字 (t=0~7)をLCDへ書き込んだあと、初期表示アドレスを戻ってその8文字を上書きします。図H.4のFSM全体は非常にシンプルであり、セクション3.15 (練習17.9)に示したポインタベース方式でも実現できます。

VHDLによる実装例はサンプル17.5に示しました。