TJ3BにI2C液晶を接続(その1)
こちらを記事を見つけて、ちと頑張ってみた。
Arduinoではライブラリを使えばあっさり接続できたが、TJ3BのマイコンはPICなので、こちらも参考にした。
- 電子工作 I2C接続の液晶表示器の制御
▼I2C.hに追記
//------------------------------------------------------------------------------ // D_I2C.h に追記 #define LCD_ADRS_STLI 0x7C // I2C低電圧キャラクタ液晶モジュール(16x2行) // メーカー品番:SB1602B // スレーブアドレス 0111110 を右に1ビットシフト #define CONTRAST 31 // コントラスト設定。0〜63 D_I2C_EXT void lcd_cmd(BYTE row); D_I2C_EXT void lcd_data(BYTE row); D_I2C_EXT void lcd_init(void);
▼I2C.cのlcd_putX()とlcd_puts()は /* 〜 */ で囲んでコメントアウトし、追記
//------------------------------------------------------------------------------ // D_I2C.c に追記 #ifdef USE_LCD // 元のlcd_putX(), lcd_puts()の書き換え //------------------------------------------------------------------------------ // 16x2 LCD 出力用 //------------------------------------------------------------------------------ void lcd_putX(BYTE row, ROMC *str) { BYTE n = 0; if (row == 2) { lcd_cmd(0xC0); } else { lcd_cmd(0x80); } while (n < MAX_COL) { if (*str != null){ lcd_data(*str++); } else { lcd_data(SPC); } n++; } } //------------------------------------------------------------------------------ void lcd_puts(BYTE row, char *str) { BYTE n = 0; if (row == 0xFF) { lcd_init(); } else if (row == 2) { lcd_cmd(0xC0); } else { lcd_cmd(0x80); } while (n < MAX_COL) { if (*str != null){ lcd_data(*str++); } else { lcd_data(SPC); } n++; } } #endif //-------- コマンド出力 -------- void lcd_cmd(BYTE x) { gI2C_Buf[0] = 0x00; gI2C_Buf[1] = x; i2c_send(LCD_ADRS_STLI, 2); /* ClearかHomeか */ if((x == 0x01)||(x == 0x02)) { wait_ms(2); // 2msec待ち } else { Delay10TCYx(24); // 遅延(30us) } } //-------- 1文字表示 -------- void lcd_data(BYTE x) { gI2C_Buf[0] = 0x40; gI2C_Buf[1] = x; i2c_send(LCD_ADRS_STLI, 2); Delay10TCYx(24); // 遅延(30us) } //-------- 文字列出力 -------- void lcd_str(ROMC *str) { while(*str != null) { lcd_data(*str++); } } //-------- 初期化 -------- void lcd_init() { wait_ms(40); lcd_cmd(0x38); // 8bit 2line Normal mode lcd_cmd(0x39); // 8bit 2line Extend mode lcd_cmd(0x14); // OSC 183Hz BIAS 1/5 /* コントラスト設定 */ lcd_cmd(0x70 | (CONTRAST & 15)); lcd_cmd(0x5c | (CONTRAST >> 4 & 3)); lcd_cmd(0x6A); // Follower for 5.0V //lcd_cmd(0x6B); // Follower for 3.3V wait_ms(200); lcd_cmd(0x38); // Set Normal mode lcd_cmd(0x0C); // Display On lcd_cmd(0x01); // Clear Display }
▼C-codeでテスト
lcd_init(); lcd_str((ROMC *)"Hello, Tj3B!"); lcd_cmd(0xC0); lcd_str((ROMC *)"i2c LCD module"); set_Led(1, LED_ON);
C-codeを使わない場合、C-Styleのsetupで「16x2:LCD」を有効にすれば、「LCD」コマンドが使える。
I2C液晶には、XHコネクタをこんな感じ「\||」で取り付けた。
こうすることで、ピン配置をTJ3B側と揃え(SCL,5V,SDA,GND)て、ケーブルを共通化する。
RST端子は10kΩでプルアップする。