STM32L010F4P6と液晶、ACM1602K-NLW-BBWでHello Worldを表示2(信号線3本)


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

STM32L010F4P6でmbedを使い16文字2行液晶に
Hello Worldを表示するプログラム

74hc164シフトレジスターを使用した。
液晶とのピン数を節約した。信号線10本から
信号線3本に減らした。

1 CLK クロック端子(緑)
2 RSDATA RS端子とデータの共有端子
3 E 読み込み書き込み同期信号


#include "mbed.h"
 
//*          *****  *****       ***  * *
//*         *       *    *     *   * * *
//*         *       *    *     *   * * *
//*         *       *    *     *   * * *
//*         *       *    *     *   * * *
//********   *****  *****       ***  * *
 
#define swclk1  PA_5    //A4
#define swdio1  PA_7    //A6
#define en1     PA_4    //A3
 
DigitalOut swdclk(swclk1);
DigitalOut swdio(swdio1);
DigitalOut en(en1);
 
//Serial pc2(USBTX, USBRX); // tx, rx
 
int v;
int rs;
void seg1()
{
    swdio=((v>>7)&1);swdclk=1;swdclk=0; //7
    swdio=((v>>6)&1);swdclk=1;swdclk=0; //6
    swdio=((v>>5)&1);swdclk=1;swdclk=0; //5
    swdio=((v>>4)&1);swdclk=1;swdclk=0; //4
    swdio=((v>>3)&1);swdclk=1;swdclk=0; //3
    swdio=((v>>2)&1);swdclk=1;swdclk=0; //2
    swdio=((v>>1)&1);swdclk=1;swdclk=0; //1
    swdio=((v>>0)&1);swdclk=1;swdclk=0; //0
    swdio=rs;   //delay(500);
    en=1;       //delayMicroseconds(40);
    wait_ms(1);
    en=0;       //delay(500);
}
 
 
int main() {
    
    //pc2.baud(9600);
   
    //pc2.printf("Hello World!");

    swdio=0;
    for(int i=0;i<10;i++){
        swdclk=1;
        wait_ms(15);
        swdclk=0;
        wait_ms(15);
    }
    
    //ファンクションセット1
    rs=0;
    v=0x30;seg1();
    wait_ms(5);
 
    //ファンクションセット2
    rs=0;
    v=0x30;seg1();
    wait_ms(1);
 
    //ファンクションセット3
    rs=0;
    v=0x30;seg1();
 
    //ファンクションセット 2ラインモード
    rs=0;
    v=0x38;seg1();
 
    //表示オフ
    rs=0;
    v=0x08;seg1();
 
    //画面クリア
    rs=0;
    v=0x01;seg1();
    wait_ms(2);
 
    //エントリーモードセット
    rs=0;
    v=0x06;seg1();
 
    //表示オン
    rs=0;
    v=0x08+0x04;seg1();
 
    //@文字の表示
    rs=1;
    v='@';seg1();
    wait_ms(2); 
 
    //1ライン目にカーソルを移動
    rs=0;
    v=0x80+0x00;seg1();
    wait_ms(2); 
    
    int ii;
    char ss1[]="Hello World !";
    ii=0;
    while(ss1[ii]!=0){
        //文字の表示
        rs=1;
        v=ss1[ii];ii++;seg1();
        wait_ms(2); 
    }
 
    while(1) {}
}