2016年04月13日 | 公開。 |
ST7565Rには全部で25種類のコマンドがあります。しかし、AQM1248Aを制御する際に理解している必要のあるコマンドはごく一部で、AQM1248Aからは利用できないコマンドや、内容を理解せずにサンプルコードをそのまま使えばいいコマンドなどもあります。
AQM1248Aを使う際に必ず理解しておくべき4種類のコマンドを表6に、理解している事が好ましい3種類のコマンドを表7に、理解する必要性の少ない18種類のコマンドを表8にまとめました。
これらの中で、表8はあまり重要な表ではないので、参考に眺める程度で構いません。(重要でない表が詳しく書かれているのは、この表が筆者の備忘録を兼ねているため)
種類 | コマンドの名称 | 備考 |
---|---|---|
書き込むデータのアドレスの設定 |
|
|
データの書き込み |
|
1バイトのビットマップデータを書き込む。前のページの「コマンドとデータ」の項では、データの書き込みとコマンドの発行を区別して説明したが、ST7565のデータシートでは、データの書き込みもコマンドの一種として扱われているので、この表にはコマンドとして掲載する。 |
種類 | コマンドの名称 | 備考 |
---|---|---|
コントラスト調整 |
|
これらのコマンドは、液晶のコントラスト調整の際に使う。 |
種類 | コマンドの名称 | 備考 |
---|---|---|
ユーザーが使ってはいけないコマンド |
|
ST7565Rの出荷時検査に使われるコマンド。コマンドの詳細は明らかになっていない。ユーザーが使う事は禁止されている。 |
特に何も効果がないコマンド |
|
NOPコマンドを発行しても、通常は何も起こらない。なぜNOPコマンドがあるのかは分らないが、プログラム開発時に使うものだろうか?ユーザーにとって、唯一NOPコマンドに価値があるのは、誤ってTestコマンドを発行した後の、取り消し用だと思われる。(その用途でも、Resetコマンドで代用できる) |
AQM1248Aでは使えないコマンド |
|
|
初期化シーケンスの中で使い、かつオペランドが決まっているコマンド |
|
これらのコマンドのオペランドは、AQM1248Aの内部回路の構成(使用する液晶パネルや電源回路など)によって決まっている。ユーザーが勝手に変更できないので、コマンドやオペランドの内容を理解する必要がない。AQM1248Aの推奨初期化シーケンス内にこれらのコマンドが出てくるが、何も考えずに推奨のシーケンスをコピー&ペーストすればよい。(Booster ratio setコマンドは推奨初期化シーケンスに出てこないが、これは設定をデフォルト値から変更する必要がないため) |
初期化シーケンスに使う他は、特殊な用途でしか使用しないコマンド |
|
|
この記事では、表6と表7に示した、理解しておくべき、あるいは理解しておく事が好ましいコマンドに限って詳しく説明します。その他のコマンドについては、ST7565Rのデータシートを参照してください。
VRAMの特定のバイトに縦方向に8ピクセルのビットマップデータを書き込むには、まず、ページアドレスとカラムアドレスを指定し、その後、データを書き込みます。
ページアドレスの指定には、Page address setコマンドを使います。表9にPage address setコマンドのフォーマットを示します。
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 1 | 0 | 1 | 1 | A11 | A10 | A9 | A8 |
上位4ビットを1011B(末尾のBは2進数であることを示す)にすれば、そのコマンドはPage address setコマンドだと解釈されます。下位4ビットがオペランド(コマンドの引数、パラメータ)でページアドレスを指定します。
例えば、ページ3を指定するなら、3は2進数で0011Bなので、10110011B(B3H)のコマンドを発行する事になります。
表9の下位4ビットがA11~A8になっているのは、7ページの図42の表記に合わせて、ページアドレスの最上位ビットをA11、最下位ビットをA8としたためです。
Page address setコマンドでページアドレスを指定すると、それ以降、データを書き込む時に、VRAM内の指定したページに書き込まれます。
カラムアドレスを指定するコマンドは2種類あります。カラムアドレスの上位4ビットを指定するColumn address set upper bitコマンドと、カラムアドレスの下位4ビットを指定するColumn address set lower bitコマンドです。
コマンドの上位何ビットかでコマンドの種類を判断するのですが、カラムアドレス自体が8ビットあるので、8ビットのコマンドの中に8ビットのカラムアドレスを埋め込んでしまうと、コマンドの種類を判断するためのビットが用意できなくなります。そこでカラムアドレスの上位4ビットと下位4ビットを、別のコマンドで指定する事になっています。
Column address set upper bitコマンドのフォーマットを図10に、Column address set lower bitコマンドのフォーマットを図11に示します。
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 0 | 0 | 0 | 1 | A7 | A6 | A5 | A4 |
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 0 | 0 | 0 | 0 | A3 | A2 | A1 | A0 |
表10と表11のA7~A0は、7ページの図42のA7~A0に対応しています。A7~A4がカラムアドレスの上位4ビットで、A3~A0がカラムアドレスの下位4ビットです。
例えば、カラムアドレスを10進数の75に指定したければ、75を2進数にすると01001011Bになるので、00010100B(14H)と00001011B(0BH)の2つのコマンドを発行すればいい事になります。
Column address set upper bitコマンドとColumn address set lower bitコマンドの順序は逆でも構いません。またカラムアドレスの上位4ビットか下位4ビットのいずれかだけ変更したければ、発行するのは、片方のコマンドだけでも構いません。
カラムアドレスを指定した後に8ビットのデータを書き込めば、VRAMの指定したカラムアドレスにデータが書き込まれ、カラムアドレスが1つ進みます。(自動インクリメント)
よって、ページアドレスが同じで、カラムアドレスが連続した複数のバイトを書き込む場合は、最初にページアドレスと、カラムアドレスの一番若い値を指定し、データを左から右に順に書き込んでいけば、全てのデータの書き込みができます。1バイトデータを書き込むごとにアドレスを指定しなくてもいいので、データの書き込みが高速になります。
先ほど、データを書き込めばカラムアドレスが自動インクリメントするといいましたが、カラムアドレスが131に達している場合は、自動インクリメントが行われません。(ただしAQM1248Aを使う場合は、通常カラムアドレスが0~127の範囲にしかデータを書き込まないので、この事はあまり気にする必要はありませんが)
また、ページアドレスには自動インクリメントがありませんので、Page address setコマンドで指定し直す(あるいはソフトウェアリセットを掛ける)までは、ページアドレスは変化しません。
ST7565Rはコントラスト調整に必要な電圧を発生する電源回路を内蔵しています。AQM1248Aは、そのST7565R内蔵の電源回路を用いて、コントラスト調整をするようになっています。コントラスト調整は、表7に示した3つのコマンドを用いて行います。
参考:余談ですが、ST7565Rは、内蔵の電源回路を使わずに、外部電源で液晶パネルを駆動する設計にも対応できるようになっています。そのため、ST7565Rを用いた液晶モジュールが全て表6のコマンドでコントラスト調整を行う訳ではなく、半固定抵抗を回してコントラスト調整を行う液晶モジュールがあるかも知れません。
表7のコマンドの意味を正確に理解するには、ST7565Rに内蔵している電源回路の構造について知る必要があります。そのためには、アナログ回路の知識が必須になります。
ここでは、コマンドの正確な意味を説明することなく、コントラスト調整に必要な知識のみを説明する事にします。
簡単に言うと、V0 voltage regulator internal resistor ratio setコマンドはコントラストの粗調整(大雑把な調整)に使います。一方で、Electronic volume mode setコマンドとElectronic volume register setコマンド(これらのコマンドは必ず組で使われる)は、コントラストの微調整に使われます。
なお、コマンドの名称が長いので、この記事では、V0 voltage regulator internal resistor ratio setコマンドをV0コマンド、Electronic volume mode setコマンドをEVMSコマンド、Electronic volume register setコマンドをEVRSコマンドと略して表記させていただきます。(なお、これらの略称は、ST7565Rのデータシートで使われている訳ではありません)
Arduinoに接続する場合は、通常3.3Vの電源でAQM1248Aを動作させますが、電源電圧が一定なら、V0コマンドを使わずに、EVMSコマンドとEVRSコマンドの組だけでコントラスト調整が十分行えます。
V0コマンドのフォーマットを表12に示します。
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 0 | 0 | 1 | 0 | 0 | * | * | * |
V0コマンドは、先ほど説明した様にコントラストの粗調整を行いますが、下位3ビット(表12で*で表示されているビット)のオペランドにより調整を行います。オペランドが大きくなる方が、表示は濃くなります。
次に、EVMSコマンドとEVRSコマンドのフォーマットを、それぞれ表13にと表14に示します。
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
コマンドのビット(D7がMSB) | D7 | D6 | D5 | D2 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
各ビットの内容 | 0 | 0 | * | * | * | * | * | * |
EVMSコマンドにはオペランドがなく、10000001B(81H)と、コマンドの数値がひとつに決まっています。
このEVMSコマンドを実行するとコントラストの微調整モードに入ります。EVMSコマンドの直後は、表14のEVRSコマンドしか実行してはいけません。(他のコマンドを実行しても、正しく解釈されないでしょう)
EVRSコマンドの下位6ビット(表14の*で表示されているビット)のオペランドにより、コントラストを微調整します。オペランドが大きいほど、表示は濃くなります。
EVRSコマンドでコントラストの微調整値を設定すると、自動的にコントラストの微調整モードから抜け、他のコマンドを受け付けるようになります。
ところで、3ページのリスト1やリスト2には、InitializeLcdという関数があります。(リスト3参照) InitializeLcd関数は、AQM1248Aに付属する説明書に書いてある初期化シーケンス(初期化手順)を、そのまま関数にしたものです。
void InitializeLcd() { LcdCommand(0xae); LcdCommand(0xa0); LcdCommand(0xc8); LcdCommand(0xa3); LcdCommand(0x2c); delay(2); LcdCommand(0x2e); delay(2); LcdCommand(0x2f); LcdCommand(0x23); LcdCommand(0x81); LcdCommand(0x1c); LcdCommand(0xa4); LcdCommand(0x40); LcdCommand(0xa6); LcdCommand(0xaf); } // InitializeLcd
AQM1248A内部の回路の動作に興味がないなら、初期化シーケンスについて詳しく知っても大きなメリットがないので、ここでは詳しく述べません。単に「InitializeLcd関数をプログラムの最初におまじないとして呼べばよい」程度の認識でよいと思います。
ただし、初期化シーケンスの中にコントラスト調整をしている部分がありますので、その部分だけは、できれば理解しておく方が良いでしょう。
リスト3にはLcdCommandという関数が多数出てきます。LcdCommand関数は、引数の8ビットの数をコマンドとしてAQM1248Aに送信する関数です。(詳しくは後述)
赤色で示したLcdCommand(0x23);の部分は、V0コマンドを送信している部分になります。引数の23Hは、2進数に変換すると00100011Bですから、その内コマンドのオペランドとして解釈される下位3ビットは011B(10進数で3)です。
緑色で示したLcdCommand(0x81);の部分は、EVMSコマンドを送信している部分になります。
青色で示したLcdCommand(0x1c);の部分は、EVRSコマンドを送信している部分になります。引数の1CHは、2進数に変換すると00011100Bですから、その内コマンドのオペランドとして解釈される下位6ビットは011100B(10進数で28)です。
V0コマンド(赤色)とEVRSコマンド(青色)のオペランドを変更すれば、コントラストを調整できる事になります。
V0コマンドとEVRSコマンドのオペランドを変化させると、実際の画面の表示はどう変わるのでしょうか?ここでは実験により確かめてみたいと思います。
これからコントラストの設定を色々と変えた場合の画面写真をお見せしますが、写真撮影の条件が少し変わるだけでもコントラストが違った様に写る事があり、またお使いのパソコンやスマホの画面の特性によっても違って見えることがあるため、このページの写真は、あくまでも参考に程度にご覧ください。
このページの全ての画面写真は、Arduino Unoを用いて、6ページの図39の結線でAQM1248Aを動作させ撮影した物です。(つまりAQM1248Aの電源電圧は3.3V) また撮影時の室温は、おおよそ20℃です。
まずリスト1を変更せずに、そのまま実行した場合の画面写真を写真20に示します。この場合、コントラスト調整のためのコマンドは、23H(V0コマンド、オペランド3)、81H(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つです。
V0コマンドによるコントラストの変化を見るため、同コマンドのオペランドを1つ減らして2とし、22H(V0コマンド、オペランド2)、81H(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つのコマンドによりコントラスト調整をした場合の写真を、写真21に示します。
V0コマンドのオペランドを1つ小さくするだけで、表示がずいぶん薄くなっているのが分ると思います。写真は掲載しませんが、オペランドをもう1つ小さくして1にすると、完全に表示は消えてしまいます。
今度は反対に、写真20の状態からV0コマンドのオペランドを1つ増やして4にし、24H(V0コマンド、オペランド4)、81(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つのコマンドでコントラスト調整した場合の写真を、写真22に示します。
V0コマンドのオペランドを1つ大きくするだけで、表示がずいぶん濃くなり、ほとんど模様が観察できなくなっているのが分かると思います。(写真では分かりにくいが、肉眼ではうっすらと模様が確認できる) 写真は掲載しませんが、V0コマンドのオペランドをもう1つ大きくして4すると、完全に表示は黒くぶれてしまいます。
この様に、V0コマンドのオペランドを変化させると、コントラストがかなり粗く変化するため、微調整には全く使えない事が分かります。
次に、V0コマンドのオペランドは3に固定し、EVRSコマンドのオペランドを8、16、24、32、40と順に増やしていった場合の画面表示の変化を、写真23~写真27に示します。
この様に、EVRSコマンドを使えば、コントラストの微調整が行える事が分かります。
なお、液晶ディスプレイのコントラストは、電源電圧によって大きく変化し、温度による変化もあります。電池で動作していて電源電圧が安定していない場合や、使用が想定される温度の範囲が広い場合などには、初期化時に1度だけコントラストの設定をするのではなく、ユーザーがキー操作などによりコントラストを調整できるよう、ユーザーインターフェースを設計する事が好ましいといえます。
次のページでは、SPIバスにコマンドやデータを送る方法について説明します。
商品名 | 122X32モノクログラフィックLCDシールド | |
税抜き小売価格 | 3333円 | |
販売店 | スイッチサイエンス | |
サポートページ | 122X32モノクログラフィックLCDシールドサポートページ |
商品名 | GLCD学習シールドキット | |
税抜き小売価格 | 1410円 | |
販売店 | スイッチサイエンス | |
サポートページ | GLCD学習シールドキットサポートページ |