x 原因は、わからないが液晶がちらつく場合は、ウェートを調整してね!!
x まだ試していない 動作確認した2022/2/19_16:11
x なんかジャムる swdに繋いでいたから?
x 74hc164を使用
目的
I2Cに送られた文字を液晶に表示
キャラクター液晶 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-
-252-
-251-
-253-
-254-
-255-
-198-
-256-
-257-
-190-
-240-
-272-
//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