0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2022-02-17

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

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

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

o_con184.jpg

o_con185.jpg

キャラクター液晶 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

-252-

o_con252.jpg

-251-

o_con251.jpg

-253-

o_con253.jpg

-254-

o_con254.jpg

-255-

o_con255.jpg

-198-

o_con198.jpg

-256-

o_con256.jpg

-257-

o_con257.jpg

-190-

o_con190.jpg

-240-

o_con240.jpg

-272-

o_con272.jpg




//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と表示する



//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..と表示する



//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



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?