STM32と Arduino IDE で
液晶ディスプレイに文字表示(その1)
~ライブラリ未使用~


2012年に製作したシャッタ速度計測装置の使い勝手が悪いので、新たにSTM32で作り直すことにした。STM32を選んだ理由は、フラッシュメモリが大きいこと、動作クロックが早いことである。
先ずは液晶ディスプレイに文字を表示するところから始めてみる。
AVRで使っていたプログラムをArduinoで書き直してみた。
ライブラリを使わずにプログラムを組んだのとライブラリを使用した場合、どの程度プログラム容量に差が出るか試してみた。

// 液晶とSTM32のピン番号を設定する
#define D7 PB9
#define D6 PB8
#define D5 PB7
#define D4 PB6
#define RS PB1
#define E  PB0

void setup() {
}

void loop() {
    // ピンを出力に設定する
    pinMode(D7, OUTPUT);
    pinMode(D6, OUTPUT);
    pinMode(D5, OUTPUT);
    pinMode(D4, OUTPUT);
    pinMode(RS, OUTPUT);
    pinMode(E,  OUTPUT);

    lcd_init();             // 初期化
    lcd_clear();            // 全消去
    lcd_put_str("Hello!");  // "Hello!"表示
    lcd_position(10,0);     // カーソル位置 桁10,行0
    lcd_put_str("Line=1");  // "Line=1"表示
    lcd_position(0,1);      // カーソル位置 桁0,行1
    lcd_put_str("Japan!");  // "Japan!"表示
    lcd_position(10,1);     // カーソル位置 桁10,行1
    lcd_put_str("Line=2");  // "Line=2"表示

    while(1)
    {
    }
}

//---------- 文字列出力 ----------
//      *str:文字列の先頭ポインタ
void lcd_put_str(char *str)
{
    while(*str != 0){
        lcd_put_ch( *str );
        str++;
    }
}

//---------- LCD初期化 ----------
void lcd_init()
{
    delay(30);
    lcd_put_4bit(0x30, 1);  //8bit mode set
    delay(5);
    lcd_put_4bit(0x30, 1);  //8bit mode set
    delay(1);
    lcd_put_4bit(0x30, 1);  //8bit mode set
    delay(1);
    lcd_put_4bit(0x20, 1);  //4bit mode set
    delay(1);
    lcd_put_cmd(0x2E);      //DL=0 4bit mode
    lcd_put_cmd(0x08);      //display off C=D=B=0
    lcd_put_cmd(0x0D);      //display on C=D=1 B=0
    lcd_put_cmd(0x06);      //entry I/D=1 S=0
    lcd_put_cmd(0x02);      //cursor home
}

//---------- 表示位置設定 ----------
//      tx:x座標  ty:y座標
void lcd_position(char tx, char ty)
{
    digitalWrite(RS,LOW);   // RS = L
    lcd_put_cmd(0x80 | tx | (0x40 * ty));
    digitalWrite(RS,HIGH);  // RS = H
}

//---------- データ4bit出力 ----------
//      code:DB4~DB7 に与えるデータ
//      flag:0=表示モード 1=コマンドモード
void lcd_put_4bit(char code, int flag)
{
    if(code & 0x80)
        digitalWrite(D7,HIGH);
    else
        digitalWrite(D7,LOW);
    if(code & 0x40)
        digitalWrite(D6,HIGH);
    else
        digitalWrite(D6,LOW);
    if(code & 0x20)
        digitalWrite(D5,HIGH);
    else
        digitalWrite(D5,LOW);
    if(code & 0x10)
        digitalWrite(D4,HIGH);
    else
        digitalWrite(D4,LOW);
    if (flag == 0)
        digitalWrite(RS,HIGH);  // 表示データ
    else
        digitalWrite(RS,LOW);   // コマンドデータ

    delayMicroseconds(1);    
    digitalWrite(E,HIGH);       //strobe out
    delayMicroseconds(2);       //ウェイト
    digitalWrite(E,LOW);        //reset strobe
}

//---------- 1文字出力 ----------
//      ch:出力するデータ
void lcd_put_ch(char ch)
{
    lcd_put_4bit(ch, 0);    //上位4bit出力
    lcd_put_4bit(ch<<4, 0); //下位4bit出力
    delayMicroseconds(50);  //50μsec待ち
}

//---------- コマンド出力 ----------
//      cmd:コマンド
void lcd_put_cmd(char cmd)
{
    lcd_put_4bit(cmd, 1);   //上位4bit出力
    lcd_put_4bit(cmd<<4, 1);//下位4bit出力
    delay(2);               //2msec待ち
}

//---------- 全消去 ----------
void lcd_clear()
{
  lcd_put_cmd(0x01);        //初期化コマンド出力
  delay(15);                //15msec待ち
}

コンパイル後の容量は次のとおりである。
 >最大65536バイトのフラッシュメモリ/スケッチが15040バイト(22%)使用
 >最大20480バイトのRAM/グローバル変数が2824バイト(13%)使用
 
 


シェアする

  • このエントリーをはてなブックマークに追加

フォローする