AQM0802A に文字を表示してみる

2022年6月21日
This post thumbnail

ミミィ

とにかく試しに動かしてみるわよ!
考えてるヒマがあったら手を動かすのよ手を!

タマちー

1行目に「ocoge」、2行目に「club」と表示してみよう・・・

手順説明の下に『オコゲ』のブロックで組み立てたプログラムコードを畳んで置いてあります。クリックすると開きます。
※一部ブロックの形状が現行バージョンと異なります。

それとこの先の説明では16進数と2進数が何の説明もなく出てくるわ!
気になる人は 16進数 , 2進数 あたりを見てネ!

I2C アドレス

次のコマンドで確認します。

$ i2cdetect -y 6
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 

AQM0802A の I2C アドレスは 0x3e と分かりました。

『オコゲ』ブロックプログラム:I2C デバイスを開く
GPIO を有効にして I2C デバイスに接続する

デバイスに限らず、何かに接続して使用可能な状態にすることをコンピュータ用語では「開く (open)」と表現します。

コマンド書き込み

レジスタ 0x00 にコマンドコード(1バイト)を書き込むことで、AQM0802A にコマンド(命令)を送信することができます。

『オコゲ』ブロックプログラム:コマンドを書き込む
繰り返し使用するプログラムなので、関数として分離しておきます。
コマンド書き込み関数

コマンド書き込み毎に待ち時間が必要です。待ち時間の長さはコマンドの種類によって若干の違いがあるようですが、ここでは無視して100分の1秒で統一します。

ちゃんと動いているから大丈夫!
たぶん!

データ書き込み

レジスタ 0x40 にバイトコードを書き込むことで、AQM0802A 内蔵の RAM (DDRAM/CGRAM) にデータを書き込むことができます。DDRAM にデータを書き込むと画面に文字を表示することができます。CGRAM は自作文字のデータを登録しておくことができます。

『オコゲ』ブロックプログラム:データを書き込む
こちらも繰り返し使用するので関数にしておきます。
データ書き込み関数

初期化

秋月電子のデータシート に従って初期化します。

以下のコマンドコードを、順にレジスタ 0x00 に書き込みます。

  1. 0x38 (機能設定:表示行数とか文字の大きさとか)
  2. 0x39 (拡張コマンドモード開始)
  3. 0x14 (内蔵発振器周波数)
  4. 0x70 (コントラスト)
  5. 0x56 (3V動作)
  6. 0x6c (フォロワ回路のオンオフと増幅率)
  7. 0x38 (拡張コマンドモード終了)
  8. 0x0c (ディスプレイオン・カーソルオフ)
  9. 0x01 (ディスプレイクリア)
『オコゲ』ブロックプログラム:AQM0802A を初期化
初期化手順

文字表示

DDRAM にデータを書き込むと画面に文字を表示します。

DDRAM アドレスを指定

文字を表示するディスプレイ上の位置(2行目の3文字目とか)を指定します。

(データシートコマンドコード表より)

InstructionDB7DB6DB5DB4DB3DB2DB1DB0
Set DDRAM address1AC6AC5AC4AC3AC2AC1AC0

データシートではコマンドは8桁(8ビット)の2進数で書かれています。それぞれのビットに役割があり、最上位ビットを立てると DDRAM アドレス指定コマンドとして働きます。残りの7ビットでアドレス値を指定します。DDRAM アドレス値と表示位置の対応は次の通りです。(横の〇文字目を便宜上「列」と表現することにします)

1列目2列目3列目4列目5列目6列目7列目8列目
1行目0x000x010x020x030x040x050x060x07
2行目0x400x410x420x430x440x450x460x47

以上から、ディスプレイ上の文字表示位置を指定するには以下のようにします。

  • レジスタ 0x00 に、「0x80(最上位ビット) +(上の表のアドレス値)」を書き込む

文字表示

DDRAM アドレス指定コマンドを書き込んだのちにデータ書き込みを行うことで、指定した位置に文字を表示することができます。文字コードは以下の通りです。

クリックで拡大

コード 0010 0000 からコード 0111 1101 まで、すなわちキーボードで入力できる半角(1バイト)の英数字・記号の大部分は UTF-8 (ascii) のコードと一致していますので、表示したい文字列がこの範囲内であれば、そのままデータとして(レジスタ 0x40 へ)書き込めば良いでしょう。

『オコゲ』ブロックプログラム:AQM0802A に文字を表示する
行と列を指定して文字列表示を行う関数を作成しましょう。
文字列表示関数

「行」と「列」は、内部的には0(ゼロ)から始まる数え方をするので、それぞれ1を引きます。

大文字・小文字・記号などがちゃんと表示されるかどうか、表示位置指定の確認も含めて、1行目に「{ocoge}」、2行目は右に3文字ずらして4文字目から「CLUB!」と5秒間表示することにしましょう。

最後に、ディスプレイをオフにしてデバイスとの接続を切るなど後片付けをします。ディスプレイの表示をオフにするにはコマンド 0x08 を書き込みます。

まとめ

今回作成したプログラムはこのようになりました。

AQM0802A に文字を表示してみるプログラム
実行結果

バックライトは点灯させていません。期待通りの動作をしているようです。メデタシ。
次回はゲームのルール確認と自作文字(UFO と残機表示)の作成をしましょう。