(注)本記事は筆者が私的利用のためにST7032iデータシートを抜粋翻訳したものです。いかなる問題に対しても責任は負いません。
はじめに
I2C接続小型8文字×2行液晶の制御として使用されているST7032iチップのデータシートを実際の使用時に必要なものを抜粋して日本語訳したものです。
より詳細な情報が欲しい場合はデータシートの参照をお願いいたします。
また、動作確認としては秋月で販売しているAQM0802A-RN-GBWを使用して行いました。
I2C仕様
■ スレーブアドレス:0b00111110(0x3E)
- R/W=0(Writeオンリー)
■ コントロールバイト
- 制御コマンドを送る場合:RS=0
- 描画データを送る場合:RS=1
- 単発送信:Co=0
- 連続送信:Co=1
動作テストでは以下のデータを関数化して使用する。
制御コマンド送信:0b00000000;
描画データ送信:0b01000000;
初期化
描画
描画ポジション
描画ポジションはAddress Counter(AC)を指定することで描画位置を設定する。以降の説明は2行ディスプレイ設定でのACで進めていく。
2行表示の場合、1行目は0x00~0x27であり2行目は0x40~0x67である。
ACを指定するコマンドはSet DDRAM Address
MSBは1固定でAC0~AC6にアドレスを設定します。また、描画データを送信するたびにACは1づつインクリメントされます。
今回動作確認用として使用しているLCDは8文字2行なので行を変えるときは制御が必要です。
描画キャラクターマトリクス
描画するデータはマトリクス表に従い送信する必要があります。
例えば、【%】を表示したい場合は上位4ビットを0010、下位4ビットを0101と指定します。
0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
動作テスト
動作テストです。8文字2行をフルに使用して乱数を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <Wire.h> #define ADDRESS 0b0111110 //書き込みのためにLSB=0 #define Command 0b00000000 //Co:0/Rs:0 #define Address 0b01000000 //Co:0/Rs:1 void commWrite(byte cData){ Wire.beginTransmission(ADDRESS); Wire.write(Command); Wire.write(cData); Wire.endTransmission(); delay(10); } void dataWrite(byte dData){ Wire.beginTransmission(ADDRESS); Wire.write(Address); Wire.write(dData); Wire.endTransmission(); delay(10); } void dispInit(){ delay(50); commWrite(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commWrite(0x39);//external table use delayMicroseconds(30); commWrite(0x14);//VDD3V:183Hz/VDD5V:192Hz delayMicroseconds(30); commWrite(0x73);//コントラストC3,C2,C1,C0 delayMicroseconds(30); commWrite(0x52);//ICON-off/内部昇圧回路-off/コントラストC5,C4 delayMicroseconds(30); commWrite(0x6C);//内部フォロワ回路off,V0の増幅比 delay(250); commWrite(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commWrite(0x0C);//display-on/cursor-off/画面反転-off delayMicroseconds(30); commWrite(0x01);//ディスプレイON } void setup() { Wire.begin();//マスター設定 dispInit(); } void loop() { long val=random(100000000000000);//最大16桁の乱数生成 long m,n; commWrite(0b10000000);//1行目 m=1000000000000000; n=100000000000000; for(int i=0;i<8;i++){ dataWrite(0b00110000|(val%m/n));//上位8桁分を分解 m=m/10; n=n/10; } commWrite(0b11000000);//2行目 m=100000000; n=10000000; for(int i=0;i<8;i++){ dataWrite(0b00110000|(val%m/n));//下位8桁分を分解 m=m/10; n=n/10; } delay(1000); } |
サンプルコードでは最大16桁の乱数を生成してLCDに表示させています。
行変換の制御は上位8桁をforループで分解したら、2行目を設定して下位8桁をforループで分解し表示させています。
コメント