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

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


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

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と表記)|

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

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

さて、何に使おうか

>> code cpp
int led = 13;
#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(led, OUTPUT);
  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() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}
<<
5643382
wiki
1458311454