aitendoのTN液晶をarduinoで制御してみる

aitendoで99円くらいで売っていたTN液晶をArduinoから制御してみます。

たぶんこれ
http://www.aitendo.com/product/4410

HT1621BというチップでSPIみたいなインターフェースがある模様。
ネット上でもいくつか作例を見つけました。


  • CS
    • チップセレクト
  • RD
    • 読み出しの時に使うっぽい 今回は使わない
  • WR
    • 書き込みの時のクロック
  • DATA
    • データ線
  • GND
  • VDD
  • LED A
    • バックライト アノード
  • LED K
    • バックライト カソード

で、CSを HIGH->LOWして WRを動かしながらDATAからデータを流していく。

調べた所

SYS EN 100 0000-0001-0 -
BIAS 100 0010-1001-0 1/3bias 4 commons option
LCD ON 100 0000-0011-0 -

まで流すと初期化完了らしい。
読みやすいようにいろいろ書いたが、真ん中の列にある0や1をこの順で書きだせばOK

先頭の100がコマンドモード 後続の9ビットが引数のようなものらしい。

続いてデータの書き込み

DATA 101 AAAAAA DDDD .... Aはアドレス、以降4ビット単位でアドレスをずらしながら書き込んでいく。(例ではDと表記)

今の所とにかく各セグメントを点滅させるところまで出来た。

どのアドレスがどのセグメントに対応しているかはこれから調べる予定。

さて、何に使おうか

#define WR 6
#define DATA 7
#define CS 8

void data(bool b){
  digitalWrite(WR, LOW);
  digitalWrite(DATA, b);
  digitalWrite(WR, HIGH);
}
void com(bool b0, bool b1, bool b2){
  data(b0);
  data(b1);
  data(b2);
}
void op(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7, bool b8){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
  data(b4);
  data(b5);
  data(b6);
  data(b7);
  data(b8);
}

void op4(bool b0, bool b1, bool b2, bool b3){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
}
void op6(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5){
  data(b0);
  data(b1);
  data(b2);
  data(b3);
  data(b4);
  data(b5);
}
void setup() {
  pinMode(WR, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CS, OUTPUT);
  
  
  digitalWrite(CS, HIGH);
  
  // == 9bit code sequence ==
  // SYS EN  100 0000-0001-X
  // BIAS    100 0010-1001-X 1/3bias 4 commons option
  // LCD ON  100 0000-0011-X
  
  // pattern

  // BIAS    100 0010-0000-X 1/2bias 2 commons option
  // BIAS    100 0010-0100-X 1/2bias 3 commons option
  // BIAS    100 0010-1000-X 1/2bias 4 commons option
  
  // BIAS    100 0010-0001-X 1/3bias 2 commons option
  // BIAS    100 0010-0101-X 1/3bias 3 commons option
  // BIAS    100 0010-1001-X 1/3bias 4 commons option

  
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,0,0, 0,0,0,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,1,0, 1,0,0,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  com(1,0,0); op(0,0,0,0, 0,0,1,1, 0);
  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  
  com(1,0,1); op6(0,0,0,0,0,0);

  op4(1,1,1,1);  
  op4(1,1,1,1);  
  op4(1,1,1,1);  
  op4(1,1,1,1);  
  
//  for(int i = 0; i < 100; i ++){
//    op4(0,0,0,0);
//  }

  digitalWrite(CS, HIGH);
  digitalWrite(CS, LOW);
  
  int count = 0;

  while(true){
    digitalWrite(CS, HIGH);
    digitalWrite(CS, LOW);
    com(1,0,1); op6(0,0,0,0,0,0);
    for(int i = 0; i < 64+8; i ++){
      data(i >= count);
    }
    count ++;
    delay(50);
    
    if(count >= 64 + 8){
      count = 0;
    }
  }
}

void loop() {
}