// 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) { // 表示を維持するため無限ループ } }