The Weekly Herald

scie and axsee's electronics weblog.
<< Realtek RTL8019AS EAGLE用ライブラリ | main | PCBCART 面付け発注について >>
スポンサーサイト このエントリーを含むはてなブックマーク

一定期間更新がないため広告を表示しています

| 書いた人:スポンサードリンク | - | | - | -
グラフィックLCDモジュール ソフトウェア編 このエントリーを含むはてなブックマーク
ハードウェア編の続き、ソフトウェア編です。

LCDモジュールの型名:F-51553GNBJ-LW-AB
LCDコントロールICの仕様書:S1D15605(PDFファイル)
このLCDモジュールを制御できなくて困っている方は、仕様書片手に記事をご覧ください。少しはヒントになるかもしれません。

H8とLCDモジュール F-51553GNBJ-LW-ABの接続は以下の通りです。アドレスデコーダは用意しませんでした。シンプルにいきましょ。
H8-F51553 InterfaceH8のCS2とLCDモジュールのCS1を直結する。
H8のエリア2を8ビットアクセス空間に設定する。
P/S端子はHighレベルにしてパラレルインタフェースを選択する。
C86端子はLowレベルにして80系MPUバスを選択する。
リセット端子はH8と共通にする。

では、解説スタート。
このLCDモジュールは80系又は68系MPUバスに直結することが可能であり、そうすることで、ある特定のアドレスにアクセスする感覚でLCDに表示データやコマンドをセットすることができる。H8とLCDを上記のように接続した場合、エリア2の偶数アドレスにコマンドを、奇数アドレスに表示データを書き込むことでLCDモジュールを制御するのだ。

また、このLCDコントロールIC S1D15605のアクセスサイクルは結構速く、5[V]で駆動させる場合は最低166[nsec]だから、H8のアクセスサイクルがこの値を満たせば、LCDコントロールICにアクセスする度に余計なウェイトをかけなくて済む。これは大きなポイントだ。
えーと、H8は25[MHz]で動かすから……。H8のエリア2に対するアクセスステート数の設定は、3ステート3ウェイトだったらいけるのか……な。

では、早々にプログラムの説明を。言語はCです。
まず、以下のマクロを定義する。↓
マクロを使用するのはあまりお勧めできませんが、サンプルなのでここは簡単に。↓
/* 置換用マクロ名 */
#define LCD_BASE_ADDR 0x400000 /* エリア2の偶数アドレスのどこかにする */
#define LCD_CMD_ADDR  (*(volatile unsigned char *)LCD_BASE_ADDR)
#define LCD_DATA_ADDR (*(volatile unsigned char *)(LCD_BASE_ADDR+1))

/* マクロ関数定義 */
#define lcd_cmd_write(cmd)   LCD_CMD_ADDR = (cmd)   /* コマンドライト   */
#define lcd_data_write(data) LCD_DATA_ADDR = (data) /* 表示データライト */
#define lcd_status_read()    LCD_CMD_ADDR         /* ステータスリード */
#define lcd_data_read()      LCD_DATA_ADDR        /* 表示データリード */
以上のマクロ関数を使用することで、コメントに書いたようにコマンドのセット、表示データの読み書きなどができる。コマンドについてはLCDコントロールICの仕様書に載っている。

マクロ関数でなく、通常の関数にしても良いけれど、↓
/* コマンドライト */
void lcd_cmd_write(unsigned char cmd)
{
    LCD_CMD_ADDR = cmd;
}

/* 表示データライト */
void lcd_data_write(unsigned char data)
{
    LCD_DATA_ADDR = data;
}

/* ステータスリード */
unsigned char lcd_status_read(void)
{
    return LCD_CMD_ADDR;
}

/* 表示データリード */
unsigned char lcd_data_read(void)
{
    return LCD_DATA_ADDR;
}
――と、こんな風にたった1行しかない処理を関数化するよりも、マクロ関数にした方が関数呼び出し等によるオーバーヘッドを避けられるのだ。
しかし、お勧めなのは関数に対しinlineキーワードを用いて、関数をインライン化することか?マクロ関数だと型チェックができませんから。

とりあえず以上で示した関数群で、コマンドライト、ステータスリード、表示データのリード・ライトが可能である。あとはこのマクロ関数を使用して、思う存分LCDを制御するのだ。

電源投入後、/RES端子によりLCDモジュールを初期化した後、すぐにLCDにグラフィックを表示できるかというとそうではない。少しやることがある。コマンドによる初期設定だ。
手順は次の通り。↓
 1.LCDバイアスセット。初期設定状態では1/9だが、これを1/7にする。
 2.ADCセレクト(セグメントドライバ方向セレクト)。
 3.コモン出力状態セット。
 4.V5電圧調整用内蔵抵抗比セット。外付け抵抗を使用する場合は必要ない。
 5.電子ボリュームセット。
 6.パワーコントロールセット。
以上で初期設定は完了である。LCDコントロールICの仕様書によると、この1〜6の手順を5[msec]以内で実行してください、とある。ただし、この時間は外部に接続するコンデンサの静電容量などにより変動する、とも書いてあるので、とりあえず電源を入れたらすぐにやってしまえー。

LCD初期化関数サンプル。↓
/* LCD初期化 */
void lcd_init(void)
{
    lcd_cmd_write(0xA3);  /* LCDバイアスセット 1/7に */
    lcd_cmd_write(0xA0);  /* ADC正転 */
    lcd_cmd_write(0xC0);  /* COM出力正転 */
    lcd_cmd_write(0x27);  /* V5電圧調整用内蔵抵抗比セット */
    lcd_cmd_write(0x81);  /* 電子ボリュームモードセット */
    lcd_cmd_write(0x20);  /* 電子ボリュームレジスタセット */
    lcd_cmd_write(0x2F);  /* パワーコントロールセット */
}
ただのサンプルだからそのまんまコピったりしないように。
コマンドによる初期設定を終えて、表示ONコマンドを実行すると、前々回の記事で書いたような、「おお、なんか出た!」という状況になるはずだ。グラフィックLCDを使うのが初めてだったのなら結構嬉しいと思う。

次は、いよいよグラフィック描画だ。と言いたいところだがこれ以下は補足説明である。
案内は入り口まで。

表示データの送受信は1バイト――8ドット――ごとに行う。
ページアドレスと、カラムアドレスを設定することにより、任意の場所のドットを書き換えることができる。

このLCDコントロールICのページアドレスは0から8まで、カラムアドレスは0から131まで存在する。ただし、このLCDモジュールの構成は128×64ドットである。カラムアドレスが132個もあるのはおかしいじゃないか、と思うかもしれない。実は余計な分は接続されていないのだ。だから有効なカラムアドレスは、ADCコマンドで正転を選択した場合は0x04〜0x83まで、反転を選択した場合は0x00〜0x7Fである。
また、ページアドレス8も未接続である。

表示データライト後は、カラムアドレスが自動的にインクリメントされる。カラムアドレスは最大0x83。ただし、カラムアドレスが0x83の状態で、表示データをライトしたからといって、ページアドレスがインクリメントされ、カラムアドレスが0x00になることはない。

なんと、電源をOFFにするときにも必要な手順があるのだ。
「電源を切る前にやれと言われても、突然電源が切れたりしたらどうするのですか!?」
「……。」
手順は以下の通り。↓
 1.パワーセーブ。
 2./RES端子をLowレベルにする。
 3.電源をOFFにする。
表示OFF状態のときに表示全点灯ONコマンドを実行することでLCDモジュールはパワーセーブ状態へと移行する。パワーセーブ状態になると内蔵電源回路が停止する。

また、リセットがアクティブ(Lowレベル)になってから電源をOFFにするまでの時間にも注文がある。ここで、電源をOFFにする――というのは、電源電圧(VDD-VSS間電圧)がS1D15065の最低動作電圧である1.8[V]を下回ることだ。リセットがアクティブになってから電源OFFまでの時間が、V5〜V1の電圧がLCDパネルのスレッシュホールド電圧(約1[V])以下になる時間よりも長くなければならない。

理由は、1SD15605はVDD-VSSのロジック電圧でLCD電源VDD-V5を制御しており、LCD電源に電圧が残っている状態でロジック電源がOFFになると、ドライバ(COM, SEG)からは制御されていない電圧が出力されることがあるためだ。

さらに、リセットアクティブから、V5〜V1の電圧がLCDパネルのスレッシュホールド電圧以下になる時間は、外付けコンデンサC2の静電容量と、ドライバのディスチャージ(放電)能力により決定されるとも仕様書に書いてある。

なんか、ここまで徹底して書いてあると結構デリケートなモジュールなのかなあ、と思ったりするけれど、実のところ、途中で電源を切ったりすることなんてしょっちゅうしているし、だからといってLCDモジュールが壊れたなんてことにはなっていないから、そんなに心配はしていないが、こういうことも頭の中に入れてはおくべきである。
できる限り、電源を切る前にパワーセーブ状態へ。

私の場合、/RES端子についてはリセットICで制御しているから、電源がOFFになる前に確実にLowレベルにはなっている。それに、電源に電解コンデンサを用意して、電源を切っても割とゆっくりと電源電圧は落ちていくようになっている。そうすることで、リセットアクティブから電源がOFFになるまでの時間を長くしているのだ。
だから、ただ"パワーセーブ状態にする"ということをしていないだけ。まあ問題なんだろうけど……。

キャラクタタイプに対して、グラフィックタイプのLCDはやはり自由度が大きいですね。フォントも自由に導入できます。なんだか何でもできそうです。これからも重宝すると思います。
というわけで、日本語フォント編、やりました。

このグラフィックLCDモジュール、結構売れているみたいで、さっき福岡電子工作支援店 W-FIELD.COMを覗いてみたところ、あと40台程度だそうです。購入はお早めに。ついでにFPCコネクタ(型名:FH12-30S-0.5SV)も買いましょう。でないと苦労します。
あれ? W-FIELD.COMは廃業したのか?

関連記事。↓
"グラフィックLCDモジュール 初編"
"グラフィックLCDモジュール ハードウェア編"
"グラフィックLCDモジュール 日本語フォント編"
| 書いた人:scie | Embedded System | 03:29 | comments(0) | trackbacks(0)
スポンサーサイト このエントリーを含むはてなブックマーク
| 書いた人:スポンサードリンク | - | 03:29 | - | -
コメント
コメントする
※コメント欄にHTMLタグを使用することはできません。
※コメント欄内のURLは、自動的にリンクへと変換されます。
※英数字のみのコメントは投稿できません。









この記事のトラックバックURL
http://herald.jugem.jp/trackback/62
トラックバック
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>


ブログ カウンター岩盤浴ゲルマニウム温浴