ATtiny402でI2C LCD AQM0802Aの表示テストをします。
AQM0802Aは秋月電子で販売しているモジュールを使います。
AQM0802Aの電源電圧は。3.3Vですので、ATtinyも3.3V(乾電池2本)で動作させることにします。
テストの前に、ATtiny402がVDD=3.3V(乾電池2本)でUPDIで書き込めるかどうか試しました。下の回路図のように乾電池から電源を供給し、FT234からはTXDとRXDだけを利用してプログラムの書き込みができました。
AQM0802AはATtiny402のPA1(SDA)とPA2(SCL)に接続します。I2Cのプルアップ抵抗は、AQM0802Aモジュールに内蔵されているのでつけていません。
AQM0802A表示のライブラリはいくつかあります。
FaBo 213 LCD mini AQM0802A と
arduino_ST7032-master を試しましたが、コントラストの設定が悪いのかうまく表示しませんでした。それではとイニシャライズからプログラムを組んでみました。「NobのArduino日記!」のこちらの記事を参考にさせていただきました。ありがとうございました。
テストしたスケッチです。1行目に文字列「JH7UBC」を表示し、2行目に数値を0から255まで1秒ごとにカウントアップします。
-----------------------------------------------------------------------------------
/*
* ATtiny402 AQM0802A test
* 2023.9.13
* JH7UBC Keiji Hata
*/
#include <Wire.h>
bool zflag = true;
//コマンド書き込み
void writeCommand(byte com){
Wire.beginTransmission(0x3E);
Wire.write(0x00);
Wire.write(com);
Wire.endTransmission();
}
//データ書き込み
void writeData(byte data){
Wire.beginTransmission(0x3E);
Wire.write(0x40);
Wire.write(data);
Wire.endTransmission();
}
//カーソルセット
void setCursor(byte x,byte y){
if(y==0){
writeCommand(0x80+x);
}else if(y==1){
writeCommand(0xC0+x);
}
}
//1文字表示
void printChar(char c){
writeData((int)(c));
}
//文字列表示
void printStr(char *s){
while(*s){
printChar(*s++);
}
}
//数字表示(0消しあり)
void printN(byte num){
if(zflag==true){
writeData(0x20);//space表示
}else{
writeData(num + 0x30);//ASCII code
}
}
//数値表示
void printNum(int n){
zflag = true;
byte d2 = n / 100;
if(d2 != 0)zflag=false;
printN(d2);
byte d1 = (n % 100)/10;
if(d1 != 0)zflag=false;
printN(d1);
byte d0 = n % 10;
writeData(d0 + 0x30);
}
void lcd_init(){
writeCommand(0x38);//Function set
writeCommand(0x39);//Function set
writeCommand(0x14);//Internal OSC frequency
writeCommand(0x73);//Contrast set
writeCommand(0x56);//Power/ICON/Contrast control
writeCommand(0x6C);//Fllower control
delay(200);
writeCommand(0x38);//Function set
writeCommand(0x0C);//Display ON/OFF control
writeCommand(0x01);//Clear display
delay(1);
}
void setup() {
Wire.begin();
lcd_init();
printStr("JH7UBC");
}
void loop() {
for(int i=0;i<256;i++){
setCursor(0,1);
printNum(i);
delay(1000);
}
}
----------------------------------------------------------------
ATtiny402のクロックは16MHzとしてコンパイルしました。
VDD=5Vの時は、Contrast setは0x7A、Power/ICON/Contrast controlは0x54とすればよいようです。
このプログラムで、フラッシュメモリ1583バイト(38%)、RAMは98バイト(38%)を使っています。
ブレッドボードです。
数値の表示は。強引に割り算と剰余を利用しています。もっとうまい方法があると思うのですが、今回はとりあえず3桁までの数値を表示するだけなので、この方法にしました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます