JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

ATtiny402 AQM0802A表示テスト

2023-09-13 16:36:33 | ATtiny
 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桁までの数値を表示するだけなので、この方法にしました。