TJ3BにI2C液晶を接続(その1)

こちらを記事を見つけて、ちと頑張ってみた。

Arduinoではライブラリを使えばあっさり接続できたが、TJ3BのマイコンはPICなので、こちらも参考にした。


▼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Ωでプルアップする。