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;
}
// ========================== ここまで ==============================