グラフィック液晶(LM32004)を動かしてみる

おじさん工房 TOP へ


2006/07/02

ジャンクでLCDパネルが安くでていることがあります。 これはSHARPのLM32004ですが1〜2年ほど前にQC PASSで1個380円で売っていたものです。 残念ながらこのLCDのデータシートはネットでは見つけることができませんでしたが、使っているIC(HD61105、LA5315、それとセグメントドライバーのHD61104)のデータシートが見つかりましたのでそれらから仕様を類推しました。

■裏から見たところ

LM32004_back

接続コネクターは元は1mmピッチのフレキケーブルでしたが1.27mmピッチのフラットケーブルに付け替えています。
写真の上(赤色の線)を1番ピンとしたとき信号は以下のようになっていました。
  1 Vref = −15V Veeから200KΩの半固定抵抗器でつなぎコントラスト調整
  2 Vee  = −24V
  3 D3
  4 D2
  5 D1
  6 D0
  7 Vee
  8 GND
  9 +5V
 10 CL2(DOT CLOCK)
 11 CL1(LINE CLOCK)
 12 DI(FRAME)
よく必要なM(交流化パルス)は内部(BU6132F)でつくっているらしくコネクターにはでてきていません。
Veeは−24Vとしていますが−18Vから−25VぐらいまででOKです。 コントラストはVrefにつないだ抵抗で調整でき、Vrefが−15Vぐらいが最適でした。 Vrefが−13Vで真っ白(というか透明)で−17Vで真っ黒でした。 Veeは5V〜±12VのDCDCコンバーターでつくりました。 Veeの消費電流は実測1.7mAで、簡単につくったスイッチング電源やコッククロフト(Cockcroft)昇圧ではまかなえませんでした。

■表示させているところ

LM32004

バックライトを点灯させていないのでコントラストが低いですが、文字を順番に表示させています。

右上の四角い金属部品がDCDCコンバーターです。 必要なのは24V2mA程度なのでもっと小さいもので十分です。
コントローラーはATMEGA48を使いました。 これはRAMが1KBしかなくグラフィックRAMの9600バイトどころか、キャラクターRAMの1200バイトも無理なので簡単な固定パターンを表示させただけです。 LCDの表示方法の確認用なのでこれで十分です。 正式に使うときはもっと容量のあるマイコンにするとか、外付けRAMをつけるなどを考えます。

SH も H8 も RAM は小さい。 ちょっと ARM に浮気しようかな。 Philips の LPC2105 は安く( Digikey で 964 円 )て大容量( ROM:128KB RAM:32kB )だし....

フレーム周波数としては通常70Hz程度にしますが、50Hzまで下げてもフリッカーは問題ありませんでした。 さすがに40Hzにするとフリッカーが感じられます。 フレーム周波数を50Hzとするとライン周波数は50x240=12KHz(83μs)となり、この周期で割り込みをかけてドットクロックやデータなどを作ります。 24.576MHzのクロックでCPU使用率は80%ぐらいでした。

グラフィックLCDはたいていドライバーがついたかたちでモジュール化されていて今回と同じような方法で簡単に使うことができます。 今後いろいろなLCDを見つけたときに共通にテストするプラットフォームとしてこれを使う予定です。


以下はLCDコントロール部分のプログラムリストです。
実際のプログラムは自作OSのもとで動いていますのでもっといろいろついていますが...
  TCCR2B = 0x02;		// クロック分周 1/8
//  OCR2A  = 0xB9;		// 24.576MHz/8/16.5KHz-1 = 185  fv=70Hz
//  OCR2A  = 0xD4;		// 24.576MHz/8/14.4KHz-1 = 212  fv=60Hz
  OCR2A  = 0xFF;		// 24.576MHz/8/12.0KHz-1 = 255  fv=50Hz
  _SFR_BYTE(TIMSK2) |= _BV(OCIE2A);	// タイマー2比較A割り込み許可
  
//───────────────────────────────────
// タイマー2比較A割り込みハンドラー
//───────────────────────────────────
SIGNAL(SIG_OUTPUT_COMPARE2A) {
  static UB line=0;
  UB i, CTRL, CTRL_DOTCLK_H, CTRL_DOTCLK_L, data, data1, ch;
  B  *pfont;
  
  if( line == 239 ) { line = 0;
  } else {            line++;  }
  
  if( line == 1 ) { sbi( LCDCTRL_PORT, FRAME );
  } else {          cbi( LCDCTRL_PORT, FRAME );  }
  
  cbi( LCDCTRL_PORT, LINECLK );       // LINE CLOCK = L
  
  CTRL = LCDCTRL_PORT;
  CTRL_DOTCLK_H = CTRL | 0x01;
  CTRL_DOTCLK_L = CTRL & 0xFE;
  
  for( i=0; i<40; i++ ) {
    ch = (((line & 0xF8)>>3)+i+0x20) & 0x7F;
    pfont = (B *)&font_han8[ch*8+(line&0x07)];
    data = (PRG_RDB(pfont));
    LCDCTRL_PORT = CTRL_DOTCLK_H;  // sbi は2クロックなので1クロックですむようにした
    LCDDATA_PORT = data;
    LCDCTRL_PORT = CTRL_DOTCLK_L;
    data1 = data<<4;
    LCDCTRL_PORT = CTRL_DOTCLK_H;
    LCDDATA_PORT = data1;
    LCDCTRL_PORT = CTRL_DOTCLK_L;
  }
  
  sbi( LCDCTRL_PORT, LINECLK );       // LINE CLOCK = H
}




inserted by FC2 system