aitendoで99円くらいで売っていたTN液晶をArduinoから制御してみます。
たぶんこれ
http://www.aitendo.com/product/4410
HT1621BというチップでSPIみたいなインターフェースがある模様。
ネット上でもいくつか作例を見つけました。
- http://honda.way-nifty.com/pocky/2013/09/tnts125v2-c211.html
- http://nakjack.blog.so-net.ne.jp/2013-01-13
- 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() { }