//PIC16F689 8bit SC2004 接続 文字表示

#include 

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT);

#define _XTAL_FREQ 4000000 // クロック周波数4MHz

void main(void) {
    // ----------------------------------------------------
    // 1. PICの初期設定 (アナログ無効・入出力設定)
    // ----------------------------------------------------
    ANSEL   = 0x00; // すべてのピンをデジタルI/Oに設定
    ANSELH  = 0x00;
    CM1CON0 = 0x00; // コンパレータ無効化(PORTAの干渉防止)
    CM2CON0 = 0x00;
    
    TRISA0 = 0;    // RA0 (Eピン) 出力
    TRISA1 = 0;    // RA1 (RSピン) 出力
    TRISC  = 0x00; // PORTC (D0-D7) すべて出力
    
    PORTA = 0x00;  // ポート初期化
    PORTC = 0x00;

	char moji; //変数mojiを宣言
	moji='C'; //表示文字を変数mojiに代入
	//重要 変数は1文字しか代入出来ない、2文字以上は配列を使う
    // ----------------------------------------------------
    // 2. LCDの初期化処理 (電源ONから各コマンド送信)
    // ----------------------------------------------------
    __delay_ms(30);     // 電源立ち上がり待ち

    // ◆ コマンド送信: 8bit, 2行, 5x8ドット設定 (0x38)
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x38;       // データセット
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_ms(2);      // 処理待ち

    // ◆ コマンド送信: 画面ON、カーソルOFF (0x0C)
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x0C;       // データセット
    RA0 = 1;            // E=1
    __delay_us(2);
    RA0 = 0;            // E=0
    __delay_ms(2);

    // ◆ コマンド送信: エントリーモード設定 (0x06)
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x06;       // データセット
    RA0 = 1;            // E=1
    __delay_us(2);
    RA0 = 0;            // E=0
    __delay_ms(2);

    // ◆ コマンド送信: 画面消去 (0x01)
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x01;       // データセット
    RA0 = 1;            // E=1
    __delay_us(2);
    RA0 = 0;            // E=0
    __delay_ms(2);

    // ----------------------------------------------------
    // 3. 表示位置(1行目3桁目)の指定コマンド送信 【ここを追加】
    // ----------------------------------------------------
    // 1行目の先頭アドレスは 0x80 です。
    // 1桁目=0x80, 2桁目=0x81, 3桁目=0x82 となります。
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x80;       // 1行目3桁目のDDRAMアドレスを指定
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_ms(2);      // 処理待ち

    // ----------------------------------------------------
    // 3. 変数mojiに代入した文字の表示処理
    // ----------------------------------------------------
    // ◆ データ送信: 文字 変数(moji)に代入された文字を書き込み
    RA1 = 1;            // RS=1 (データ)
    PORTC=moji;         // 'C'が代入されている
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_us(50);     // 書き込み待ち

    // ----------------------------------------------------
    // 4. 全体の維持
    // ----------------------------------------------------
    while(1) {
        // 表示を維持するため、ここで無限ループ
    }
}