ArduinoでグラフィックLCDを動かす(AQM1248A編)(8)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (4) (5) (6) (7) (8) (9) (10) (11) (12) 次のページへ
2016年04月13日 公開。

4-1-3.コマンドの概要

ST7565Rには全部で25種類のコマンドがあります。しかし、AQM1248Aを制御する際に理解している必要のあるコマンドはごく一部で、AQM1248Aからは利用できないコマンドや、内容を理解せずにサンプルコードをそのまま使えばいいコマンドなどもあります。

AQM1248Aを使う際に必ず理解しておくべき4種類のコマンドを表6に、理解している事が好ましい3種類のコマンドを表7に、理解する必要性の少ない18種類のコマンドを表8にまとめました。

これらの中で、表8はあまり重要な表ではないので、参考に眺める程度で構いません。(重要でない表が詳しく書かれているのは、この表が筆者の備忘録を兼ねているため)

注:ST7565Rのデータシートのコマンドの一覧表には、23種類のコマンドが載っています。データシートでは、必ず組み合わせて使われる複数のコマンドを1つと数えていたり、複数のコマンドを組み合わせて使う場合に別の効果を持つ場合、その組み合わせも独立した1つのコマンドと数えています。一方でこの記事では、必ず組み合わせて使う複数のコマンドも別々に数えており、逆に複数のコマンドを組み合わせて使っても新しい効果が発生しても、その組み合わせを独立したコマンドとは扱っていません。そのため、この記事とデータシートでは、コマンドの種類の数が合いません。
表6、理解しておくべきST7565Rのコマンド(ビットマップの書き込みに関するコマンド)
種類 コマンドの名称 備考
書き込むデータのアドレスの設定
  • Page address set
  • Column address set upper bit
  • Column address set lower bit
  • Page address setコマンドは、次に書き込むビットマップデータのページアドレスを指定する。
  • Column address set upper bitコマンドは、次に書き込むビットマップデータのカラムアドレスの上位4ビットを指定する。
  • Column address set lower bitコマンドは、次に書き込むビットマップデータのカラムアドレスの下位4ビットを指定する。
データの書き込み
  • Display data write
1バイトのビットマップデータを書き込む。前のページの「コマンドとデータ」の項では、データの書き込みとコマンドの発行を区別して説明したが、ST7565のデータシートでは、データの書き込みもコマンドの一種として扱われているので、この表にはコマンドとして掲載する。
表7、理解している事が好ましいST7565のコマンド(コントラスト調整に関するコマンド)
種類 コマンドの名称 備考
コントラスト調整
  • V0 voltage regulator internal resistor ratio set
  • Electronic volume mode set
  • Electronic volume register set
これらのコマンドは、液晶のコントラスト調整の際に使う。
表8、理解する必要性の少ないST7565Rのコマンド
種類 コマンドの名称 備考
ユーザーが使ってはいけないコマンド
  • Test
ST7565Rの出荷時検査に使われるコマンド。コマンドの詳細は明らかになっていない。ユーザーが使う事は禁止されている。
特に何も効果がないコマンド
  • NOP
NOPコマンドを発行しても、通常は何も起こらない。なぜNOPコマンドがあるのかは分らないが、プログラム開発時に使うものだろうか?ユーザーにとって、唯一NOPコマンドに価値があるのは、誤ってTestコマンドを発行した後の、取り消し用だと思われる。(その用途でも、Resetコマンドで代用できる)
AQM1248Aでは使えないコマンド
  • Status read
  • Display data read
  • Read-modify-write
  • End
  • Static indicator ON/OFF
  • Static indicator register set
  • AQM1248AではSPIバスだけが利用可能で、この場合バスから情報を読めないので、情報を取得するためのコマンド(Status read、Display data read、Read-modify-write、End)は使えない。
  • AQM1248Aにはstatic indicatorと呼ばれる特殊な表示領域はないため、それらに関するコマンド(Static indicator ON/OFF、Static indicator register set)は使えない。ただし、スリープモードやスタンバイモードを使って消費電力を減らしたい時は、それらのモードと通常モードの間の移行シーケンスにおいて、例外的にStatic indicator ON/OFFコマンドとStatic indicator register setコマンドを使う。
初期化シーケンスの中で使い、かつオペランドが決まっているコマンド
  • LCD bias set
  • Power control set
  • Booster ratio set
これらのコマンドのオペランドは、AQM1248Aの内部回路の構成(使用する液晶パネルや電源回路など)によって決まっている。ユーザーが勝手に変更できないので、コマンドやオペランドの内容を理解する必要がない。AQM1248Aの推奨初期化シーケンス内にこれらのコマンドが出てくるが、何も考えずに推奨のシーケンスをコピー&ペーストすればよい。(Booster ratio setコマンドは推奨初期化シーケンスに出てこないが、これは設定をデフォルト値から変更する必要がないため)
初期化シーケンスに使う他は、特殊な用途でしか使用しないコマンド
  • Display ON/OFF
  • Display start line set
  • ADC select
  • Display normal/reverse
  • Display all points ON/OFF
  • Reset
  • Common output mode select
  • Display ON/OFFコマンドは、VRAMの内容を表示するかどうかを選択するコマンドだが、通常は表示したままにするので、初期化シーケンスで一度呼び出せば、その後に使う必要はない。表示をOFFにすると、VRAMの状態を保持したまま画面を真っ白にできるので、表示のONとOFFを繰り返して、画面全体を点滅させたい時などには使えるかもしれない。スリープモードやスタンバイモードを使って消費電力を減らしたい時は、それらのモードと通常モードの間の移行シーケンスでDisplay ON/OFFコマンドを使う。
  • Display start line setコマンドを使うと、VRAM中で表示を開始するラインアドレス(前のページの図43を参照)を指定できる。この機能をうまく使うと画面の縦方向のスクロールができるが、通常は表示開始のラインアドレスを0に固定して使用する。
  • ADC selectコマンドを使うと、VRAMを書き換えることなく表示の左右を反転できるが、これも普通は使わない。
  • Display normal/reverseコマンドを使うと、VRAMのを書き換える事なく画面の白黒の反転を行うことができるが、これも普通は使わない。
  • Display all points ON/OFFコマンドをONのオペランドで実行すると、VRAMの内容に関係なく、画面が真っ黒になるが、私にはこの機能が必要になる状況を想像できない。ただし、スリープモードやスタンバイモードを使って消費電力を減らしたい時は、それらのモードと通常モードの間の移行シーケンスでDisplay all points ON/OFFコマンドを使う。
  • 電源投入時に自動的にリセットがかかって以降は、通常、ST7565Rを明示的にリセットする必要はない。そのためResetコマンドも使わない。
  • Common output mode selectコマンドを使うと、VRAMを書き換えることなく表示の上下を反転できるが、普通はこの機能を使わない。
  • Display start line set、ADC select、Common output mode selectの3つのコマンドは、本来、液晶を使用中に表示に変化を与えるためのものではない。液晶モジュール内の配線をしやすくする目的で、液晶パネルの端子とST7575Rの端子の関係に柔軟性を持たせるための物である。そのため、これらのコマンドは初期化シーケンスにおいてのみ使用されるのが普通である。

この記事では、表6と表7に示した、理解しておくべき、あるいは理解しておく事が好ましいコマンドに限って詳しく説明します。その他のコマンドについては、ST7565Rのデータシートを参照してください。

広告

4-1-4.VRAMへのビットマップデータの書き方

VRAMの特定のバイトに縦方向に8ピクセルのビットマップデータを書き込むには、まず、ページアドレスとカラムアドレスを指定し、その後、データを書き込みます。

4-1-4-1.Page address setコマンド

ページアドレスの指定には、Page address setコマンドを使います。表9に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内の指定したページに書き込まれます。

4-1-4-2.Column address set (upper bit/lower bit)コマンド

カラムアドレスを指定するコマンドは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に示します。

表10、Column address set upper bitコマンドのフォーマット
コマンドのビット(D7がMSB) D7 D6 D5 D2 D3 D2 D1 D0
各ビットの内容 0 0 0 1 A7 A6 A5 A4
表11、Column address set lower bitコマンドのフォーマット
コマンドのビット(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コマンドで指定し直す(あるいはソフトウェアリセットを掛ける)までは、ページアドレスは変化しません。

4-1-5.AQM1248Aの初期化シーケンスとコントラスト調整

4-1-5-1.コントラスト調整に使うコマンド

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に示します。

表12、V0 voltage regulator internal resistor ratio setコマンド(V0コマンド)のフォーマット
コマンドのビット(D7がMSB) D7 D6 D5 D2 D3 D2 D1 D0
各ビットの内容 0 0 1 0 0 * * *

V0コマンドは、先ほど説明した様にコントラストの粗調整を行いますが、下位3ビット(表12で*で表示されているビット)のオペランドにより調整を行います。オペランドが大きくなる方が、表示は濃くなります。

次に、EVMSコマンドとEVRSコマンドのフォーマットを、それぞれ表13にと表14に示します。

表13、Electronic volume mode setコマンド(EVMSコマンド)のフォーマット
コマンドのビット(D7がMSB) D7 D6 D5 D2 D3 D2 D1 D0
各ビットの内容 1 0 0 0 0 0 0 1
表14、Electronic volume register setコマンド(EVRSコマンド)のフォーマット
コマンドのビット(D7がMSB) D7 D6 D5 D2 D3 D2 D1 D0
各ビットの内容 0 0 * * * * * *

EVMSコマンドにはオペランドがなく、10000001B(81H)と、コマンドの数値がひとつに決まっています。

このEVMSコマンドを実行するとコントラストの微調整モードに入ります。EVMSコマンドの直後は、表14のEVRSコマンドしか実行してはいけません。(他のコマンドを実行しても、正しく解釈されないでしょう)

EVRSコマンドの下位6ビット(表14の*で表示されているビット)のオペランドにより、コントラストを微調整します。オペランドが大きいほど、表示は濃くなります。

EVRSコマンドでコントラストの微調整値を設定すると、自動的にコントラストの微調整モードから抜け、他のコマンドを受け付けるようになります。

4-1-5-2.AQM1248Aの初期化シーケンス

ところで、3ページリスト1リスト2には、InitializeLcdという関数があります。(リスト3参照) InitializeLcd関数は、AQM1248Aに付属する説明書に書いてある初期化シーケンス(初期化手順)を、そのまま関数にしたものです。

リスト3、InitializeLcd関数COPY
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コマンド(青色)のオペランドを変更すれば、コントラストを調整できる事になります。

4-1-5-3.コントラスト調整のオペランドの値と実際の画面表示の関係

V0コマンドとEVRSコマンドのオペランドを変化させると、実際の画面の表示はどう変わるのでしょうか?ここでは実験により確かめてみたいと思います。

これからコントラストの設定を色々と変えた場合の画面写真をお見せしますが、写真撮影の条件が少し変わるだけでもコントラストが違った様に写る事があり、またお使いのパソコンやスマホの画面の特性によっても違って見えることがあるため、このページの写真は、あくまでも参考に程度にご覧ください。

このページの全ての画面写真は、Arduino Unoを用いて、6ページの図39の結線でAQM1248Aを動作させ撮影した物です。(つまりAQM1248Aの電源電圧は3.3V) また撮影時の室温は、おおよそ20℃です。

まずリスト1を変更せずに、そのまま実行した場合の画面写真を写真20に示します。この場合、コントラスト調整のためのコマンドは、23H(V0コマンド、オペランド3)、81H(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つです。

写真20、23H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真20、23H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
これはAQM1248Aに付属の説明書通りに初期化した場合に相当する。

V0コマンドによるコントラストの変化を見るため、同コマンドのオペランドを1つ減らして2とし、22H(V0コマンド、オペランド2)、81H(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つのコマンドによりコントラスト調整をした場合の写真を、写真21に示します。

写真21、22H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真21、22H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
V0コマンドのオペランドを、3から2へ1つ小さくしたので、写真20に比べて表示が薄くなっている。

V0コマンドのオペランドを1つ小さくするだけで、表示がずいぶん薄くなっているのが分ると思います。写真は掲載しませんが、オペランドをもう1つ小さくして1にすると、完全に表示は消えてしまいます。

今度は反対に、写真20の状態からV0コマンドのオペランドを1つ増やして4にし、24H(V0コマンド、オペランド4)、81(EVMSコマンド)、1CH(EVRSコマンド、オペランド28)の3つのコマンドでコントラスト調整した場合の写真を、写真22に示します。

写真22、24H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真22、24H、81H、1CHのコマンドによりコントラスト調整した場合の画面写真
V0コマンドのオペランドを、3から4へ1つ大きくしたので、写真20に比べて表示が濃くなっている。

V0コマンドのオペランドを1つ大きくするだけで、表示がずいぶん濃くなり、ほとんど模様が観察できなくなっているのが分かると思います。(写真では分かりにくいが、肉眼ではうっすらと模様が確認できる) 写真は掲載しませんが、V0コマンドのオペランドをもう1つ大きくして4すると、完全に表示は黒くぶれてしまいます。

この様に、V0コマンドのオペランドを変化させると、コントラストがかなり粗く変化するため、微調整には全く使えない事が分かります。

次に、V0コマンドのオペランドは3に固定し、EVRSコマンドのオペランドを8、16、24、32、40と順に増やしていった場合の画面表示の変化を、写真23~写真27に示します。

写真23、23H、81H、08Hのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真23、23H、81H、08Hのコマンドによりコントラスト調整した場合の画面写真
この時V0コマンドのオペランドは3で、EVRSコマンドのオペランドは8である。
写真24、23H、81H、10Hのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真24、23H、81H、10Hのコマンドによりコントラスト調整した場合の画面写真
この時V0コマンドのオペランドは3で、EVRSコマンドのオペランドは16である。
写真25、23H、81H、18Hのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真25、23H、81H、18Hのコマンドによりコントラスト調整した場合の画面写真
この時V0コマンドのオペランドは3で、EVRSコマンドのオペランドは24である。
写真26、23H、81H、20Hのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真26、23H、81H、20Hのコマンドによりコントラスト調整した場合の画面写真
この時V0コマンドのオペランドは3で、EVRSコマンドのオペランドは32である。
写真27、23H、81H、28Hのコマンドによりコントラスト調整した場合の画面写真
↑ 画像をクリックすると拡大
写真27、23H、81H、28Hのコマンドによりコントラスト調整した場合の画面写真
この時V0コマンドのオペランドは3で、EVRSコマンドのオペランドは40である。

この様に、EVRSコマンドを使えば、コントラストの微調整が行える事が分かります。

なお、液晶ディスプレイのコントラストは、電源電圧によって大きく変化し、温度による変化もあります。電池で動作していて電源電圧が安定していない場合や、使用が想定される温度の範囲が広い場合などには、初期化時に1度だけコントラストの設定をするのではなく、ユーザーがキー操作などによりコントラストを調整できるよう、ユーザーインターフェースを設計する事が好ましいといえます。

次のページでは、SPIバスにコマンドやデータを送る方法について説明します。

目次へ  前のページへ (4) (5) (6) (7) (8) (9) (10) (11) (12) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

122X32モノクログラフィックLCDシールド 商品名 122X32モノクログラフィックLCDシールド
税抜き小売価格 3333円
販売店 スイッチサイエンス
サポートページ
GLCD学習シールドキット 商品名 GLCD学習シールドキット
税抜き小売価格 1410円
販売店 スイッチサイエンス
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。