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

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

4.AQM1248Aを使うためのスケッチの作り方

前の章の説明で、無事にArduinoとAQM1248Aを接続できるようになったと思います。今度は、AQM1248Aに図形や文字を表示するためのスケッチの作り方を説明しましょう。

最初は、3ページのリスト1やリスト2の様に、SPIインターフェースから直接ST7565R(AQM1248Aに内蔵されている液晶制御IC)にコマンドやデータを送って、図形を描くスケッチの作り方を説明します。

次に、AQM1248A用のライブラリを用いて文字列や図形を描くスケッチの作り方を説明します。

ライブラリを用いる方が簡単に文字列や図形を表示できるため、液晶制御ICの使い方に興味がない人は、そちらだけを読んでも構いません。

一方で、PICマイコンやCortexマイコンなど、他のマイコンでAQM1248Aを使いたいという人には、この記事で紹介するライブラリが利用できないため、直接ST7565Rにコマンドやデータを送る方法の方が参考になるでしょう。

また、制御ICにコマンドやデータを送って液晶に図形を描く方法を理解してしまうと、全く新しく使う液晶モジュールでも、液晶モジュールと、それに内蔵されている液晶制御ICのデータシートが入手できれば、自力でライブラリを作れるようになります。

4-1.直接液晶制御ICにコマンドやデータを送る方法

それでは、AQM1248Aに内蔵されている液晶制御IC(ST7565R)にコマンドやデータを送って図形を描画するスケッチの作り方を説明します。

スケッチの作り方を理解するには、ST7565Rのソフトウェア的な動作についてある程度理解する必要があるので、最初はST7565Rの内蔵VRM(フレームバッファ)のメモリマップやコマンドなどについて説明します。

4-1-1.コマンドとデータ

2ページで説明したとおり、AQM1248A(に内蔵されたST7565R)に送る情報には、コマンドとデータの2種類があります。コマンドとデータの区別は、RS信号により区別されます。(図3参照)

図3(再掲)、SPIバスのタイミングチャート
↑ 画像をクリックすると拡大
図3(再掲)、SPIバスのタイミングチャート

コマンドは、AQM1248Aの初期化のための各種命令や、次にVRAMに書き込むデータのアドレスの指定などをします。RS信号をLにした状態でSDI信号(MOSI信号)に8ビットの情報を書き込むと、その情報はコマンドと解釈されます。

一方で、データを送ると、それがそのままVRAMに書き込まれます。RS信号をHにした状態でSDI信号に8ビットの情報を書き込むと、その情報はデータとみなされます。

広告

4-1-2.VRAMの構成

液晶画面に表示する情報は、AQM1248A内蔵のVRAM(Video RAM)に格納されています。

表示内容を記憶するメモリは、VRAM、GRAM(Graphic RAM)、フレームバッファ、グラフィックメモリなど色々な表記があり、AQM1248Aに付属の説明書にはディスプレイRAM、ST7565RのデータシートにはDisplay Data RAMと表記されていますが、ここでは表記が短いVRAMを使うことにします。

AQM1248Aは、横方向132ピクセル×縦方向65ピクセルの、計8,580ピクセル分(つまり8,580ビット)のVRAMを搭載しています。AQM1248Aの実際の解像度は横128ピクセル×縦48ピクセルですから、実際に表示できる画面より広い空間のVRAMを持っている事になります。

これは、AQM1248Aに内蔵しているST7565Rが、最大横132ピクセル×縦65ピクセルの、AQM1248Aよりも解像度の高い液晶パネルに対応している事によります。言い方を変えれば、AQM1248AはST7565Rの対応する最大解像度よりも低い解像度で動作していることになります。(図41参照)

図41、ST7565Rが対応している最大解像度とAQM1248Aの解像度の関係
↑ 画像をクリックすると拡大
図41、ST7565Rが対応している最大解像度とAQM1248Aの解像度の関係

VRAMは、8ビット(1バイト)ごとにグループ化され、それぞれのバイトに12ビットのアドレスが振られています。12ビットのアドレス空間なら、最大4kバイト、つまり32kビットの容量があるわけですが、ST7565Rの実際のVRAMの容量は8,580ビットですから、メモリ空間の26%強が使用されている計算になります。

メモリ空間の先頭から26%が使用されている訳ではなく、この後示すように、ところどころ歯抜けになる形で、メモリ空間が使用されています。

図42、ページアドレスとカラムアドレス
↑ 画像をクリックすると拡大
図42、ページアドレスとカラムアドレス

本当はページアドレスが上位でカラムアドレスが下位と決まっているわけではありませんが、こう解釈するとVRAMの構造を理解しやすいです。

12ビットのアドレスは、図42に示す様に上位4ビットのページアドレスと、下位8バイトのカラムアドレスに分けられます。

ページアドレスは、画面の縦方向の位置を表します。通常はページアドレスが小さいほど画面の上側を表しますが、コマンドにより上下を入れ替える事もできます。またページアドレスは4ビットですので、0~15の値を取り得ますが、その内有効(VRAMが割り当てられている)なのは0~8です。

カラムアドレスは、画面の横方向の位置を表します。通常はカラムアドレスが小さいほど画面の左側を表しますが、コマンドにより左右を入れ替える事もできます。またカラムアドレスは8ビットなので、0~255の値を取り得ますが、その内有効なのは0~131です。

VRAMの構成を図で表すと、図43の様になります。

図43、VRAMの構成
↑ 画像をクリックすると拡大
図43、VRAMの構成

図中の黄色で示したマスが、VRAM上の1ビットを表しており、画面上の1ピクセルに対応します。ピンクで示した画面表示エリア内のVRAMのビットに0を書き込むと、そのピクセルは白くなります。また、ビットに1を書き込むと、そのピクセルは黒くなります。

ただし、コマンドにより白黒の関係を反転させ、0を書き込むと黒、1を書き込むと白にもできます。

VRAMにデータを書き込む場合、図43で緑で示した様に、同じページアドレス、同じカラムアドレスの、縦方向に連なる8ビットが書き込みの単位になります。

ページアドレスがn(n=0~8)のVRAMの領域全体(132バイト)をページnと呼びます。つまり、VRAM全体はページ0からページ8までの9ページで構成されていることになります。

ただしページ8は、ページ0~7とは違い、特殊な構造になっています。ページ0~7は0ビット(LSB)から7ビット(MSB)までの8ビット全てが有効ですが、ページ8は、0ビット(LSB)のみが有効です。

ページ0~7は、ビットマップ表示(格子状にピクセルが並んだグラフィック表示)用のVRAMですが、ページ8は、アイコン表示に使うことを想定されているようです。(バッテリ残量を表わすアイコンや、電波の受信強度を表すアイコン、タイマーがセットされていることを表すアイコンなど、携帯電話などの携帯機器の画面の上側によくあるアレです) 1ビットがひとつのアイコンに対応しているので、最大132個のアイコンの表示ができます。(そんなにたくさんアイコンを使う事はないでしょうが)

この様に、ST7565Rにはアイコン表示の機能があるものの、AQM1248Aの液晶パネルにはアイコン表示領域がなく、ST7565Rのアイコン表示機能は使っていません。そのため、ページ8にデータを書き込んでも、何も起こりません。

ところで、VRAMにはバイト単位でしか書き込みできないため、例えばあるピクセルだけ白黒を反転させたいと思っても、そのピクセルに対応するビットだけにアクセスする方法がありません。そこで、2ページの「グラフィックデータの描画の仕方」というコラムに示した様な方法で、今までのVRAMの内容と、新しく書き込みたい情報を論理演算(ORまたはAND)し、それを書き戻すという手順が必要になります。

AQM1248Aの内蔵VRAMは、内容を読み出す方法が提供されていない(ST7565R自体にはVRAMの内容を読みだす機能はあるが、SPIインターフェース経由では読み出しができない)ため、マイコン側にもVRAMのコピーを用意して、読む場合はマイコン側のVRAMを読む必要があります。VRAMにデータを書き込む場合は、AQM1248A内のVRAMと、マイコン内のVRAMに同一のデータを書き込み、2つのVRAMの内容を常に同じに保つ必要があります。

AQM1248Aに図形を描く手段は、VRAMにビットマップ情報を書き込む事だけです。文字コードを書き込めばLCDモジュール側が勝手に文字を表示してくれたり、LINE描画コマンドを発行すると、直線が表示されたりといった、高度な機能は提供されていません。

よって、文字を表示したいなら、フォントをマイコン側で用意する必要があり、そのフォントのビットマップ情報を、VRAM内の、文字を表示したい領域に転送する必要があります。

また、直線や長方形、円などの幾何学図形を表示したい場合も、マイコンがその図形上のピクセルの座標を全て計算し、VRAM上のそれらのピクセルに対応するビットに 1(図形を黒で描く場合)を書き込んでいく必要があります。

そのため、文字のフォントや、文字や図形を表示する関数をまとめたライブラリをまず作らないと、画面表示に非常に手間がかかり、実用的ではありません。

Arduinoで動作するAQM1248A用のライブラリは後で紹介しますが、ここでは、あえて、AQM1248AのVRAMに直接ビットマップを書き込んで表示する方法を紹介します。この説明が理解できれば、他のマイコン用のAQM1248Aのライブラリを自作できるようになるでしょう。

次のページでは、AQM1248Aのコマンドの話や、初期化とコントラスト調整の話をします。

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

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

関連ページ

関連製品

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