で結論。あっさり動いた。
ソースは、前回のもののLCDのI2Cアドレスとか初期化の制御コマンドの辺りを変更しただけのもの。
#define RXDUINO #ifdef RXDUINO #include <rxduino.h> #else #include <Arduino.h> #endif #include <Wire.h> #define LCD_ADDRESS (0b0111110) #define LCD_CONTRAST 100 #define LCD_RS_CMD (0x00) #define LCD_RS_DATA (0x40) #define LCD_CMD_CLEAR (0x01) #define LCD_CMD_HOME (0x03) // 関数プロトタイプ宣言。 void LCD_init(); void LCD_write(uint8_t rs, uint8_t data); void LCD_clear(); void LCD_setCursor(byte col, byte row); void LCD_putc(uint8_t c); void LCD_puts(char *str); void setup() { // シリアルポートを9600bpsで開始。 Serial.begin(9600); // 受信バッファにデータが入るまで待機。 while (Serial.available() == 0); Serial.println("Initializing..."); // 一旦、受信バッファにデータがあれば、 if (Serial.available() > 0) { // 読み込んで、廃棄。 char c = Serial.read(); } // Bus-MasterとしてI2Cを開始。 Wire.begin(); delay(500); // LCDの初期化。 LCD_init(); // メッセージ表示。 LCD_setCursor(0, 0); LCD_puts("Hello!!"); LCD_setCursor(5, 1); LCD_puts("I2C LCD!!"); } void loop() { } // LCD初期化。 void LCD_init() { delay(40); // Function Set。8bit bus mode, 2-line mode,normal font,normal instruction mode。 LCD_write(LCD_RS_CMD, 0b00111000); // Function Set。extension instruction modeへ。 LCD_write(LCD_RS_CMD, 0b00111001); // Internal OSC frequency(extension instruction mode)設定。 LCD_write(LCD_RS_CMD, 0b00010100); // Contrast set(extension instruction mode)。コントラスト値下位4bit設定。 LCD_write(LCD_RS_CMD, 0b01110000 | (LCD_CONTRAST & 0xF)); // Power/ICON/Contrast set(extension instruction mode)。 // アイコン On,booster On,コントラスト値上位2bit設定。 LCD_write(LCD_RS_CMD, 0b01011100 | ((LCD_CONTRAST >> 4) & 0x3)); // Follower control。internal follower on, LCD_write(LCD_RS_CMD, 0b01101100); // 時間待ち。 delay(300); // Function Set。normal instruction mode。 LCD_write(LCD_RS_CMD, 0b00111000); // Display On/Off。Display Onに設定。 LCD_write(LCD_RS_CMD, 0b00001100); // Clear Display。 LCD_write(LCD_RS_CMD, 0b00001100); // 時間待ち。 delay(2); } // LCDへデータ書き込み。 void LCD_write(uint8_t rs, uint8_t data) { int rtnValue; if (rs == LCD_RS_CMD || rs == LCD_RS_DATA) { // LCD_RS_CMD ならコマンドモード。LCD_RS_DATA ならデータモード。 // LCDへの送信準備開始。 Wire.beginTransmission(LCD_ADDRESS); // モード(RS)送信。 Wire.write(rs); // データ送信。 Wire.write(data); // キューの送信。通信終了。 rtnValue = Wire.endTransmission(); Serial.print(rtnValue); } else { // rsの指定が0x00,0x80以外ならなにもしない。 } } void LCD_clear() { LCD_write(LCD_RS_CMD, LCD_CMD_CLEAR); delay(2); LCD_write(LCD_RS_CMD, LCD_CMD_HOME); delay(2); } void LCD_setCursor(byte col, byte row) { byte offset[] = {0x00, 0x40}; if (row > 1) row = 1; if (col > 16) col = 16; LCD_write(LCD_RS_CMD, 0x80 | (col + offset[row])); } void LCD_putc(uint8_t c) { LCD_write(LCD_RS_DATA, c); } void LCD_puts(char *str) { int i; for (i = 0; i < 16; i++) { if (str[i] == 0x00) { break; } else { LCD_putc((unsigned int)str[i]); } } }
いつものように RXDUINO のdefineをコメントアウトしてArduinoと兼用できるような書き方にしていますが、今回はArudino側での動作確認はしていませんので、あしからず。
しかし、じゃあ、なんで、秋月のI2C LCDは動かないのさ、ということになるんですが。まあ、しらべる元気もないんだけど・・・。あした、そのうち、いつか・・・調べようかな・・・。明日っていつの明日よっ?
もうひとつ気になることが・・・。上のソースのI2Cに送信してendTranmission()する戻り値をコンソールに出力しているんだけど、全部"2"(アドレス送信時にNACKを受信)となっているんだけど、いいのかな?成功(ACKを受信というかLCD側が応答)せずに文字だけ表示している?
しかし、じゃあ、なんで、秋月のI2C LCDは動かないのさ、ということになるんですが。まあ、しらべる元気もないんだけど・・・。あした、そのうち、いつか・・・調べようかな・・・。明日っていつの明日よっ?
もうひとつ気になることが・・・。上のソースのI2Cに送信してendTranmission()する戻り値をコンソールに出力しているんだけど、全部"2"(アドレス送信時にNACKを受信)となっているんだけど、いいのかな?成功(ACKを受信というかLCD側が応答)せずに文字だけ表示している?
0 件のコメント:
コメントを投稿