📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

41行目: 41行目:
*: 多くのSC1604 / SC2004モジュールは、バックライト機能を備えている。
*: 多くのSC1604 / SC2004モジュールは、バックライト機能を備えている。
*: バックライトの制御は、別の信号線や専用のコマンドを使用して行う。
*: バックライトの制御は、別の信号線や専用のコマンドを使用して行う。
<br><br>
== SC2004 / GPIOピンで直接制御 ==
==== SC2004と接続 ====
以下に示すように、MSP430G2553とSC2004の接続する。<br>
* MSP430G2553のP1.0をSC2004のRS (Register Select) ピンに接続
* MSP430G2553のP1.1をSC2004のE (Enable) ピンに接続
* MSP430G2553のP1.2〜P1.5をSC2004のDB4〜DB7データピンに接続
* SC2004のVss、RW、K (Backlight Cathode) ピンはGNDに接続
* SC2004のVdd、A (Backlight Anode)ピンは+5Vに接続
* SC2004のVo (Contrast Adjust) ピンは、10[kΩ]の可変抵抗を介してGNDに接続
<br>
* LCDのリセットピンを<code>0</code>にする場合 (RS = 0)
*: コマンドレジスタが選択されて、送信されるデータはコマンドとして解釈される。
* LCDのリセットピンを<code>1</code>にする場合 (RS = 1)
*: データレジスタが選択されて、送信されるデータは表示データとして解釈される
<br>
以下の例では、SC2004を制御する関数を実装して、SC2004を初期化して、表示する文字列をlcd_puts関数で送信している。<br>
* void lcd_init(void)
*: SC2004の初期化
* void lcd_cmd(uint8_t cmd)
*: コマンドの送信
* void lcd_data(uint8_t data)
*: 文字データの送信
* void lcd_puts(const char *s)
*: 文字列の表示
<br>
<syntaxhighlight lang="c">
#include <msp430.h>
#define RS_PIN  BIT0    // P1.0
#define E_PIN  BIT1    // P1.1
#define DB4_PIN BIT2    // P1.2
#define DB5_PIN BIT3    // P1.3
#define DB6_PIN BIT4    // P1.4
#define DB7_PIN BIT5    // P1.5
void lcd_cmd(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_init(void);
void lcd_puts(const char *s);
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;  // ウォッチドッグタイマを停止
    lcd_init();
    lcd_puts("Hello, MSP430G2553");
    while(1);
}
void lcd_init(void)
{
    P1DIR |= RS_PIN | E_PIN | DB4_PIN | DB5_PIN | DB6_PIN | DB7_PIN;
    // LCDの初期化
    lcd_cmd(0x28);  // LCDを4[ビット]モードに設定, 2 lines, 5x8フォント
    lcd_cmd(0x0C);  // ディスプレイをON, カーソルをOFF, 点滅をOFF
    lcd_cmd(0x06);  // 自動インクリメントカーソルを有効, シフト動作を無効
                    // シフト動作を有効にすると、文字を書き込むたびにディスプレイ全体が左右に移動する (この機能は、長い文字列を表示する時に使用する)
    lcd_cmd(0x01);  // ディスプレイの表示をクリア
}
void lcd_cmd(uint8_t cmd)
{
    // RSピンを0にしてデータを送信
    // これにより、LCDはコマンドレジスタが選択された状態になり、送信されたデータをコマンドとして解釈される
    P1OUT &= ~RS_PIN;  // RS = 0 for command
    // 上位4[ビット]を送信
    P1OUT = (P1OUT & 0xC3) | ((cmd >> 4) & 0x3C);
    P1OUT |= E_PIN;
    P1OUT &= ~E_PIN;
    // 下位4[ビット]を送信
    P1OUT = (P1OUT & 0xC3) | ((cmd << 2) & 0x3C);
    P1OUT |= E_PIN;
    P1OUT &= ~E_PIN;
    __delay_cycles(2000);  // コマンドが実行されるまで待機 : 2[mS]
}
void lcd_data(uint8_t data)
{
    // データレジスタが選択された状態で、lcd_data関数によりデータが送信される時、
    // LCDはそれを表示データとして解釈して、画面に文字が表示される
    P1OUT |= RS_PIN;    // RS = 1 for data
    // 上位4[ビット]を送信
    P1OUT = (P1OUT & 0xC3) | ((data >> 4) & 0x3C);
    P1OUT |= E_PIN;
    P1OUT &= ~E_PIN;
    // 下位4[ビット]を送信
    P1OUT = (P1OUT & 0xC3) | ((data << 2) & 0x3C);
    P1OUT |= E_PIN;
    P1OUT &= ~E_PIN;
    __delay_cycles(2000);  // データを書き込むまで待機 : 2[mS]
}
void lcd_puts(const char *s)
{
    while(*s) {
      lcd_data(*s++);
    }
}
</syntaxhighlight>
<br><br>
<br><br>