Arduino UNOのI2Cを使い、AQM0802A液晶で文字表示(ライブラリ化)


x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!


目的
I2C液晶のテスト


![o_cop198.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/532fbaf5-df8f-1cf1-eaa8-ffe4ee8ad3ea.jpeg)



メインプログラム


```c++



//I2C_LCD_AQ_UNO_1

#include <Arduino.h>
#include <Wire.h>

#include "I2C_LCD_AQ_UNO_1.h"

//初期化
void setup()
{

  lcd.begin(16, 2);

  delay(200);      //0.2秒の待ち

  lcd.clear();

} //setup


//カウンター
unsigned char LL = 0;


//メインループ
void loop()
{

  //lcd.clear();

  //文字列の表示
  lcd.setCursor(0, 0);
  lcd.print("HELLO");

  //4桁の値の表示
  lcd.setCursor(0, 1);
  lcd.print(  (int)(LL++)  );

  //1秒の待ち
  delay(1000);

} //loop




```


I2C_LCD_AQ_UNO_1.hのプログラム


```c++



//I2C_LCD_AQ_UNO_1.h

// I2C  address.
#define I2Cadr  0x3e  // 固定


char    data_read[2] = {'@', 't'}; //i2cバッファー


//液晶初期化配列
char INIT_com[] = {0x0, 0x38,
                   0x0, 0x39,
                   0x0, 0x4,
                   0x0, 0x14,
                   0x0, 0x70,
                   0x0, 0x56,
                   0x0, 0x6C,
                   0x0, 0x38,
                   0x0, 0xC,
                   0x0, 0x1,
                   0x40, 0x41
                  };


//オールクリア
char INIT_cls[] = {0x0, 0x1};


//I2Cに2文字送る
void i2c_led_w(char *buff1) {
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_led_w


//液晶に一文字送信する
void seg1(char ch)
{

  data_read[0] = '@';
  data_read[1] = ch;

  //I2Cに送信
  i2c_led_w(data_read);
  delay(60);//1mS待つ　連続送信防止用　受信落ち対策

}//seg1


//LCD初期化関数
void lcd_int1()
{


  //i2cの初期化
  Wire.begin(); //STM32G071


  //液晶の初期化
  for (int ii = 0; ii < 11; ii++) {
    i2c_led_w(&INIT_com[ii * 2]);
  } //for


  //画面クリア
  //clear()

}//lcd_int1


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{
  ch_hex_a_b[4] = 0;

  if       ( x >= 9000 ) {
    x = x - 9000; ch_hex_a_b[0] = '9';
  } else if ( x >= 8000 ) {
    x = x - 8000; ch_hex_a_b[0] = '8';
  } else if ( x >= 7000 ) {
    x = x - 7000; ch_hex_a_b[0] = '7';
  } else if ( x >= 6000 ) {
    x = x - 6000; ch_hex_a_b[0] = '6';
  } else if ( x >= 5000 ) {
    x = x - 5000; ch_hex_a_b[0] = '5';
  } else if ( x >= 4000 ) {
    x = x - 4000; ch_hex_a_b[0] = '4';
  } else if ( x >= 3000 ) {
    x = x - 3000; ch_hex_a_b[0] = '3';
  } else if ( x >= 2000 ) {
    x = x - 2000; ch_hex_a_b[0] = '2';
  } else if ( x >= 1000 ) {
    x = x - 1000; ch_hex_a_b[0] = '1';
  } else                 {
    ch_hex_a_b[0] = '0';
  }//if

  ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
  x = DIV10(x);                                     // 12 <= 123 / 10
  ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
  ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

  return (ch_hex_a_b);
} //ch_hex_a


//クラスの定義
struct _lcd {
  void begin(int col, int rows);     //メソッドの宣言
  void clear();                      //メソッドの宣言
  void setCursor(int col, int rows); //メソッドの宣言
  int  write(char ch);               //メソッドの宣言
  int  print(char *str1);            //メソッドの宣言
  int  print(int num);               //メソッドの宣言 オーバーロード
};

//ポートをhiにする 初期化
//メソッドの定義
void _lcd::begin(int col, int rows)
{
  lcd_int1();
}//begin


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::clear()
{

  //画面のクリア
  i2c_led_w(INIT_cls);


}//begin

//ポートをhiにする 初期化
//メソッドの定義
void _lcd::setCursor(int col, int rows)
{

  data_read[0] = 0x0;
  data_read[1] = 0x80 + ( (rows * 0x40) + col ); //1ライン目にカーソルを移動

  i2c_led_w(data_read);

}//begin


//液晶への一文字出力
//メソッドの定義
int _lcd::write(char ch)
{
  seg1(ch);

  return (0);
}//write


//文字列の表示
//メソッドの定義
int _lcd::print(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    write(*str1 ++);

  } //while

  //戻り値
  return (0);
}//print


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _lcd::print(int num)
{
  if (num < 0) {
    write('-');
    num = 0 - num;
  }

  char *str1 = ch_hex_a(num);

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    write(*str1 ++);

  } //while

  //戻り値
  return (0);
}//print


//実体の作成
_lcd lcd;





```