ソフトウェアI2CでAQM0802Aを使い遊ぶ。(STM32C011J4M7)


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


目的
ソフトウェアI2Cで遊ぶ


結果

![o_coq075.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4d58a75a-f371-dc64-335e-4857d79fc7fc.jpeg)


文字の「0」を出力する時のイメージ

![o_con368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a34339c3-2f0e-f983-7c94-f419af8bd99f.jpeg)


プログラム


```c++



//Soft_I2C_AQM0802A_DEMO1_C011


//定義
//A5
#define SCK_0_HIGH()  digitalWrite(PA8, HIGH)
#define SCK_0_LOW()   digitalWrite(PA8, LOW)

//A4
#define SDA_0_HIGH()  digitalWrite(PA12, HIGH)
#define SDA_0_LOW()   digitalWrite(PA12, LOW)
#define SDA_O         A4

// 1000us   1kh
//  100us  10kh
//   10us 100kh
#define myDelay()  delayMicroseconds(100);

//i2cバッファー
char data_read[4];

//初期レジスター
char INIT_com[] = {
  0x0, 0x38, //1
  0x0, 0x39, //2
  0x0, 0x4,  //3
  0x0, 0x14, //4
  0x0, 0x70, //5
  0x0, 0x56, //6
  0x0, 0x6C, //7
  0x0, 0x38, //8
  0x0, 0xC   //9
};

//画面のクリアレジスター
char INIT_cls[] = {0x0, 0x1};


//i2c書き込みルーチン
void i2c_lcd_w(char *buff1) {

  int add_p = 0x7C;
  int data_p = (  (buff1[0] >= 0) ? buff1[0] : 256 + buff1[0]   );
  int data_q = (  (buff1[1] >= 0) ? buff1[1] : 256 + buff1[1]   );

  int ii;

  //待ち
  SDA_0_HIGH();
  SCK_0_HIGH();
  myDelay();
  myDelay();
  myDelay();

  //START
  SDA_0_LOW();
  myDelay();
  SCK_0_LOW();
  myDelay();

  for (ii = 0; ii < 8; ii++) {
    SCK_0_LOW();
    if ( ((add_p << ii) & 0x80) == 0 ) {
      SDA_0_LOW();
    } else {
      SDA_0_HIGH();
    }//endif
    myDelay();
    SCK_0_HIGH();
    myDelay();
  }//for

  //ack
  SCK_0_LOW();
  SDA_0_HIGH();
  myDelay();
  SCK_0_HIGH();
  myDelay();

  for (ii = 0; ii < 8; ii++) {
    SCK_0_LOW();

    if ( ((data_p << ii) & 0x80) == 0 ) {
      SDA_0_LOW();
    } else {
      SDA_0_HIGH();
    }//endif

    myDelay();
    SCK_0_HIGH();
    myDelay();
  }//for

  //ack
  SCK_0_LOW();
  SDA_0_HIGH();
  myDelay();
  SCK_0_HIGH();
  myDelay();

  for (ii = 0; ii < 8; ii++) {
    SCK_0_LOW();

    if ( ((data_q << ii) & 0x80) == 0 ) {
      SDA_0_LOW();
    } else {
      SDA_0_HIGH();
    }//endif

    myDelay();
    SCK_0_HIGH();
    myDelay();
  }//for

  //ack
  SCK_0_LOW();
  SDA_0_HIGH();
  myDelay();
  SCK_0_HIGH();
  myDelay();

  //STOP
  SCK_0_LOW();
  SDA_0_LOW();
  myDelay();
  SCK_0_HIGH();
  myDelay();
  SDA_0_HIGH();
  myDelay();

}//i2c_lcd_w


void ns_putc(char ch)
{

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

  //I2Cに送信
  i2c_lcd_w(data_read);

}//ns_putc


void ns_puts(const char *str1)
{

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

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

  }//while

}//ns_puts


//カーソルの移動
void setCursor(int col, int rows)
{

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

  //I2Cに送信
  i2c_lcd_w(data_read);

}//setCursor


void Soft_I2C_begin() {

  pinMode(PA12, OUTPUT_OPEN_DRAIN);
  pinMode(PA8, OUTPUT_OPEN_DRAIN);
  digitalWrite(PA12, HIGH);
  digitalWrite(PA8, HIGH);

}//Soft_I2C_begin

//初期化関数
void setup()
{

  //I2Cの初期化
  Soft_I2C_begin();

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

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

  //表示
  setCursor(0, 0); ns_puts("HELLO");
  setCursor(0, 1); ns_puts("WORLD");

}//setup


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



```