TOP > MPLAB C18編(PIC18F2320) > 液晶ディスプレイ(LCD)を使う(C18) > ソース

液晶ディスプレイ(LCD)を使う
(PIC18F2320)(ソース)

更新日2009.7.12

以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。

// ========================== ここから ==============================
//ファイル名	lcd2320.c
//作成日	2009.5.17
//作成者	mit.ueno
//バージョン	1.0
//コンパイラ	MPLAB C18
//PIC	PIC18F2320
//クロック	8MHz(INTIO2)
//概要
//	LCD(液晶ディスプレイ)に文字を表示
//使用ポート
//	RC0:LCD(E)
//	RC1:LCD(R/W)
//	RC2:LCD(RS)
//	RC4:LCD(DB4)
//	RC5:LCD(DB5)
//	RC6:LCD(DB6)
//	RC7:LCD(DB7)

#include <p18f2320.h>

#define	LCD_E	LATCbits.LATC0
#define	LCD_RW	LATCbits.LATC1
#define	LCD_RS	LATCbits.LATC2
#define	NOP	_asm NOP _endasm

#pragma config OSC = INTIO2
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBAD = DIG

static void wait_50us(void);
static void wait_1ms(void);
static void wait_ms(unsigned char);
static void LCD_str(char *);
static void LCD_send4(unsigned char);
static void LCD_cmd(unsigned char);
static void LCD_data(unsigned char);
static void LCD_init(void);

char data1[11] = "PIC18F2320";	// LCD 1行目表示テキスト
char data2[10] = "MPLAB C18";	// LCD 2行目表示テキスト

// ================== メインルーチン ======================
void main (void) {
	OSCCON = 0x72;		// INTOSC,8MHz
	ADCON1 = 0x0F;		// AN未使用(全ポートデジタル)
	TRISC = 0x08;		// RC0-2,4-7 output
	PORTC = 0;

	LCD_init();		// LCD初期化

	LCD_str(data1);		// 1行目表示
	LCD_cmd(0xC0);		// 2行1桁にアドレス設定
	LCD_str(data2);		// 2行目表示

	while (1) {
	}
}


// ===================== 文字列をLCD出力 ==================
static void LCD_str(char *c) {
	unsigned char i,wk;
	for (i=0 ; ; i++) {
		wk = c[i];
		if  (wk == 0x00) {break;}
		LCD_data(wk);
	}

	return;
}

// ====================== LCD 送信(4bit) ==================
static void LCD_send4(unsigned char c) {
	PORTC = (PORTC & 0x0F) | c;
	LCD_E = 1;
	NOP;
	LCD_E = 0;

	return;
}

// ================== LCDコマンドWRITE ===============
static void LCD_cmd(unsigned char cmd) {
	LCD_RS = 0;
	PORTC = (PORTC & 0x0F) | (cmd & 0xF0);
	LCD_E = 1;			// 上位4ビット書き込み
	NOP;
	LCD_E = 0;

	PORTC = (PORTC & 0x0F) | ((cmd <<4) & 0xF0);
	LCD_E = 1;			// 下位4ビット書き込み
	NOP;
	LCD_E = 0;

	wait_50us();

	return;
}

// ==================== LCDデータWRITE ===============
static void LCD_data(unsigned char cmd) {
	LCD_RS = 1;
	PORTC = (PORTC & 0x0F) | (cmd & 0xF0);
	LCD_E = 1;			// 上位4ビット書き込み
	NOP;
	LCD_E = 0;

	PORTC = (PORTC & 0x0F) | ((cmd <<4) & 0xF0);
	LCD_E = 1;			// 下位4ビット書き込み
	NOP;
	LCD_E = 0;

	wait_50us();

	return;
}

// ==================== LCDの初期化 =======================
static void LCD_init() {
	wait_ms(15);
	LCD_E = 0;
	LCD_RS = 0;

	LCD_send4(0x30);	// DB4-7に'3'を出力(8bitモードに)1
	wait_ms(5);
	LCD_send4(0x30);	// DB4-7に'3'を出力(8bitモードに)2
	wait_ms(1);
	LCD_send4(0x30);	// DB4-7に'3'を出力(8bitモードに)3
	wait_ms(1);
	LCD_send4(0x20);	// DB4-7に'2'を出力(4bitモードに)
	wait_ms(1);

	// ここからは4bitモードで、Busyフラグが使える
	LCD_cmd(0x28);	// DL=0:4bit ,N=1:2lines ,F=0:5*7dot

	LCD_cmd(0x08);	// Display off

	LCD_cmd(0x0C);	// Display on ,cursor on ,no blink

	LCD_cmd(0x06);	// Entry mode (Inc ,No Shift)

	LCD_cmd(0x01);	// Clear Display
	wait_ms(2);

	return;
}


// ================== 50μSウェイトルーチン ============
static void wait_50us() {
	unsigned char i;

	for	(i=15 ; i>0 ; i--) {}
	return;
}

// ================== 1mSウェイトルーチン ==============
static void wait_1ms() {
	unsigned char i;

	for	(i=248 ; i>0 ; i--) {
		NOP;
		NOP;
	}
	return;
}

// ================== 1mS×ms ウェイトルーチン =========
static void wait_ms(unsigned char ms) {
	unsigned char c;
	for (c=ms ; c>0 ; c--) {
		wait_1ms();
	}
	return;
}
// ========================== ここまで ==============================