STM32G031のArduinoでの液晶,AQM0802Aで表示(STM32G031J6M6)(i2c)


AQM0802Aとは、秋月で売っているi2cの液晶である。
なにがすごいのかと言うと信号線2本でマイコンと接続できる。
8文字2行のキャラクター液晶である。

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

おまけ
古いスイッチサイエンスのソースを使っています。

x PA11,PA12は、いつも間違えるので各自確認のこと

STM32G031を使用した。液晶時計ができました。
STM32G031のArduinoでの時計,DS1307で時刻表示( AQM0802A i2c)(STM32G031J6M6)
https://qiita.com/caa45040/items/fee158b4d04a5139bae0

LPC1114のMbedでの時計,DS1307で時刻表示( AQM0802A i2c)(ハードはichigojam)
https://qiita.com/caa45040/items/5f0e7f0f3ebcae613ec2



#include <Wire.h>

#define vddPin 16    // ArduinoA2
#define gndPin 17    // ArduinoA3
//#define sdaPin 18    // ArduinoA4
//#define sclPin 19    // ArduinoA5

#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5


#define I2Cadr 0x3e  // 固定
byte contrast = 35;  // コントラスト(0~63)

void setup() {
  pinMode(gndPin, OUTPUT);
  digitalWrite(gndPin, LOW);
  pinMode(vddPin, OUTPUT);
  digitalWrite(vddPin, HIGH);
  delay(500);
  //Wire.begin();
  Wire.begin(sdaPin,sclPin);
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00111001); // function set
  lcd_cmd(0b00000100); // EntryModeSet
  lcd_cmd(0b00010100); // interval osc
  lcd_cmd(0b01110000 | (contrast & 0xF)); // contrast Low
  lcd_cmd(0b01011100 | ((contrast >> 4) & 0x3)); // contast High/icon/power
  lcd_cmd(0b01101100); // follower control
  delay(200);
  lcd_cmd(0b00111000); // function set
  lcd_cmd(0b00001100); // Display On
  lcd_cmd(0b00000001); // Clear Display
  delay(2);
}

void loop() {
  lcd_setCursor(0, 0);
  lcd_printStr("SWITCH");
  lcd_setCursor(0, 1);
  lcd_printStr("SCIENCE");
  delay(100);
}

// コマンド RSを0
void lcd_cmd(byte x) {
  Wire.beginTransmission(I2Cadr);
  Wire.write(0b00000000); // CO = 0,RS = 0
  Wire.write(x);
  Wire.endTransmission();
}

// データ RSを1
void lcd_contdata(byte x) {
  Wire.write(0b11000000); // CO = 1, RS = 1
  Wire.write(x);
}

//ラストのデータは、COは、0
void lcd_lastdata(byte x) {
  Wire.write(0b01000000); // CO = 0, RS = 1
  Wire.write(x);
}

// 文字の表示
void lcd_printStr(const char *s) {
  Wire.beginTransmission(I2Cadr);
  while (*s) {
    if (*(s + 1)) {
      lcd_contdata(*s);
    } else {
      lcd_lastdata(*s);
    }
    s++;
  }
  Wire.endTransmission();
}

// 表示位置の指定
void lcd_setCursor(byte x, byte y) {
  lcd_cmd(0x80 | (y * 0x40 + x));
}