記事

AQMシリーズのI2C接続LCDキャラクタ・ディスプレイを使う (2)拡張命令でコントラストの設定

拡張命令でコントラストの設定

 コントラストは拡張命令で設定できます。一般的な使い方では、初期化のときに適切な値に設定すると後はあまり変更する必要はありません。
 今回は、コントラストの設定値と実際のLCDモジュールのコントラスト様子を確認します。コントラストの設定は拡張命令で行います。

拡張命令
 AQMシリーズのI2C接続キャラクタLCDモジュールは、コントローラST7032iで制御されています。このモジュールはコントラストなどの制御もコマンドで行っています。そのために、オリジナルのコントローラHD47780の初期化コマンドではD1、D0のビットは使用されていません。このD0ビットにISビットを割り当てて拡張されています。

拡張されたイニシャル・セット
 HD47780のイニシャル・セット・コマンドのD0をISに設定して、拡張コマンドの受け入れのON/OFFを制御しています。

IS=1 コマンドは拡張コマンドとして解釈される
IS=0 コマンドは拡張コマンドとして解釈されない。標準のコマンドとなる。

バイアス、内部周波数アジャスト(0x1×)
 拡張コマンドの上位4ビットが0x1の場合、LCDのフレーム周波数を約120Hzから347Hzの間の値に設定されます。デフォルトの0x14の周波数はVdd=3.0Vで183Hz、5.0Vで192Hzとなります。BSのバイアスのデフォルト設定はLOWで1/5です。

アイコン・アドレスのセット(0x4×)
 アイコンのRAMのアドレスをAC(アドレス・カウンタ)に設定します。今回使用するモジュールはアイコンが用意されていないので、このコマンドは使用しません。


パワー・アイコン・コントラスト制御(0x5×)
 Ion=HIGH(1)のときアイコンが表示され、LOW(0)のときアイコンの表示をOFFにします。このモジュールではアイコンが用意されていないのでLOW(0)とします。
 BonがHIGH(1)のときは、3.3V電源の場合、LCD用の電源を3.3Vからブースト(昇圧)して供給するように設定します。電源VDDが5Vの場合は、BonをLOW(0)に設定します。
 C5、C4は、コントラストを設定するC5からC0の値のうちの上位2ビットです。下位4ビットは0x7Xで設定します。


フォロア制御(0x6×)
 LCDモジュールのFonは、LCDのドライブ電源の制御を行います。FonをHIGH(1)にするとLCDへの電源が供給されます。LOW(0)にすると表示は消えます。
 Rab1、Rab2、Rab3で、3.5Vの基準電圧に対して何倍の電圧を供給するか設定します。

 このLCDモジュールでは5V電源をつなぐと0x6Aで表示が始まりますが、少しコントラストが足りなく0x6B、0x6Cで通常の表示となりました。

コントラスト制御下位データ(0x7×)
 このコマンドは、6ビットのコントラストを設定する6ビットの設定値の下位4ビットです。拡張コマンドの0x5×のD1、D0が上位2ビットになります。


コントラストを決めるコマンド
 コントラストは拡張コマンドの0x5×と0x7×で設定します。この設定は、ボリュームの電圧をアナログ入力端子で読み取りその値を用いて設定します。入力値は0から1023になります。この値を16で除算しコントラストの設定値とします。

コントラストの変更
 コントラストの変更は、次のような手順で試みました
(1) 初期化コマンド0x39を書き込み 拡張コマンドが入力できるようにする
(2) ボリュームの電圧を読み取り、int型の変数adataに代入する
 byte a1=adata >> 4; で6ビット・コントラスト・データ a1を得る。
除算の代わりにシフト演算で16の除算と同じ結果を得ています。
(3) コントラスト制御下位データ(0x7×)
 コントラスト・データ a1と 0x70 の OR演算で下位4ビットをコマンドにセットします。上位2ビットはコマンド0x70の7でマスクされるから、特に処理の必要はありません。
(4) パワー・アイコン・コントラスト制御(0x5×)
 a1の上位2ビットは a1 >> 4でd1、d0を移動し、パワー・アイコン・コントラスト制御(0x5×)と OR 演算でセットします
 以上の処理のプログラムは次のようになります。

void loop() {
    lcdclear();  // 画面のクリア
    i2cwritecmd(0x39);  // 拡張コマンドが利用できるようにする
    delay(2);
    int adata=analogRead(A0); // ボリュームの読み取り
    byte a1=adata>>4;     // 6ビットのコントラストデータを得る
    i2cwritecmd(0x50 | (a1>>4)); // コントラストデータの下位4ビット書き込む
    delay(2);
    i2cwritecmd(0x70 | a1); //の上位2ビット書き込む
    delay(2);
    i2cprint(String(a1));  // コントラストデータをLCDに表示
    i2cwritecmd(0x38); // 拡張コマンド・モードを終わる
    delay(500);
}

テスト・プログラムのsetup()とloop()
 今回テストのために作成したsetup()とloop()を次に示します。


 テスト回路の全体は次のようになります。ボリュームからの入力はArduinoのアナログ入力端子A0に接続しました。

 コントラストデータが25くらいから何とか識別できるようになります。27では次のようになります。

 29では次ように識別できるようになります。

 39くらいからはあまり大きな変化は認められません。

 48の設定値の状態です。

 マックスの値は63では次のようになります。

 拡張モードでも、クリアなどのコマンドは利用できました。カーソル、表示のシフトと内部周波数セットのコマンドが競合しますので、今回のようなテスト以外ではコントラストの設定などが終わったら拡張モードは終了します。次回は、TMP102などの温度測定を行います。

(2016/11/4 V1.0)

<神崎康宏>

◆AQMシリーズのI2C接続LCDキャラクタ・ディスプレイを使う

(1) 微妙なSCLクロック

(2) 拡張命令でコントラストの設定

(3) レベル変換とリピータ

(4) モデルの違い