NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

LCDの使い方(AE-AQM1602A)基礎編

I2C接続小型キャラクLCDモジュール(AE-AQM1602A)
 
 前回は文字をLCD(AE-AQM1602A)に表示しましたが、正直使い方がよく分かっていませんでした
 基本から勉強する為にも他のコマンドも含めてSDS仕様書を参考に推測で補完しながらまとめてみました
 このまとめだけでLCDが持つ機能の9割は使いこなせそうな気がします
※間違っていたらご指摘下さい

1. データとコマンドのWRITE方法

 LCD(AE-AQM1602A)にデータとコマンドを送る方法は図1が分かり易いです!
 詳細は以下①~⑧の通りです。
 
① スレーブアドレス(slave address)
 LCD(AE-AQM1602A)のスレーブアドレスは7ビットの2進数 0111110 + 0(R/W)で、これはArduino表現にすると0x3E(   1111110)となり、これを最初に送ります。
※補足② R/W
 LCDからREADする場合は「1」としますが、読み込み(READ)は出来ない(ACK※1は可)仕様なので「0」のみが入ります。

③ acknowledgement from ST7032i
 1バイト(8ビット)送信毎にST7032iからの了承信号ACK※1を受け取ります。
※1 ACK(アクノリッジ、英:ACKnowledge)通信における肯定的な応答で、一般には通信がエラーなく到達したことを示す信号。

④ コマンドワード(command word)=(⑤⑥⑦control byte+⑧data byte)
 ⑤ Co
   複数のコマンドワードを送る場合は「Co=1」、最終コマンドワード「Co=0」
   ※複数のコマンドワードを送る事はあまり無いので実質「Co=0」
 ⑥ RS
   コントロールバイトの後に続くデータバイトが、
   液晶のインストラクションコード(表1)を送る場合は「RS=0」
   液晶の表示データあるいはCGRAMのデータを送る場合は「RS=1」
 ⑦ コントロールバイト(control byte)
   「⑤(0)+⑥(0or1)+(000000)」を合わせた8ビットのデータ(control byte)
   を送ります
 ⑧ データバイト(data byte)
   RS=0の場合:表1に示す液晶への命令を8ビットのデータで送ります
   RS=1の場合:表2~4の内容から利用したい機能を8ビットのデータで送ります
 
イメージ 4
図1:Write mode

2. 2進数と16進数

 LCD(AE-AQM1602A)への基本的な命令は図2に示した3つです。
 プログラムする際には2進数で作った設定を16進数に直す必要が有ります。

イメージ 5
※0と1の部分は固定値
①スレーブアドレス  →  ⑦コントロールバイト  →  ⑧データバイト
※通信に必要なデータ
/*Arduino(マスター)からLCD(スレーブ)への上記データ送信例*/
 Wire.beginTransmission(0x3E);//①スレーブアドレスを送信しI2C通信開始
 Wire.write(0x00);                   //⑦コントロールバイト送信
 Wire.write(0x00);                   //⑧データバイト送信
 Wire.endTransmission();         //I2C通信終了
図2:命令の基本構成 重要

2.1 データバイトを2進数で作る
 データバイトが決まればスレーブアドレスもコントロールバイトも定まります。
 その為、最初に目的の命令に合わせたデータバイトを、表1~4を参考に8桁(D7~D0)の2進数(8ビット=1バイト)で作ります。

2.2 2進数から16進数に変換する
 作った1バイトの2進数をArduinoプログラムで記述する16進数に変換します。
 今回、2進数を16進数に変換するのに便利な「WEBツール」さんの下記サイトを使わせて頂きましたありがとう御座います!

2.3 作った命令を送る
 Arduino IDEでは標準でI2C通信に対応しており、上記で作った16進数の命令を図2の様に「Wite.write関数を使い送ります。

3. 補足資料

 以下ST7032」のSDSAW-AQM1602Aの仕様書より引用させて頂きました。

表1:インストラクション(液晶への命令) 重要!
命令
2進数コード(RS_b7,~,b0) 
16進数コード(使用範囲)
内容
※命令は図3の様に使用します (R/Wは全て0なので省略しました)
Clear Display
0_0,0,0,0,0,0,0,1
0x01
すべての表示データをクリアするには、すべてのDDRAMアドレスにCGRAMアドレス"20H"(表3より「00100000」16進数で「20」のスペースコード)を書き込み、DDRAMアドレスセット命令のAC※1に "00H"を書き込む。
Return Home
0_0,0,0,0,0,0,1,X
0x02~0x03
Return Homeは、カーソルをホームに返す命令です。DDRAMアドレスを "00H"に設定してください。
Entry Mode Set
0_0,0,0,0,0,1,I/D,S
0x04~0x07
カーソルと表示の移動方向を設定します。
I/D(増大/減少)
High:カーソル/ブリンクが右に移動し、DDRAMアドレスが1増加します。
Low:カーソル/ブリンクが左に移動し、DDRAMアドレスが1減少します。
S(ディスプレイ全体のシフト)
Low:のとき、表示全体のシフトは行われません。
High:DDRAM書き込み動作時には、I / D値(I / D = "1"左シフト、I / D = "0":右シフト)。
Display ON/OFF
0_0,0,0,0,1,D,C,B
0x08~0x0f
制御表示/カーソル/点滅ON / OFF 1ビットレジスタ
D(表示ON / OFF制御)
High:ディスプレイ全体が点灯します。
Low:表示はオフになりますが、表示データはDDRAMに残ります。
C(カーソルON / OFF制御)
High:カーソルがオンになります。
Low:カーソルは現在の表示で消えますが、I / Dレジスタはそのデータのままです。
B(カーソル点滅ON / OFF制御)
High:カーソルの点滅がオンになり、すべてのハイデータとディスプレイの間で交互に実行されますカーソル位置の文字。
Low:点滅は消灯します。
Cursor or Display Shift
0_0,0,0,1,S/C,R/L,X,X
0x10~0x1f
表示データの書き込みや読み出しを行わずに、左右のカーソル位置や表示を移動させます。
S/C(画面/カーソル選択)
High:画面はR / Lビットで制御されます。
Low:カーソルはR / Lビットで制御されます。
R/L(右/左)
High:方向を右に設定します。
Low:方向を左に設定します。
Function Set
0_0,0,1,DL,N,DH,0,IS
0x20~0x3d
DL(インタフェースデータ長制御)
High:MPU
※2付きの8ビットバスモードを意味します。
Low:MPU※2付きの4ビットバスモードを意味します。つまり、DLは8ビットまたは4ビットを選択する信号ですバスモード。4ビットバスモードでは、4ビットデータを2回転送する必要があります。
N(表示行数制御)
High:2ライン表示モードになります。
Low:1ライン表示モードを意味します。
DH(2行高フォント制御)
High(N=Low):表示フォントは高さモード(5x16ドット)、RAMアドレス00H~27Hしか使用できません。
High(N=High)のときは禁止されます。
Low:表示フォントは通常(5x8ドット)です。
IS(標準/拡張命令選択)
High:拡張命令を選択する(拡張命令テーブル参照)
Low:通常の命令を選択します(通常の命令テーブル参照)
Set CGRAM Address
0_0,1,AC5,AC4,AC3,AC2,AC1,AC0
0x40~0x7f
CGRAM※3アドレスセット
この命令は、CGRAMデータをMPUから利用可能にします。(表2,図4参照)
Set DDRAM Address
0_1,AC6,AC5,AC4,AC3,AC2,AC1,AC0
0x80~0xff
DDRAM※4アドレスセット
この命令は、DDRAMデータをMPUから利用可能にします。(表4,図4参照)
1ライン表示モード(N=0):DDRAMアドレスは "00H"から "4FH"になります。
2ライン表示モード(N=1):1ライン目のDDRAMアドレスは "00H"~ "27H"であり、2行目のDDRAMアドレスは "40H"から "67H"までです。
※補足です(表2~4と組合せて使います)
Write Data to CG,DD,ICON RAM 
1_D7,D6,D5,D4,D3,D2,D1,D0
0x00~0xff
文字パターン・コードの書込み
 上記アドレスセット命令によって設定した場所へ文字コード(DDRAM Data)(表3)や文字パターン(CGRAM Data)(図4,
表2)をD7~D0(8bit)で書き込みます。 
 RAMセット命令はまた、AC
※1方向をRAMに転送します。書き込み動作の後、アドレスは入力モードに従って自動的に1ずつ増減します。
※1:ACとは、アドレスカウンタ(図4参照)
※2:MPUとは、マイクロプロセッサ
※3:CGRAM(Character Generator RAM)とは、自由に文字を作り保存する機能
 CGRAMでは、ユーザはプログラムによって文字パターンを書き換えることができます。 5×8ドットの場合、8文字パターンを書くことができます。
 コードテーブルの左欄に示すアドレスに文字コードをDDRAMに書き込みます表3を参照して、CGRAMに格納されている文字パターンを表示します。
 CGRAMアドレスとデータおよび表示パターンとの関係については、表2を参照してください。そうでない区域は一般的なDDRAMとして表示用に使用できます。
※4:DDRAM(Display data RAM)とは、LCDに表示するデータを保存する機能
 DDRAMは、8ビットの文字コードで表される表示データを格納します。その拡張容量は80文字です。表示に使用されないDDRAMの領域は一般的なデータRAMです。
 DDRAMアドレスとLCD上の位置の関係については、図7を参照してください。
 DDRAMアドレス(ADD)はアドレスカウンタ(AC)に16進数で設定されます。
 
イメージ 6
図3:LCD初期化の実行例
 
イメージ 7
図4:DDRAMアドレス

表2: 文字コード(DDRAM Data)、CGRAMアドレス、文字パターン(CGRAM Data)の関係
イメージ 3 
 
表3:文字コード(DDRAM Data)と文字パターン(CGRAM Data)の対応
イメージ 1
※列項目:x,x,x,x:b7,b6,b5,b4 行項目:x,x,x,x:b3,b2,b1,b0
※例:文字パターン「ア」の文字コードは「10110001」で「0xB1」です
CGRAMアドレスに指定出来るのは「0000」列の「0000~0111」行までの8文字
1文字目:「00000000」は「0x00」
2文字目:「00000001」は「0x01」
3文字目:「00000010」は「0x02」
4文字目:「00000011」は「0x03」
5文字目:「00000100」は「0x04」
6文字目:「00000101」は「0x05」
7文字目:「00000110」は「0x06」
8文字目:「00000111」は「0x07」

表4:2行×16文字の表示とDDRAMアドレスの対応
イメージ 2

3. まとめ

 まとめたらなんとか使い方が分かってきました
 特に図2と表1が基本です!
 これでLCDを使った実験が色々出来そうです!
 

〇2018年1月23日追記

 本文中「1.④.⑦」の記述に誤りが見つかりましたので訂正致しました。

 

表5:正誤表

正:⑤(0)+⑥(0or1)+(000000)を合わせた8ビットのデータで送ります

誤:⑤⑥とLCDに送る命令(表1参照)を合わせた8ビットのデータで送ります

 

 表1のインストラクション(液晶への命令)は「control byte」ではなく「data byte」でした大変失礼致しました。

 uraraさんご指摘下さいまして誠に有難う御座いました。

 

※以下補足です

①スレーブアドレス

 BIT:       |b7|b6|b5|b4|b3|b2|b1|b0|

 slave address:| 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |

 0~7bは実質固定なので、スレーブアドレスは「0x3E」です。

//ArduinoIDE記入例 
Wire.beginTransmission(0x3E);//スレーブアドレスを指定

 

⑦コントロールバイト

 BIT:       |b7|b6|b5|b4|b3|b2|b1|b0|

 control byte: |CO|RS| 0 | 0 | 0 | 0 | 0 | 0 |

 b6~7は「0or1」設定可で、b0~5は「0」のみが入ります。

 複数のコマンドワードを送る事はあまりないので実質「b7=0」

 とすれば、コントロールバイトで使う変数はb6のみになるので「0x00」もしくは「0x40」です。

//ArduinoIDE記入例 
Wire.write(0x00);//コマンド書き込み
Wire.write(0x40);//データ書き込み

 

⑧データバイト

 BIT:        |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |

 data byte:  |D7 |D6 |D5 |D4 |D3 |D2 |D1 |D0 |

 ⑦で指定した「コマンド」か「データ」に対応するデータを

 b0~7に設定します。

 

〇参考:ディスプレイの特定の位置(行列)にデータを書き込むアドレス指定方法

①スレーブアドレスを指定→⑦コントロールバイトで「コマンド」書き込みに→⑧データバイトで「Set DDRAM Address」を以下の通り指定する。

 BIT:         | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |

 DDRAMAddress: |  1  |AC6|AC5|AC4|AC3|AC2|AC1|AC0|

 ※b7は「1」で固定、b0~6は「0or1」設定可です。

 0x80が一行目先頭で、0x80+0x40(0xC0)が2行目先頭です。

 参考に2行目2文字目にセットするのは以下の通りです。

//ArduinoIDE記入例 
Wire.beginTransmission(0x3E);//①スレーブアドレスを指定
Wire.write(0x00);//⑦コマンド書き込み
Wire.write(0xC1);//⑧DDRAMアドレスを2行目2文字目にセット
Wire.endTransmission();delay(10);//I2C通信終了

以上

2018年1月23日_誤り訂正内容
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【LCDの使い方】目次に戻る