ソフトウェアI2CでAQM0802A(キャラクター液晶)を使い遊ぶ。(StampS3)

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

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

結果

![o_coq079.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7246eba3-704f-fb3b-fdaf-ba2b084149eb.jpeg)


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

![o_con368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3d5073cc-0a59-096d-224d-28a2ea379658.jpeg)


プログラム


```c++



//Soft_I2C_AQM0802A_DEMO1_M5S3


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

//A4
#define SDA_0         13
#define SDA_0_HIGH()  digitalWrite(SDA_0, HIGH)
#define SDA_0_LOW()   digitalWrite(SDA_0, LOW)

// 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) ? 256 + buff1[0] : buff1[0] );
  int data_q = (  (buff1[1] < 0) ? 256 + buff1[1] : 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(SCK_0, OUTPUT_OPEN_DRAIN);
  pinMode(SDA_0, OUTPUT_OPEN_DRAIN);
  digitalWrite(SCK_0, HIGH);
  digitalWrite(SDA_0, 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



```