TOP>PICC Lite編(PIC16F887)> 液晶ディスプレイを使う(PIC16F887 PICC-Lite)> ソース
液晶ディスプレイ(LCD)を使う(ソース)
(PIC16F887 PICC-Lite)
更新日2009.4.11
以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。
// ========================== ここから ==============================
// ファイル名 LCD_887.c
// 作成日 2009.3.14
// 作成者 mit.ueno
// 機種 PIC16F887
// コンパイラ PICC-Lite
// CLOCK 8MHz(INTIO)
// 概要
// LCDのテスト
//I/Oポート
// RA0:LED(パイロットランプ)
// LCD
// RD2:LCD_RS
// RD3:LCD_E
// RD4:LCD_DB4
// RD5:LCD_DB5
// RD6:LCD_DB6
// RD7:LCD_DB7
//
// LCD_R/W : GND
// LCD_V0 : 5KΩVRでGND
// LCD_DB0-3: open
//
#include "pic.h"
#define LCD_E RD3
#define LCD_RS RD2
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BORDIS & IESODIS & LVPDIS);
static void pic_init();
static void wait_50us();
static void wait_1ms();
static void wait_ms(unsigned char);
static void LCD_send4(unsigned char);
static void LCD_cmd(unsigned char);
static void LCD_data(unsigned char);
static void LCD_init();
// ==================== メイン処理 ===========================
main() {
unsigned char i;
unsigned char c;
pic_init(); // PICの初期化
LCD_init(); // LCDの初期化
while(1) {
LCD_cmd(0x01); // Clear Display
wait_ms(2);
for (i=0 ; i<16 ; i++) { // 1行目に0〜?を表示
c = 0x30 | i;
LCD_data(c);
wait_ms(250);
wait_ms(250);
PORTA ^= 0x01; // DEBUG
}
LCD_cmd(0xA8); // LCDアドレス(2行目)
for (i=0 ; i<16 ; i++) { // 2行目に@〜Oを表示
c = 0x40 | i;
LCD_data(c);
wait_ms(250);
wait_ms(250);
PORTA ^= 0x01; // DEBUG
}
}
}
// ==================== PICの初期化 ===========================
static void pic_init() {
OSCCON = 0x71; // INTOSC 8MHz
ANSEL = 0x00; // AN未使用
ANSELH = 0x00; // AN未使用
TRISA = 0xFE; // RA0:out
TRISD = 0x03; // RD2-7:out
PORTA = 0x00;
PORTD = 0x00;
return;
}
// ====================== LCD 送信(4bit) ======================
static void LCD_send4(unsigned char c) {
PORTD = (PORTD & 0x0F) | c;
LCD_E = 1;
NOP();
LCD_E = 0;
return;
}
// ==================== LCDコマンドWRITE =================
static void LCD_cmd(unsigned char cmd) {
LCD_RS = 0;
PORTD = (PORTD & 0x0F) | (cmd & 0xF0);
LCD_E = 1; // 上位4ビット書き込み
NOP();
LCD_E = 0;
PORTD = (PORTD & 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;
PORTD = (PORTD & 0x0F) | (cmd & 0xF0);
LCD_E = 1; // 上位4ビット書き込み
NOP();
LCD_E = 0;
PORTD = (PORTD & 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モードに)@
wait_ms(5);
LCD_send4(0x30); // DB4-7に'3'を出力(8bitモードに)A
wait_ms(1);
LCD_send4(0x30); // DB4-7に'3'を出力(8bitモードに)B
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=32 ; i>0 ; i--) {}
return;
}
// ==================== 1mSウェイトルーチン ================
static void wait_1ms() {
unsigned char i;
for (i=250 ; i>0 ; i--) {
NOP();
NOP();
NOP();
NOP();
NOP();
}
return;
}
// ==================== 1mS×ms ウェイトルーチン ===========
static void wait_ms(unsigned char ms) {
unsigned char c;
for (c=ms ; c>0 ; c--) {
wait_1ms();
}
return;
}
// ========================== ここまで ==============================