概要
秋月電子通商販売のI2C接続キャラクタLCDモジュールを使ってみました。下図の通り ARDUINO UNO R3 に接続します。
出力結果(表示状態)
今回、作成したプログラムの出力結果です。上の写真は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); //データ書き込み後アドレス加算モード設定
}
まとめ
とりあえず、使えそうな感触を持てました。