<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ファイル