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


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


x まだためしていない　確認済2022/4/2


目的
I2Cのテスト

-o_con184

![o_con184.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/910711de-34fc-c8e3-fdd4-913472dcb284.jpeg)

-o_con185

![o_con185.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9fe4c82e-24e5-9e32-8b32-918bb52b76d9.jpeg)



![h_con39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d390a0ac-72ad-b839-7c0a-2acba57a37a2.jpeg)


-o_con10.jpg- (74hc164)

![o_con10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d35c6b6e-6892-e50d-2136-c40c8f9bda1b.jpeg)


-o_con190.jpg-


![o_con190.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/99e0cec2-31cb-38da-547e-f861236ce572.jpeg)


-o_con191.jpg-

![o_con191.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/484dd524-7e43-6640-9e04-016b81eeb55e.jpeg)



![E35382FF-705B-4FA9-9965-6E8F2169BF1C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1f8afbdd-b384-82eb-58d5-4c2132fe1543.jpeg)

-197-

![o_con197.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cae7e840-f93f-fcb4-0ca3-c38ff6e93623.jpeg)


-198-

![o_con198.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d2f8a835-f4f9-c2c0-54de-48a4577153d9.jpeg)




-199-

![o_con199.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/07dd5e45-acbf-559c-e656-5a07d0dabf59.jpeg)

-200-

![o_con200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/43bb05f8-be9d-9c4f-d6bb-ca1969213fa6.jpeg)


-l010_bord1.jpg



![l010_bord1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/029dd2a4-8b0e-bab6-3540-d62c4b93f7e5.jpeg)


-o_con206

![o_con206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0893f29e-607c-aa1d-b293-4ffdfdfcaa98.jpeg)


-o_con207

![o_con207.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0d83453-394e-9f69-bc4c-20788f0ef7a4.jpeg)

-208

![o_con208.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/50762de1-172b-b65a-e233-a174423a32b3.jpeg)

-209

![o_con209.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/02a2cb75-0dc7-9212-302b-c771ec455991.jpeg)



![o_con263.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/75233e77-0940-430e-44f6-c702945c315d.jpeg)




https://akizukidenshi.com/catalog/g/gI-15689/


https://akizukidenshi.com/catalog/g/gR-11802/


https://akizukidenshi.com/catalog/g/gP-10797/


https://akizukidenshi.com/catalog/g/gC-10298/



ばぐの修正　2022/1/10


```c++


//I2C_S_LCD_1

#include "mbed.h"

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

//I2Cの初期化
I2CSlave slave(PA_10, PA_9); //010

#define swclk1  PA_5    //A4
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3

DigitalOut swdclk(swclk1);
DigitalOut swdio(swdio1);
DigitalOut en(en1);


//シフトパターン
//              12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

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

    swdio=rs;
    en=1;     wait_ms(1);
    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


//メイン関数
int main() {

    char buf[16]; //バッファー

    //I2Cスレーブのアドレスの設定
    slave.address(0x80);

    //GPIOの初期化
    en=0;

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

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

    ns_printf("ON LCD ");//wait_ms(500); //debug

    //画面クリア
    //seg1(   0x01  , 0  ); 
    //wait_ms(5);


    //無限ループ
    while(1){

        //I2Cの状態の読み出し(ポーリング)
        while (slave.receive() != I2CSlave::WriteAddressed) {}

        buf[0] = 0;//バッファーのクリア

        //I2Cスレーブの受信バッファーを読み取る
        slave.read(buf, 1);

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

    }//while

}//main

//容量削減
void error(const char* format, ...){}



```

テストプログラムa


```c++


//I2C_TEST_STRING_1

#include "mbed.h"

DigitalOut myled(PA_4);

#define ADDR (0x80)  //address

I2C i2c(PA_10, PA_9); //010

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

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

    i2c.write(ADDR, &ch, 1); 
    wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

}//seg1




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

        //I2Cに1を送信
        //HAL_I2C_Master_Transmit(&hi2c1,ADDR, (uint8_t *)  (&(*str1 ++)), 1, 3000);
        
        if( ch == '\f' ){
            
            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            for(int ii=0;ii<16;ii++){
            
                i2c.write(ADDR, " ", 1); 
                wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
                
            }//for
            
            //char ch = 0x10;
            i2c.write(ADDR, "\020", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            for(int ii=0;ii<16;ii++){
            
                i2c.write(ADDR, " ", 1); 
                wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
                
            }//for

            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            
            
        } else if( ch == '\n' ){
            
            i2c.write(ADDR, "\020", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
            
            
            
        } else if( ch == '\r' ){
            
            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
            

                
        } else {
        
            i2c.write(ADDR, &ch , 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

        }


    return(0);

} //pc_putc


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

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

            pc_putc( *str1 ++); 
            //wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

    } //while

    //戻り値
    return(0);

}//ns_printf





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

    i2c.write(ADDR, &ch, 1); 
    wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

    return(0);

} //pc_putc



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

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

        //I2Cに1を送信
        //HAL_I2C_Master_Transmit(&hi2c1,ADDR, (uint8_t *)  (&(*str1 ++)), 1, 3000);
        
        if( (*str1) == '\f' ){
            
            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            for(int ii=0;ii<16;ii++){
            
                i2c.write(ADDR, " ", 1); 
                wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
                
            }//for
            
            //char ch = 0x10;
            i2c.write(ADDR, "\020", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            for(int ii=0;ii<16;ii++){
            
                i2c.write(ADDR, " ", 1); 
                wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
                
            }//for

            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

            
            *str1 ++;
            
        } else if( (*str1) == '\n' ){
            
            i2c.write(ADDR, "\020", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
            
            *str1 ++;
            
            
        } else if( (*str1) == '\r' ){
            
            i2c.write(ADDR, "\000", 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策
            
            *str1 ++;
                
        } else {
        
            i2c.write(ADDR, (&(*str1 ++)), 1); 
            wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

        }

    } //while

    //戻り値
    return(0);

}//ns_printf
*/

//メインプログラム
int main() {

    //I2Cに文字列を出力
    pc_printf("\f");
    
    wait_ms(1000);//1秒待つ
    

    //無限ループ
    while(1){


        myled = 1;//LEDをオン

        //pc_putc(0x00);
        
        //pc_putc('A');
        //pc_putc('B');
        //pc_putc('C');

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

        myled = 0;//LEDをオフ

        wait_ms(1000);//1秒待つ



    }//while

} // main

//容量削減 約-3kバイト
void error(const char* format, ...){}




```




テストプログラムt


```c++



//I2C_TEST_A__A_1

#include "mbed.h"

DigitalOut myled(PA_4);

#define ADDR (0x80)  //address

I2C i2c(PA_10, PA_9); //010

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

//メインプログラム
int main() {

    //無限ループ
    while(1){

        myled = 1;//LEDをオン

         //Aを送信
        data_read[0]='A';
        i2c.write(ADDR, data_read, 1);       
        wait_ms(500);


        myled = 0;//LEDをオフ
        wait_ms(500);

    }//while

} // main

//容量削減 約-3kバイト
void error(const char* format, ...){}




```







まだ1行目まで　バグあり

```c++




//I2C_S_LCD_1

#include "mbed.h"

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

//I2Cの初期化
I2CSlave slave(PA_10, PA_9); //010

#define swclk1  PA_5    //A4
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3

DigitalOut swdclk(swclk1);
DigitalOut swdio(swdio1);
DigitalOut en(en1);


//シフトパターン
//              12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

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

    swdio=rs;
    en=1;     wait_ms(1);
    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


//メイン関数
int main() {

    char buf[16]; //バッファー

    //I2Cスレーブのアドレスの設定
    slave.address(0x80);

    //GPIOの初期化
    en=0;

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

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

    ns_printf("STAR");wait_ms(500); //debug

    //画面クリア
    //seg1(   0x01  , 0  ); 
    //wait_ms(5);


    //無限ループ
    while(1){

        //I2Cの状態の読み出し(ポーリング)
        while (slave.receive() != I2CSlave::WriteAddressed) {}

        buf[0] = 0;//バッファーのクリア

        //I2Cスレーブの受信バッファーを読み取る
        slave.read(buf, 1);

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

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

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

        }//end if

    }//while

}//main

//容量削減
void error(const char* format, ...){}



```