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文字目とか)を指定します。

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

Instruction DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
Set DDRAM address 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0

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

1列目 2列目 3列目 4列目 5列目 6列目 7列目 8列目
1行目 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
2行目 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47

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

  • レジスタ 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 と残機表示)の作成をしましょう。

Disqus comments only available for production