LCDドライバHD44102CHの使い方
ドットマトリクスLCDカラムドライバのHD44102CHはコモンドライバと併用することで、とても簡単にLCDの表示を制御することができます。
HD44102CH
カラムドライバHD44102CHはIC1つあたり50ドットまで出力でき、50 × 32ビットのRAMを持っています。
HD44105H
HD44102CHとペアで使用するコモンドライバには、HD44103CHやHD44105Hなどがあります。
HD44103CHはIC1つあたり20ドットまで、HD44105HはIC1つあたり32ドットまで出力できます。
また、カラムドライバは並列つなぎにして使用し、より大きなLCDを制御できるようです。
・HD44102CHとHD44105Hをそれぞれ1ずつ使うと50 × 32までのLCD
・HD44102CHを10個、HD44105Hを1個使うと500 × 32までのLCD
カラムドライバはRAMを持っており、また、コモンドライバ側で走査制御を行います。
マイコン側で走査制御をする必要がありません。
このカラムドライバの最大の魅力です。
コモンドライバも数珠つなぎにして使用できるようですが、画素のデータ保持はカラムドライバのみで行っているため、コモンドライバごとにカラムドライバRAMを書き換えが必要になります。
・HD44102CHを1個、HD44105Hを2個使うと50 × 64までのLCD
・HD44102CHを2個、HD44105Hを2個使うと100 × 64までのLCD
・HD44102CHを4個、HD44105Hを4個使うと200 × 128までのLCD
この構成の場合だとマイコン側は常にカラムドライバにデータを送り続けなければいけません。
そこで、コモンドライバを常に1つのみ使用し、カラムドライバの個数を増やすことで
より多くのドット数のLCDを駆動する手法も使われます。
・HD44102CHを2個、HD44105Hを1個使うと50 × 64までのLCD
・HD44102CHを4個、HD44105Hを1個使うと100 × 64までのLCD
・HD44102CHを16個、HD44105Hを1個使うと200 × 128までのLCD※
※カラムドライバを四段使いにするのはLCDの内部配線上、非現実的なので、
実用上は2段まででしょう。
ここまで読んでくれた方はピンときたでしょう。
基本的にコモンドライバはRAMを持っていないため、マイコンからの制御は必要ありません。
コモンドライバは発振回路を持っており、自動的にLCDのロウを順次選択し、カラムドライバへLCD出力要求信号をだします。
そのため、カラムドライバのみへ制御信号を与えてあげれば、LCDに好きな文字や絵などを描画できます。
なので今回はカラムドライバHD44102CHの制御方法に要点をあてていきます。
ほとんどの方は、HD44102CHが使われているLCDを制御したいということだと思うのでLCD周りの回路構成は説明しません。
・制御方法
HD44102CHは複数のレジスタを持っています。コマンドを与えることでレジスタの読み書きができます。
ドットデータを保持するRAM(ディスプレイデータRAM)は50 x 32ビットあります。
8 x 50 を一つのページとしたものが4つあります。
ページアドレス(0~3)とカラムアドレス(0~49)を指定して、8ビットのドットデータを送信します。
・端子の種類
ピン番号 |
端子名 |
入出力 |
機能 |
詳細 |
50~57 |
DB0~DB7 |
I/O |
データバス |
データバスです。 |
47 |
E |
I |
イネーブル |
R/WがLの時、この端子がH→Lなると、 データバスの状態がHD44102CHのレジスタへラッチされます。 また、R/WがHの時、この端子がHになると、 HD44102CHのレジスタの状態がデータバスへ 出力されます。 |
48 |
R/W |
I |
R/W選択 |
R/WがLの時、HD44102CHへ書き込み、 R/WがHの時、HD44102CHから読み込み になります。
|
49 |
D/I |
I |
データ/ コントロール選択 |
D/IがLの時、コントロールレジスタへアクセス、 D/IがHの時、ディスプレイデータRAMへアクセス になります。
|
44~46 |
CS1~CS3 |
I |
チップセレクト |
CS1 |
CS2 |
CS3 |
機能 |
L |
L |
L |
非チップセレクト |
L |
L |
H |
非チップセレクト |
L |
H |
L |
非チップセレクト |
L |
H |
H |
読み書き有効 |
H |
L |
L |
書き有効 |
H |
L |
H |
R/W |
H |
H |
L |
R/W |
H |
H |
H |
読み書き有効 |
|
43 |
RST |
I |
リセット |
RSTがLの時、リセットされます。 |
42 |
BS |
I |
バスセレクト 信号 |
BSがLの時、データバスは8ビットモードになり、 BSがHの時、データバスは4ビットモードになり ます。(DB4~DB7を使用)
|
・レジスタ
次にHD44102CHのレジスタを見ていきましょう。
HD44102CHのレジスタは大まかに分けて2つの種類があります。
1つはドットデータを保持するディスプレイデータRAM、もう一つはHD44102CHの制御にかかわるコントロールレジスタです。
ディスプレイデータRAMの読み書きでは、コントロールレジスタで指定した
ページアドレス(0~3)とカラムアドレス(0~49)のデータを読み書きをします。
コントロールレジスタの場合は、読み書きでレジスタの意味合いが違うので注意が必要です。
・ディスプレイデータRAMの読み書き時
R/W |
D/I |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
機能 |
1 |
1 |
MSB |
~ |
~ |
~ |
~ |
~ |
~ |
LSB |
HD44102CHから読み込み (HD44102CH→MCU) |
0 |
1 |
MSB |
~ |
~ |
~ |
~ |
~ |
~ |
LSB |
HD44102CHへ書き込み (MCU→HD44102CH) |
・コントロールレジスタから読み取り時
コントロールレジスタから読み取り命令があった時、HD44102CHは内部にもつステータスレジスタの内容をデータバスへ出力します。
ステータスレジスタはHD44102CHの状態を示すフラグレジスタであり、4つの種類があります。
|
R/W |
D/I |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
1 |
0 |
BUSY |
UP/DOWN |
OFF/ON |
RESET |
0 |
0 |
0 |
0 |
概要 |
|
|
ビジーフラグです。
H:ビジー状態 L:スタンバイ
各種レジスタに データを書き込む際、 このフラグを チェックしてから 書き込まなければ いけません。 |
アップダウン ステータス フラグです。
H:アップモード L:ダウンモード
カラムアドレス レジスタの カウント方向です。 連続してドット データを読み書き する際に、 自動的に次に選択される カラムアドレス 方向を示します。 |
ディスプレイのON/OFFの状態 を示します。
H:OFF L:ON
|
リセットフラグです。
H:リセット状態 L:スタンバイ |
0 |
0 |
0 |
0 |
・コントロールレジスタへ書き込み時
コントロールレジスタは4つの種類があります。
①ディスプレイデータRAMアドレスレジスタ(8bit)
②ディスプレイON/OFFレジスタ(1bit)
③カラムアドレスアップダウン指定レジスタ(1bit)
④ディスプレイスタートページ(2bit)
この4つうち、①と④は書き込み専用で読み取りは一切できません。
②と③は上記「コントロールレジスタから読み取り時」のフラグビットとして読み取りができます。
R/W |
D/I |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
機能 |
0 |
0 |
XA1 |
XA0 |
YA5 |
YA4 |
YA3 |
YA2 |
YA1 |
YA0 |
ページアドレス(XA0~XA1)とカラムアドレス(YA0~YA5) をセットする。 YAは0(B000000)~49(B110001)までの数値でなければならない。
|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
VB |
ディスプレイON/OFF VB=H:ON VB=L:OFF |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
CB |
カラムアドレスカウント方向 CB=H:アップモード CB=L:ダウンモード |
0 |
0 |
XA1 |
XA0 |
1 |
1 |
1 |
1 |
1 |
0 |
ページアドレスXA をスタートページとしてセット する。
|
・制御の流れ(レジスタの読み書き)
それでは具体的にどのようにHD44102CHへコマンドを渡すかを見ていきましょう。
まず、8ビットデータバスモードでのHD44102CHのレジスタを読み書きする手順を示します。
・読み込み(8ビットデータバスモード BS=L)
①CS1=L、CS2=H、CS3=H、R/W=H、D/I=[L:コントロールレジスタ,H:ディスプレイデータRAM]にセットする。
↓
②E=Hにセットすると、データバスへデータが出力される。
↓
③E=Lにセットし、データバスをハイインピーダンスにする。
・書き込み(8ビットデータバスモード BS=L)
①CS1=L、CS2=H、CS3=H、R/W=L、D/I=[L:コントロールレジスタ,H:ディスプレイデータRAM]にセットする。
↓
②E=Hにセットする(何もおこらない)
↓
④E=Lにセットすると、データバスのデータがHD44102CHの内部レジスタへラッチされる。
書き込み(8ビットデータバスモード BS=L)
赤ラインの地点でHD44102CHの内部レジスタへラッチされます。
4bitデータバスモードでのコントロールの場合は、8ビットのデータを2回に分けて読み書きする必要があります。
ただし、コントロールレジスタの読み取り時のみ、1回分のデータ(4ビット)のみの読み取りで済みます。
・読み込み(4ビットデータバスモード BS=H)
①CS1=L、CS2=H、CS3=H、R/W=H、D/I=[L:コントロールレジスタ,H:ディスプレイデータRAM]にセットする。
↓
②E=Hにセットすると、データバス[DB7~DB4]へデータ[D7~D4]が出力される。
↓
③E=Lにセットし、データバスをハイインピーダンスにする。もし、D/I=L(コントロールレジスタ)が選択されていたらここで処理は終了。
↓
④E=Hにセットすると、データバス[DB7~DB4]へデータ[D3~D0]が出力される。
↓
⑤E=Lにセットし、データバスをハイインピーダンスにする。
・書き込み(4ビットデータバスモード BS=H)
①CS1=L、CS2=H、CS3=H、R/W=L、D/I=[L:コントロールレジスタ,H:ディスプレイデータRAM]にセットする。
↓
②E=Hにセットする(何もおこらない)
↓
③DB7~DB4=任意のデータ[D7~D4]をセットする。
↓
④E=Lにセットする
↓
⑤E=Hにセットする(何もおこらない)
↓
⑥DB7~DB4=任意のデータ[D3~D0]をセットする。
↓
⑦E=Lにセットすると、データバスのデータがHD44102CHの内部レジスタへラッチされる。
・制御の流れ(LCDの表示)
ここまで来ればあとはHD44102CHへコマンドとデータを順番に送りつけるだけです。
では、具体的にLCDへの描画プロセスを追ってみましょう。
試しにLCDのページ1("B01")のカラム10("B001010")へデータ"B10000000"を描画してみます。
LCDは50 x 32 で、HD44102CHとHD44105Hをそれぞれ1ずつ使う構成とします。
①ビジーフラグのチェック (コントロールレジスタの読み取りを行った際、D7=Lになるまでこの作業を繰り返します。)
↓
②ディスプレイOFF (コントロールレジスタにデータ"B00111000"を書き込む)
↓
③ビジーフラグのチェック
↓
④ページアドレスXAとカラムアドレスYAのセット
(コントロールレジスタにデータ"B[XA1,XA0,YA5,YA4,YA3,YA2,YA1,YA0]"を書き込む。今回はページ1("B01")のカラム10("B001010")を指定するので、"B01001010"を書き込めばよい)
⑥描画データをセット (ディスプレイデータRAMに今回描画したいデータ"B10000000"を書き込む)
↓
⑧スタートページアドレスXAのセット
(コントロールレジスタにデータ"B[XA1,XA0,1,1,1,1,1,0]"を書き込む。基本的にスタートページアドレスは0でよいので、"B00111110"を書き込めばよい)
⑩ディスプレイON (コントロールレジスタにデータ"B00111001"を書き込む)
これでめでたくLCDのページ1("B01")のカラム10("B01010")へデータ"B10010110"を描画
出来たかと思います。座標で言うと(X,Y)=(10,8)に点を描画したことになります。
※(X=0~49、Y=0~31)です。
ここでスタートページアドレスについて疑問に思われた方もいると思います。
スタートページアドレスとはいわばLCDの一番上に描画されるページ番号みたいなものです。
今回の場合だとスタートページアドレスはページ0を指定しているため、ページ1は上から2番目に表示されます。(上からP0→P1→P2→P3の順で表示)
もし、スタートページアドレスがページ1を指定した場合、ページ1は上から1番目に表示されます。(上からP1→P2→P3→P0の順で表示) 今回の例ですと、座標(X,Y)=(10,0)に点が描画されます。
このスタートページアドレスの指定機能は50 x 8 や、50 x 16 のLCDで本領を発揮できます。
表示しきれないRAM部分に描画データを保管・瞬時にページ切り替えができるため、別のパターンの描画の描画切り替えが楽に行えます。
・制御の流れ(描画データの連続転送)
ほとんどの場合、描画データは連続したアドレスで読み書きするでしょう。この時いちいちページアドレスとカラムアドレスのセットを行うのは処理コストがかかるので合理的ではないです。
そこで、HD44102CHは、ディスプレイデータRAMの読み書きが行われた際に自動的に次のカラムアドレスのセットが行われる機能が備わっています。
カラムアドレスがインクリメントするかデクリメントするかは、カラムアドレスカウント方向レジスタで指定します。
試しにLCDのページ1("B01")のカラム10("B001010")からカラム17("B010001")へデータ"B10000000"を描画してみます。
LCDは50 x 32 で、HD44102CHとHD44105Hをそれぞれ1ずつ使う構成とします。
①ビジーフラグのチェック (コントロールレジスタの読み取りを行った際、D7=Lになるまでこの作業を繰り返します。)
↓
②ディスプレイOFF (コントロールレジスタにデータ"B00111000"を書き込む)
↓
③ビジーフラグのチェック
↓
④カラムアドレスカウント方向レジスタのセット
(コントロールレジスタにデータ"B0011101[CB]"を書き込む。今回はアップカウントモードで使用するので、"B00111011"を書き込めばよい)
↓
⑤ビジーフラグのチェック
↓
⑥ページアドレスXAとカラムアドレスYAのセット
(コントロールレジスタにデータ"B[XA1,XA0,YA5,YA4,YA3,YA2,YA1,YA0]"を書き込む。今回はページ1("B01")のカラム10("B001010")を指定するので、"B01001010"を書き込めばよい)
⑧描画データをセット (ディスプレイデータRAMに今回描画したいデータ"B10000000"を書き込む)
↓
"⑦"と"⑧"をあと7回繰り返す。(ページアドレスXAとカラムアドレスYAのセットは不要)
↓
⑩スタートページアドレスXAのセット
(コントロールレジスタにデータ"B[XA1,XA0,1,1,1,1,1,0]"を書き込む。基本的にスタートページアドレスは0でよいので、"B00111110"を書き込めばよい)
⑫ディスプレイON (コントロールレジスタにデータ"B00111001"を書き込む)
・例
さて、それでは実物のLCDへ描画してみましょう。
今回使用するLCDモジュールはシャープの書院「WD-A30」に内蔵されているF5208SCです。
構成はD44102CHを6個、HD44105Hを1個となっています。
LCDドライバの構成上は300 × 32のLCDなのですが、実際には矢印や電池マークなどが入ったカスタムLCDとなっています。
このLCDはD44102CH 1つあたりのカラムアドレスが0~47までと、全部で50ラインあるはずが48ラインまでとなっています。2進数で表すと"B110000"ラインであり、わりときりが良い数になっています。おそらくMCUでの制御がしやすいように2ライン犠牲にしたのでしょう。
LCD側のカラムアドレスはHD44102CH側のカラムアドレスの2*Nずつで連続しています。
LCD表示縦ラインのアドレス(表示面を左から順番に数えたライン順)
[1],[2],[3],[4],[5],[6],…,[42],[43],[44],[45],[46],[47]
HD44102CH側
[1],[24],[2],[25],[3],[26],…,[21],[45],[22],[46],[23],[47]
ほかにもページの順番が変則的だったりしているので、これらを1つの図にまとめました。
図を見てもらえばわかりますが、このLCDをドットマトリクスLCDとして利用すると、288 × 31ドット分描画できます。
・ピンアサイン
ピン番号 |
端子名 |
入出力 |
機能 |
詳細 |
1 |
DB0 |
I/O |
データバス |
データバスです。 |
2 |
DB1 |
I/O |
データバス |
データバスです。 |
3 |
DB2 |
I/O |
データバス |
データバスです。 |
4 |
DB3 |
I/O |
データバス |
データバスです。 |
5 |
DB4 |
I/O |
データバス |
データバスです。 |
6 |
DB5 |
I/O |
データバス |
データバスです。 |
7 |
DB6 |
I/O |
データバス |
データバスです。 |
8 |
DB7 |
I/O |
データバス |
データバスです。 |
9 |
CS3_0 |
I |
チップセレクト0 |
IC0のチップセレクトです。画面左端 H:IC0選択 L:IC0未選択 |
10 |
CS3_1 |
I |
チップセレクト1 |
IC1のチップセレクトです。 H:IC1選択 L:IC1未選択 |
11 |
CS3_2 |
I |
チップセレクト2 |
IC2のチップセレクトです。 H:IC2選択 L:IC2未選択 |
12 |
CS3_3 |
I |
チップセレクト3 |
IC3のチップセレクトです。 H:IC3選択 L:IC3未選択 |
13 |
CS3_4 |
I |
チップセレクト4 |
IC4のチップセレクトです。 H:IC4選択 L:IC4未選択 |
14 |
CS3_5 |
I |
チップセレクト5 |
IC5のチップセレクトです。画面右端 H:IC5選択 L:IC5未選択 |
15 |
D/I |
I |
データ/ コントロール選択 |
D/IがLの時、コントロールレジスタへアクセス、 D/IがHの時、ディスプレイデータRAMへアクセス になります。 |
16 |
R/W |
I |
R/W選択 |
R/WがLの時、HD44102CHへ書き込み、 R/WがHの時、HD44102CHから読み込み になります。 |
17 |
RST |
I |
リセット |
RSTがLの時、リセットされます。 常時Hにしておきます。 |
18 |
E |
I |
イネーブル |
R/WがLの時、この端子がH→Lなると、 データバスの状態がHD44102CHのレジスタへラッチされます。 また、R/WがHの時、この端子がHになると、 HD44102CHのレジスタの状態がデータバスへ 出力されます。 |
19 |
VCC |
- |
電源 |
電源です。 5V印加します。 |
20 |
GND |
- |
GND |
グランドです。 |
21 |
VEE |
- |
液晶駆動電源 |
液晶を駆動させるための電源です。 -3.3V~-6.0V印加します。 電圧を変化させることでコントラストを調整します。 |
描画の流れはこんな感じです。
①6つのHD44102CHのスタートページアドレスを0にセット
↓
②6つのHD44102CHのカラムアドレスカウンタをアップモードにセット
↓
③6つのHD44102CHのディスプレイOFF
↓
④6つあるHD44102CHに1つずつ描画データを転送
↓
⑤6つのHD44102CHのディスプレイON
↓
"③"へ
・プログラム
ArduinoでF5208SCを駆動するためのサンプルプログラムです。
文字の描画とライフゲームができます。
ATmega2560で描画することができます。(ATmega328pだとRAM容量の都合上、うまくいかないかも)