I2Cインターフェースを使用したキャラクタモジュール製品(検証にはAQM0802を使用)をを例にに説明します。
Pin No | Pinout | Description | 備考 |
---|---|---|---|
1 | VO | Test pin | Openでよい。 |
2 | VOUT | DC/DC voltage converter | 3.5V未満の電源で、内蔵のチャージポンプを使ってLCDの電源を作り出すときに使用する。VINとの間に0.1-1uFのコンデンサを接続する。LCDモジュールではVINはVDDと接続されている。 |
3 | CAP1N | For voltage booster circuit | 内蔵のチャージポンプを使ってLCDの電源を作り出すときに使用する。0.47-22uFのコンデンサを接続する。 |
4 | CAP1P | ||
5 | VDD | 電源(3.3V) | コントローラーは2.7-5.5Vカバーするので、周辺回路次第で3V,5V対応している製品もある。 ノイズ対策のため、VDD-VSS間に0.1uF程度のコンデンサを接続する事が推奨されます。 |
6 | VSS | GND | |
7 | SDA | I2C data | |
8 | SCL | I2C clock imput | |
9 | XRSETB | Reset | Power on resetのみで良い場合VDDに接続しておく。 |
マイコンとの接続例
モジュールの桁数や行数、表示モードにより、アドレッシングが異なります。
基本的に80文字分のメモりがあり、そのうち表示可能な範囲を表示しています。表示されているかに関らず、任意の位置にWrite可能です。
1 | 2 | 3 | ... | 39 | 40 | 41 | ... | 78 | 79 | 80 |
---|---|---|---|---|---|---|---|---|---|---|
00h | 01h | 02h | ... | 26h | 27h | 28h | ... | 4Dh | 4Eh | 4Fh |
1 | 2 | 3 | ... | 38 | 39 | 40 |
---|---|---|---|---|---|---|
00h | 01h | 02h | ... | 25h | 26h | 27h |
40h | 41h | 42h | ... | 65h | 66h | 67h |
AQM0802Aではキャラクタコード0x0から0x5の6個はCG RAM(後述)に割当られています。CGRAMのサイズはOPR1,OPR2の設定により変更できるため、モジュールにより異なります。
CG RAMはユーザーがキャラクタパターンを定義する事ができるエリアです。キャラクタジェネレータが備えていない文字を定義して利用することができます。
CG RAMアドレスは6 bitなので、上位3 bitでキャラクタを指定、残りの3 bitでキャラクタパターンの行を指定します。各行毎のパターンはCG RAMデータとして与えます。キャラクタパターンが5x7 bitで表現されているので、データビット7:5は使用しません。
Function setでIS=1にセットしている間は、Instruction table 1と解釈され、HD44780には存在しない拡張コマンドの実行となります。
また、READ命令が実装されていないため、これらは省かれています。
Instruction | RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | Description | 実行時間 OSC Freq= | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
380KHz | 540KHz | 700KHz | ||||||||||||
Clear Display | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 全表示クリア後カーソルをホーム位置(0x00)へ戻す。 | 1.08ms | 0.76ms | 0.59ms |
Return Home | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | カーソルをホーム位置へ戻す。ディスプレイシフトも初期位置に戻ります。 | |||
Entry Mode Set | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | カーソルのインクリメント方向、表示シフトを設定します。 I/D=1:右,I/D=0:左 S=1:表示シフトON,S=0:表示シフトOFF |
26.3us | 18.5us | 14.3us |
Display ON/OFF | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | 表示、カーソルON/OFF D=1:ディスプレイON C=1:ブロックカーソルON B=1:ブリンクON |
|||
Corsor or Display Shift | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | x | x | カーソル移動/表示シフト S/C=1:表示シフト,S/C=0:カーソル移動 R/L=1:右,R/L=0:左 |
|||
Function Set | 0 | 0 | 0 | 0 | 1 | DL | N | F | 0 | IS | 通信モード、行数、Font sizeの設定、拡張コマンドモードの指定 DL=1:8bit,DL=0:4bit 常に1でよい。 N=1:2line,N=0:1line F=1:5x10dot,F=0:5x7dot DB1はテスト用なので常に0とする事。 IS=0:通常モード,IS=1:拡張モード |
|||
Set CGRAM address | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | CG RAMのアドレスをセットします。以後CG RAMへのデータアクセスとなる。 | |||
Set DDRAM address | 0 | 0 | 1 | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | DD RAMのアドレス(カーソル位置)をセットします。以後DD RAMへのデータアクセスとなる。 | |||
Write data to RAM | 1 | 0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | CG RAM, DD RAMへのデータWrite | |||
Instruction(IS=1) | RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | Description | 実行時間 OSC Freq= | ||
380KHz | 540KHz | 700KHz | ||||||||||||
Internal OSC freq | 0 | 0 | 0 | 0 | 0 | 1 | BS | F2 | F1 | F0 | 内蔵OSCの周波数調整 BS=1:1/4 bias,BS=0:1/5 bias F2-F0:adjust internal OSC frequency |
26.3us | 18.5us | 14.3us |
Set ICON address | 0 | 0 | 0 | 1 | 0 | 0 | AC3 | AC2 | AC1 | AC0 | Iconの描画が可能な製品で、Icon RAMアドレスを指定する。 | |||
Power/ICON control/ Conterast set |
0 | 0 | 0 | 1 | 0 | 1 | Ion | Bon | C5 | C4 | Iconディスプレイの表示、チャージポンプ回路のOn/Off、コントラスト調整 Ion=0:icon off,Ion=1:icon on Bon=0:booster off,Bon=1:booster on C5-C4:follower modeでコントラスト調整する場合のコントラスト上位2ビット(10bから試すのが良いようだ) |
|||
Follower control | 0 | 0 | 0 | 1 | 1 | 0 | Fon | Rab2 | Rab1 | Rab0 | Follower circuit on/off, LCD駆動電圧の調整 Fon=0:ifollower circuit off,Fon=1:ifollower circuit on Rab2-0:仕様書参照(3.3Vだと100bでよい) |
|||
Contrast set | 0 | 0 | 0 | 1 | 1 | 1 | C3 | C2 | C1 | C0 | コントラスト調整 C3-C0:follower modeでコントラスト調整する場合のコントラスト下位3ビット(000bで良い) |
ディスプレイのマニュアルにI2Cでの通信プロトコルのの記載がある。
Stop condition, Start condition, ACKについてはPIC側でハンドリングされるので割愛する。
Slave address(7bit address)にR/W(Readはサポートされない為常に0となる)を付加した1byteがはじめに送られる。
その後Control byteと呼ばれる特殊なバイト列が送られる。Co bitはContinuation bitと呼ばれ、Stop conditionを挟まずに複数のControl byteを含むコマンドを送信したい場合は1とし、末尾のControl byteや単一のControl byteとデータのペアを送る場合は0とする。RSはInstruction registerへの書き込みの場合は0, Data ragisterへの書き込みの場合1とする。コマンドは1バイトになっているので、常にCo=0として、コマンドを一つ送るごとにStop Conditionとする方法で問題はない。初期化はこの方法で行う必要がある。
図をよく見ると判るのだが、より効率的な方法として、Co=0のControl byteを送った後、任意のバイト数のdata bytesをまとめて送ることもできる。
MCCによりI2Cのライブラリが生成されるので、これを使うことを前提としたプログラムとなっている。
I2Cの通信部分はライブラリが行ってくれるので、LCD側のコマンドや初期化手順のみを実装した。
MCCが生成する関数には、1バイト用、2バイト用、任意のバイト用の関数があるが、コマンドは1バイトx2として扱っているので、I2C1_SetBuffer()のみ使用している。
ライブラリの使い方については、MCCがexampleも生成してくれるので、これを参考にすればよい。
SCLがpull downされていると、初期化の段階でハングする。ICSPでプログラミングして、そのままデバッグしようとすると、この現象が発生する。SCL, SDAがpull upされているか確認するとよい。