I2C接続LCDモジュール(ST7032i)の使い方

PCB

ST7032iの特徴

I2Cインターフェースを使用したキャラクタモジュール製品(検証にはAQM0802を使用)をを例にに説明します。

LCDモジュールの仕様について

ピンアサイン

Pin No Pinout Description 備考
1VOTest pinOpenでよい。
2VOUTDC/DC voltage converter3.5V未満の電源で、内蔵のチャージポンプを使ってLCDの電源を作り出すときに使用する。VINとの間に0.1-1uFのコンデンサを接続する。LCDモジュールではVINはVDDと接続されている。
3CAP1NFor voltage booster circuit内蔵のチャージポンプを使ってLCDの電源を作り出すときに使用する。0.47-22uFのコンデンサを接続する。
4CAP1P
5VDD電源(3.3V)コントローラーは2.7-5.5Vカバーするので、周辺回路次第で3V,5V対応している製品もある。
ノイズ対策のため、VDD-VSS間に0.1uF程度のコンデンサを接続する事が推奨されます。
6VSSGND
7SDAI2C data
8SCLI2C clock imput
9XRSETBResetPower on resetのみで良い場合VDDに接続しておく。

マイコンとの接続例

module connection example

DDRAMアドレッシング

モジュールの桁数や行数、表示モードにより、アドレッシングが異なります。

基本的に80文字分のメモりがあり、そのうち表示可能な範囲を表示しています。表示されているかに関らず、任意の位置にWrite可能です。

16x1モードの場合

1 2 3 ... 39 40 41 ... 78 79 80
00h 01h 02h ... 26h 27h 28h ... 4Dh 4Eh 4Fh

16x2モードの場合

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の設定により変更できるため、モジュールにより異なります。

Character code table CGRAM size configuration

CG RAMアドレッシング

CGRAM Addressing

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データフォーマット

I2C protocol

ディスプレイのマニュアルに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をまとめて送ることもできる。

初期化処理

initialization procedures

PICとの接続

プログラミング

MCCによりI2Cのライブラリが生成されるので、これを使うことを前提としたプログラムとなっている。
I2Cの通信部分はライブラリが行ってくれるので、LCD側のコマンドや初期化手順のみを実装した。
MCCが生成する関数には、1バイト用、2バイト用、任意のバイト用の関数があるが、コマンドは1バイトx2として扱っているので、I2C1_SetBuffer()のみ使用している。
ライブラリの使い方については、MCCがexampleも生成してくれるので、これを参考にすればよい。

トラブルシュート

SCLがpull downされていると、初期化の段階でハングする。ICSPでプログラミングして、そのままデバッグしようとすると、この現象が発生する。SCL, SDAがpull upされているか確認するとよい。

Source files

ST7032i.X.7z

参考資料

ST7032 Datasheet