<PIC16F689のLCD 8bit処理>

// LCD SC2004を使った1文字表示の基礎備忘録(2026/8/14) //



回路図


プログラム

//PIC16F689 8bit SC2004 接続 文字表示
(#include <htc.h>の<は小文字に変更して下さい)
-----------------------------------------------------------------------------------
#include <htc.h>

__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;

    // ----------------------------------------------------
    // 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行目1桁目のDDRAMアドレスを指定
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_ms(2);      // 処理待ち

    // ----------------------------------------------------
    // 3. 文字「A」の表示処理
    // ----------------------------------------------------
    // ◆ データ送信: 文字 'A' を書き込み
    RA1 = 1;            // RS=1 (データ)
    PORTC = 0x41; //'A'; or 0x41; どちらかをセット
    RA0 = 1;            // E=1 (ストローブON)
    __delay_us(2);
    RA0 = 0;            // E=0 (ストローブOFF)
    __delay_us(50);     // 書き込み待ち

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

※※ 変数を使っての表示 ※※
・1文字なら変数が使える(例moji='A' シングルコーテーションを使う)
・2文字以上は配列を使う

1文字変数 ソース(HITEC-C)
2文字以上(配列) ソース(HITEC-C)
番外編 GoogleAI 参考 ソース1(HITEC-C)
番外編 GoogleAI 参考 ソース2(HITEC-C)
「PIC液晶表示回路」では4bit処理でしたが、今回は8bit処理で動かしました。 8bit処理は、データ線が8本必要ですがPIC16F688は、8本連続したポートがないので RC0-RC7の8本あるPIC16F689を使いました。(今回はセラミック発振子を使いました) 下の画像はブレッドボードで組立た様子です。 4bit処理に比べて、8bit処理はデータ線が8本、セラミック発振子20MHzの接続で更に2本増えて 線がごちゃごちゃします。しかし、プログラムが4bit処理に比べて楽です。 下の画像をクリックしますと、動画で表示の様子が分かります。よく見ていただくと 4bit処理では、問題ないのですが、右の8bit処理は、最初2行目左端にPSE Kの表示が出てから CQ CQ DE JA3RUA PSE Kが出ます。(>_<)この原因は、LCDの書込みタイミングのようです。 そこで、内部発振31KHz、セラミック発振子20MHzでも安定動作するようにタイミングを修正しました。 8it処理 ソースと新8it処理 ソースを見比べて下さい、__delay_us、__delay_msの値が違います。 4bit処理(内部発振31KHz) 8it処理(セラミック発振子20MHz)左の4bitと同じ書込みタイミング PIC16F689 ×1 SC1602BSLB ×1 4.7k L  ×1 VR20K   ×1 (8bit回路図はセラミック発振子20MHz ×1必要) 回路図 4bit (内部発振31KHz) 4bit処理 ソース(HITEC-C)
4it処理 HEXファイル
回路図 8bit(セラミック発振子20MHz) 8it処理 ソース(HITEC-C)
8it処理 HEXファイル
8it処理(セラミック発振子20MHz)書込みタイミング変更 回路図は、上の 8bit(セラミック発振子20MHz)参照 新8it処理 ソース(HITEC-C)
新8it処理 HEXファイル
基板上に組立てました。 PICのEEPROMに書いた文字を表示します。画像をクリックして見て下さい。 PIC16F689 LCD ソース(HITEC-C)
PIC16F689 LCD HEXファイル