PW160128LCD設定編 [MSP430]
例のパラレル/シリアルインタフェースを持つ、16階調グレースケール 160×128ピクセルLCDの設定を幾つかいじってみました。
まずこれは、昨日作成したBMP変換ツールで出力したデータをそのまま転送した物。 この状態を正常としますね。 | |
初期化コマンドの一部を変更するだけで、画面を上下反対にできます。 | |
これまた初期化コマンドの一部を変更するだけで、ネガにもできます。 |
よくできておりますね。
※コントラストについて。
コントラストは電源電圧に大きく依存します。初期化コマンドの一部にboostが有るのですが、これでLCDコントラスト電圧をどれ位発生するのかを決める事ができます。
勿論発生電圧が高い方がコントラストが大きくなるのですが、このLCDを3V程度で動作させる時は×4で動かしています。
さて、SPYBIWIREで動かすと、電源電圧が3.6Vとなってしまい(既に定格オーバーと言う話も)、SPYBIWIREで動かした設定を電池駆動に適用するとコントラストが小さく、よく見えません。
boostをいじると極端にコントラストが変ってしまうので、biasをいじる方が良さそうです。
以下に初期化コードを書いてみます。
//ソフトウエアリセット
SPI_Write( CMD_MODE, 0xf0 ); //bank0
SPI_Write( CMD_MODE, 0x81 ); //software reset
ms_wait( 50 ); //50ms待ちに入る
//EM65101のEEPROMからの読み出し
SPI_Write( CMD_MODE, 0xf2 ); //bank2
SPI_Write( CMD_MODE, 0x53 ); //read extension command
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x52 ); //read extension command
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x51 ); //read EEPROM CV5~CV4
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x50 ); //read EEPROM CV3~CV0
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
//EM65101のパラメータ設定
SPI_Write( CMD_MODE, 0xf0 ); //bank0
// SPI_Write( CMD_MODE, 0xb5 ); //booster=6x
SPI_Write( CMD_MODE, 0xb3 ); //booster=4x
SPI_Write( CMD_MODE, 0x8a ); //power circuit ON
SPI_Write( CMD_MODE, 0xc8 ); //1/12 bias(電源電圧が3.6Vの時のバイアス)
// SPI_Write( CMD_MODE, 0xc6 ); //1/12 bias(電源電圧が3Vの時のバイアス)
SPI_Write( CMD_MODE, 0xa8 ); //128duty
SPI_Write( CMD_MODE, 0x90 ); //128duty
SPI_Write( CMD_MODE, 0x73 ); //X,Y address auto increment
SPI_Write( CMD_MODE, 0x00 ); //Start X address = 00
SPI_Write( CMD_MODE, 0x10 ); //Start X address = 00
SPI_Write( CMD_MODE, 0x20 ); //Start Y address = 00
// SPI_Write( CMD_MODE, 0x51 ); //Display ON(倒置)
SPI_Write( CMD_MODE, 0x59 ); //Display ON(通常)
SPI_Write( CMD_MODE, 0x69 ); //REV=1,REF=1(ネガ)
// SPI_Write( CMD_MODE, 0x60 ); //REV=0,REF=0(ポジ)
SPI_Write( CMD_MODE, 0xf1 ); //bank1
SPI_Write( CMD_MODE, 0x23 ); //Contrast value=0x3a
SPI_Write( CMD_MODE, 0x1a ); //Contrast value=0x3a
SPI_Write( CMD_MODE, 0x40 ); //OSC = 1x
SPI_Write( CMD_MODE, 0x58 ); //Booster frequency = 6KHz
SPI_Write( CMD_MODE, 0x64 ); //RM=8x
SPI_Write( CMD_MODE, 0xf2 ); //bank2
SPI_Write( CMD_MODE, 0xe3 ); //whole picture setting
SPI_Write( CMD_MODE, 0xf0 ); //bank0
結局のところコントラストは電源電圧に依存してしまうので、もっとも良いのは電源電圧をモニタして、その電圧によって初期化パラメータを変えるのが良いでしょう。
電池駆動システムを考える時、割と電源電圧とか、ボード上の温度とかの情報が欲しくなります。
この点、MSP430にしろ、HCS08にしろ、内部のA/Dコンバータの一部の入力にこれらの入力があり、とても重宝します。
逆にR8Cなんかも電池駆動ソリューションを目指してはいるのでしょうけれど(例えば秋月で売り出したR8C/29シリーズ)、内部に電圧や温度を計測する要素が無い。非常に残念です。
最近、パスワードって言うときにパスワールドって言いそうになりますよ。
by k_t (2007-12-20 17:09)
↑ふふふ、密かにimprinting中です。
by hamayan (2007-12-20 17:27)