ARUDUINOでI2C接続LCDを使う①

概要

 秋月電子通商販売のI2C接続キャラクタLCDモジュールを使ってみました。下図の通り ARDUINO UNO R3 に接続します。

I2C接続キャラクタLCDモジュール 16×2行 
白色バックライト付 [ACM1602NI-FLW-FBW-M01]

出力結果(表示状態)

 今回、作成したプログラムの出力結果です。上の写真は1つの文字列を2行に分割して出力したものです。下の写真は2つの文字列をそれぞれ行を分けて表示したものです。

<1つの文字列を2行に分割して出力>

<2つの文字列をそれぞれ行を分けて表示>

プログラム

 2つの表示パターンを3秒毎に切り換え表示するものです。

#include <Wire.h>
const uint8_t address = 0x50;     // 固定(変更不可)
char str[] = {"Who are you?  I'm Mike."};
char* str_ary[]={ "I'm going out.", "Just a minute." };
byte blk = 0x20 ;                     // スペース

// 初期設定
void setup() {
  Wire.begin(); // join i2c bus (address optional for master)
  pinMode(SDA, INPUT);                // I2C内部プルアップ無効化
  pinMode(SCL, INPUT);                // I2C内部プルアップ無効化
  lcdinit();                          // LCD初期化
}

// メイン処理
void loop() {
  transDataToLcd( 0 , 0x01 , 10);     // 画面消去
  lcd_Disp_Str(str);
  delay(3000);
  
  transDataToLcd( 0 , 0x01 , 10);     // 画面消去
  for (int i = 0; i < 2; i++){
    char* tmp = str_ary[i];
    lcd_DispStrAry(tmp , i );
  }
  delay(3000);
}

// LCD表示1(1文を2行に分けて表示)
void lcd_Disp_Str(char* str){
  for(int j = 0; j < 2; j++){
    pos_cursor(j , 0);                  //座標指定
    for(int i = 0;i < 16;i++){
      if(*str == '\0'){
        transDataToLcd( 1 , blk , 5);
      }else{
        transDataToLcd( 1 , *str++ , 5);
      } 
    }
  }
}

// LCD表示2(2文を2行に表示)
void lcd_DispStrAry(char* str , int l_n ){
    pos_cursor(l_n , 0);                  //座標指定
    for(int i = 0;i < 16;i++){
      if(*str == '\0'){
        transDataToLcd( 1 , blk , 5);
      }else{
        transDataToLcd( 1 , *str++ , 5);
      } 
    }
}

// LCD初期化
void lcdinit() {
  transDataToLcd( 0 , 0x01 , 10);      //画面消去
  transDataToLcd( 0 , 0x38 , 10);      //ファンクション設定
  transDataToLcd( 0 , 0x0F , 10);      //ディスプレイON、CURSOR-ON、blinking-ON
  transDataToLcd( 0 , 0x06 , 10);      //データ書き込み後アドレス加算モード設定
}

// LCDデータ送信
// typ_d ( 0:コマンド、1:データ )
// trsDat( コマンド、もしくはデータ )
// dTime ( データ送信後、待機時間 )
void transDataToLcd(int typ_d , byte trsDat , int dTime){
  byte typCmd = 0x00 ;
  if(typ_d != 0){ typCmd = 0x80 ; }
  
  Wire.beginTransmission(address);
  Wire.write(typCmd);
  Wire.write(trsDat);                   //画面クリア
  Wire.endTransmission();
  delay(dTime);
}

// 表示位置指定(カーソル座標指定)
// loc_x (0:1行目、1:2行目)
// loc_y (0:最左、15:再右)
void pos_cursor(int loc_x , int loc_y){
  byte p_inf = 0x80 + 0x40 * loc_x + loc_y;
  transDataToLcd( 0 , p_inf , 5);    //データ書き込み後アドレス加算モード設定
}

まとめ

 とりあえず、使えそうな感触を持てました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です