// PIC16F689 8bit SC2004 接続 文字表示(関数なし・配列版)

#include 

// MPLAB v8.5 / HI-TECH C 用のコンフィグレーション設定
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT);

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

void main(void) {
    // ----------------------------------------------------
    // 変数の宣言
    // ----------------------------------------------------
    char moji[] = "CQ CQ DE JA3RUA"; // 文字列配列(自動で末尾に '\0' が入る)
    int i;                    // 配列の要素を指すループ用変数

    // ----------------------------------------------------
    // 1. PICの初期設定
    // ----------------------------------------------------
    ANSEL   = 0x00;
    ANSELH  = 0x00;
    CM1CON0 = 0x00;
    CM2CON0 = 0x00;
    
    TRISA0 = 0;    // RA0 (Eピン) 出力
    TRISA1 = 0;    // RA1 (RSピン) 出力
    TRISC  = 0x00; // PORTC すべて出力
    
    PORTA = 0x00;
    PORTC = 0x00;

    // ----------------------------------------------------
    // 2. LCDの初期化処理
    // ----------------------------------------------------
    __delay_ms(30);
    
    // ◆ 空リセット3回
    RA1 = 0; PORTC = 0x30; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(5);
    RA1 = 0; PORTC = 0x30; RA0 = 1; __delay_us(2); RA0 = 0; __delay_us(120);
    RA1 = 0; PORTC = 0x30; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(2);
    
    // ◆ 各種設定コマンド送信
    RA1 = 0; PORTC = 0x38; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(2); // 8bit/2行
    RA1 = 0; PORTC = 0x0C; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(2); // 表示ON
    RA1 = 0; PORTC = 0x06; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(2); // エントリー
    RA1 = 0; PORTC = 0x01; RA0 = 1; __delay_us(2); RA0 = 0; __delay_ms(2); // 画面消去

    // ----------------------------------------------------
    // 3. 表示位置(1行目3桁目)の指定コマンド送信
    // ----------------------------------------------------
    RA1 = 0;            // RS=0 (コマンド)
    PORTC = 0x82;       // 1行目3桁目のDDRAMアドレスを指定
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_ms(2);      // 処理待ち

    // ----------------------------------------------------
    // 4. 配列を使った複数文字の表示処理(ループで1文字ずつ処理)
    // ----------------------------------------------------
    // 配列の0番目('H')から順番に、文字列の終わり('\0')が来るまでループします
    for (i = 0; moji[i] != '\0'; i++) {
        RA1 = 1;                // RS=1 (データ送信モード)
        PORTC = moji[i];     // 配列のi番目の文字をポートにセット
        RA0 = 1;                // E=1 (ストローブON)
        __delay_us(2);
        RA0 = 0;                // E=0 (ストローブOFF)
        __delay_us(50);         // 液晶の書き込み完了待ち
    }

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