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