ここで紹介するのは I2Cで接続可能な2種の小型(8文字、2行)の液晶表示器です。




#include <Wire.h>
byte val = 0;
char Msg[17] = "I2C LCD";
//char buf[10]="";
void setup(){
Serial.begin(9600);
delay(100);
Wire.begin();
lcd_begin();//初期設定
Serial.println("setup");
}
void loop()
{
lcd_setCursor(0,0);//カーソルを0行に位置設定
lcd_print(Msg);//文字列表示
lcd_setCursor(0,1);//カーソルを0行に位置設定
lcd_print(val);//数字を表示
val++;
Serial.println(".");
delay(500);
}
// LCD 1602A、AQM0802
//接続
//LCD.CL:3 LCD.DA:4
//LCD.VCC:1 3.3V LCD.5:GND GND
//LCD.Reset:2 PU必要
#define LCDA 0x3E //lcd address
//LCD によりどちらか選択
//#define CONTRAST 0x20 //for 3.3V AQM0802
#define CONTRAST 0x30 //for 3.3V LCD1602A
//byte val = 0;
char lcdbuf[10]="";
// 液晶へ1コマンド出力
void lcd_cmd(byte cmd)
{
Wire.beginTransmission(LCDA);
Wire.write((byte)0x00); // コマンド指定
Wire.write(cmd); // コマンド出力
Wire.endTransmission(); // ストップ
//I2c.write((byte)LCDA,(byte)0,cmd);
/* ClearかHomeか */
if((cmd == 0x01)||(cmd == 0x02))
delay(2); // 2msec待ち
else
delayMicroseconds(30); // 30μsec待ち
}
//データを送る
void lcd_data(byte data)
{
Wire.beginTransmission(LCDA); // スタート
Wire.write(0x40); // 表示データ指定
Wire.write(data); // 表示データ出力
Wire.endTransmission(); // ストップ
delayMicroseconds(30); // 遅延
}
void lcd_setCursor(byte clm,byte row){
//row=0 or 1
if(row==0) lcd_cmd(0x80+clm);
if(row==1) lcd_cmd(0xc0+clm);
}
// 初期化
void lcd_begin(void)
{
Serial.println("lcd_begin");
//I2c.begin(); // begin I2C master
delay(10);
lcd_cmd(0x38); // 8bit 2line Normal mode
lcd_cmd(0x39); // 8bit 2line Extend mode
lcd_cmd(0x14); // OSC 183Hz BIAS 1/5
/* コントラスト設定 */
lcd_cmd((byte)(0x70 + (CONTRAST & 0x0F)));//下位4bit
lcd_cmd((byte)(0x5C + (CONTRAST >> 4)));//上位2bit
lcd_cmd((byte)0x6B); // Follwer for 3.3V
delay(1);
lcd_cmd((byte)0x38); // Set Normal mode
lcd_cmd((byte)0x0C); // Display On
lcd_cmd((byte)0x01); // Clear Display
delay(1);
Serial.println("end of lcd_begin");
}
//全消去関数
void lcd_clear(void)
{
lcd_cmd(0x01); //初期化コマンド出力
delay(2);
}
//文字列表示関数
void lcd_print(char* ptr)
{
while(*ptr != 0) //文字取り出し
lcd_data(*ptr++); //文字表示
}
void lcd_print(int num){
sprintf(lcdbuf,"%d",num);
lcd_print(lcdbuf);
}