STM32G031とI2Cスレーブでマスターから送信された文字を液晶に表示(ACM1602K-NLW-BBW)


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


x まだ試していない　動作確認した2022/2/19_16:11
x なんかジャムる swdに繋いでいたから?
x 74hc164を使用


目的
　I2Cに送られた文字を液晶に表示


![o_con184.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e1f6f3e8-10b1-c09f-3476-687bbe434650.jpeg)


![o_con185.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8d7c5c00-76f9-126d-8897-eb9716a3cd41.jpeg)




キャラクター液晶		ACM1602K-NLW-BBW	P-10185 1個
STM32 8ピン　マイコン		STM32G031J6M6		I-15688 1個
コンデンサー　10uF 3216		GRM319B31C106KE15D	P-12730 2個
チップ抵抗器　10kΩ 3216	RG3216P-1002-B-T5	R-11802 2個
半固定ボリューム　10kΩ		TSR-065-103-R		P-06063 1個
電圧レギュレータ　3.3V		AP7333-33SAG		I-11360 1個


-250-

![o_con250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f414b9dd-93dc-76f8-9e0a-f03dd4af4ec1.jpeg)

-252-

![o_con252.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9f037001-6217-3505-2cb8-4e2541dbef18.jpeg)

-251-

![o_con251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d2c4ce3d-95c0-769d-9046-199bed313671.jpeg)

-253-

![o_con253.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/285e5cb2-e2d7-6bb7-1f5d-ee4353521122.jpeg)

-254-

![o_con254.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2b5307a7-2dbe-24a3-e7c6-0fe6484b9f41.jpeg)

-255-

![o_con255.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/97faed49-7d0a-2e61-fbe0-b24c722b91a1.jpeg)

-198-

![o_con198.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/35409532-dbfe-6b5a-a052-9798ba770cc3.jpeg)

-256-

![o_con256.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/31da6ea0-333c-822c-dcc1-9541797a6fa3.jpeg)

-257-

![o_con257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/722a3a49-58ca-e00f-b118-7ea066b3ac23.jpeg)


-190-


![o_con190.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/27be3080-47dd-4a1a-0328-da097f50ff87.jpeg)

-240-

![o_con240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e485ec41-d6f7-0b1b-d512-c62e5539708e.jpeg)



-272-


![o_con272.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8121a09a-bea8-a3c2-b9ad-cdf857dfd040.jpeg)




```c++



//i2c_s_LCD_031_d1_1

#include <Arduino.h>
#include <Wire.h> //I2Cのヘッダー

//*          *****  *****
//*         *       *    *
//*         *       *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****

#define DW   digitalWrite

#define swdclk   PA14 // 8pin
#define swdio    PA13 // 7pin
//#define swdclk   PA11 // 5pin
//#define swdio    PA12 // 6pin
//#define swdclk   PA12 // 6pin
//#define swdio    PA11 // 5pin
//#define t_led1   PA12 // 6pin
//#define t_led2   PA11 // 5pin
//#define en       PA0  // 4pin
//#define in7      PB7  // 1pin
#define en      PB7  // 1pin


//              12345678   12345678   12345678   12345678
char b8[8] = {0b10000000, 0b01000000, 0b00100000, 0b00010000,
              0b00001000, 0b00000100, 0b00000010, 0b00000001
             };

void seg1(int v, int rs)
{
  for (int jj = 0; jj < 8; jj++) {
    if ( (v & b8[jj]) == 0 ) {
      DW(swdio, 0); //ビットが0
    } else {
      DW(swdio, 1); //ビットが1
    }//endif
    DW(swdclk, 1);
    DW(swdclk, 0);
  }//for

  DW(swdio, rs);
  DW(en, 1); delay(1); //delayMicroseconds(40);
  DW(en, 0);
}//seg1

//文字列の表示 nana_seg
int ns_printf(char *str1) {

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

    //一文字出力
    seg1( *str1 ++ , 1  );

  } //while

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

int lcd_int[] = {
  0x30, 0x30, 0x30, 0x38, 0x08, 0x01, 0x06, 0x08 + 0x04
};//lcd_init

void setup() {

  delay(3000); //not Delete

  //GPIO初期化
  pinMode(swdclk, OUTPUT);
  pinMode(swdio, OUTPUT);
  pinMode(en, OUTPUT);
  DW(en, 0);

  //液晶の初期化
  for (int ii = 0; ii < 8; ii++) {
    seg1( lcd_int[ii] , 0); delay(2);
  }//for

  seg1( 0x80 + 0x00 , 0  ); //1ライン目にカーソルを移動
  ns_printf( "START" ); //delay(500);
  //seg1(   0x01  , 0  ); delay(5); //画面クリア

  //I2Cの初期化
  Wire.begin(PA12, PA11); //stm32g031

  Wire.begin(0x40);  //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

} //setup

//無限ループ
void loop() {
}//loop

//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み

  char buf[] = { x, 0  };


  //000X XXXXか　000の時は、表示位置    (000以外は、文字)
  if ( (buf[0] & 0xE0)  == 0 ) {

    //0x10より　大きいか同じ時は、0x30足しこむ
    if ( buf[0] >= 0x10 ) {

      seg1( 0x80 + buf[0] + 0x30  , 0  ); //1ライン目にカーソルを移動

    } else {

      seg1( 0x80 + buf[0] , 0  ); //1ライン目にカーソルを移動

    }

  } else {

    //I2Cスレーブの受信データの表示
    seg1( buf[0] , 1  );

  }//end if

}//receiveEvent



```


テストプログラム(A)
hello worldと表示する

```c++


//I2C_s_LCD_031_a1_2

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

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define en     PB7     // 1pin

#define ADDR1  0x40

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

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write(ch);
  Wire.endTransmission();
  delay(1);//1mS待つ　連続送信防止用　受信落ち対策

}//seg1


//一文字出力
int pc_putc(char ch)
{

  if ( ch == '\f' ) {

    seg1(0x00);

    for (int ii = 0; ii < 16; ii++) {
      seg1(' ');
    }//for

    //char ch = 0x10;
    seg1(0x10);

    for (int ii = 0; ii < 16; ii++) {
      seg1(' ');
    }//for

    seg1(0x00);

  } else if ( ch == '\n' ) {

    seg1(0x10);

  } else if ( ch == '\r' ) {

    seg1(0x00);

  } else {

    seg1(ch);

  }

  return (0);

} //pc_putc

//文字列の表示 nana_seg
int pc_printf(char *str1)
{

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

    pc_putc( *str1 ++);

  } //while

  //戻り値
  return (0);

}//ns_printf

//初期化
void setup() {

  delay(3000); //not Delete

  //GPIOの初期化
  pinMode(en, OUTPUT);

  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6

  //I2Cに送信
  pc_putc('\f');
  delay(1000);//1秒待つ

}//setup

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

  digitalWrite(en, 1); //LED ON debug

  //  //I2Cに送信
  //  seg1('B');

  //  //I2Cに送信
  //  pc_putc('C');

  //I2Cに文字列を出力
  pc_printf("hello world\n");

  delay(500);//0.5秒待つ

  digitalWrite(en, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop




```



テストプログラム(B)
AAAAA..と表示する


```c++


//I2C_s_LCD_031_a1

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

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define en     PB7     // 1pin

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

  //GPIOの初期化
  pinMode(en, OUTPUT);

  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6

}//setup

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

  digitalWrite(en, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write('A');
  Wire.endTransmission();

  delay(500);//0.5秒待つ


  digitalWrite(en, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop



```