// I2C を用いたLCDへの文字表示プログラム // 簡単版(表示用の関数を追加したプログラム) // #include #define I2Cadr 0x3e //LCDのアドレス(固定) // デフォルト設定で SDAは18番 SDAまたはA4 // SCLは19番 SCLまたはA5 void setup() { delay(500); lcd_init(); } void loop() { // 1行目に文字列表示 lcd_printStr_n(0, "LCD test"); // 2行目に文字列+整数を表示 int idata = 2016; lcd_printStrNum_n(0, "FMS", idata); delay(1000); // 2行目に浮動小数点を表示 float fdata = 3.1415; lcd_printFloat_n(1, fdata); delay(1000); } // // 以降はLCDを使用するための関数群 // // LCDモジュールの初期化 void lcd_init() { // 参考資料にならって初期設定 Wire.begin(); lcd_cmd(0x38); lcd_cmd(0x39); lcd_cmd(0x14); lcd_cmd(0x70); lcd_cmd(0x56); lcd_cmd(0x6c); delay(200); lcd_cmd(0x38); lcd_cmd(0x0c); // Display On lcd_cmd(0x01); // Clear Display delay(2); } // LCDモジュールのn行目に文字列を表示 void lcd_printStr_n(int n, const char *s) { if (n == 0 || n == 1) { // n=0,1 でなければ何もしない lcd_setCursor(0, n); lcd_printStr(s); } } // LCDモジュールのn行目に文字列と整数を表示 // ただし、文字列は4文字、数値は4桁まで void lcd_printStrNum_n(int n, const char *s, int num) { if (n == 0 || n == 1) { // n=0,1 でなければ何もしない // 数値を文字列に変換 char intStr[4]; sprintf(intStr, "%4d", num); // 行頭から文字列を出力 lcd_setCursor(0, n); lcd_printStr(s); // 5文字目から整数文字列を出力 lcd_setCursor(4, n); lcd_printStr(intStr); } } // LCDモジュールのn行目に浮動小数点数を表示 // ただし、数値は8桁(5桁.2桁)で表示 void lcd_printFloat_n(int n, float fnum) { if (n == 0 || n == 1) { // n=0,1 でなければ何もしない // 数値を文字列に変換 char floatStr[8]; dtostrf(fnum, 8, 2, floatStr); // 行頭から数値文字列を出力 lcd_setCursor(0, n); lcd_printStr(floatStr); } } // コマンドを送信する void lcd_cmd(byte x) { Wire.beginTransmission(I2Cadr); Wire.write(0b00000000); // CO = 0,RS = 0 Wire.write(x); Wire.endTransmission(); } // 文字の表示 void lcd_printStr(const char *s) { Wire.beginTransmission(I2Cadr); while (*s) { if (*(s + 1)) { // データ送信(RS=1)を継続して送信(CO=1)する Wire.write(0b11000000); Wire.write(*s); } else { // データ送信(RS=1)の最後のバイトを送信(CO=0)する Wire.write(0b01000000); // CO = 0, RS = 1 Wire.write(*s); } s++; } Wire.endTransmission(); } // 表示位置の指定 void lcd_setCursor(byte x, byte y) { lcd_cmd(0x80 | (y * 0x40 + x)); }