---
---
16F1455のDigital I/Oに、小型16文字x2行のLCD表示器を接続しました。LCDは、4ビット接続とし、PortCに接続されています。
文字を画面に表示するだけのプログラムです。プログラムは、メインプロルーティンとLCD表示関数から構成されています。 メインルーティンは、これら表示関数を呼び出して、文字を表示させます。具体的には、以下の手順で表示します。
*注意*
アプリケーションプログラムを動作させる時は、PICkit3を取り外すか、一度電源をOFFにしリセットする必要があります。
<プログラム>
//*********************************************************
// データをLCDに表示する。
// 1)Define I/O PORT
// PIC pin : LCD pin PIC pin : LCD pin
// PORTC(3) 7 : LCD(DB7)14 PORTC(4) 6 : LCD_(EN) 6
// PORTC(2)14 : LCD(DB6)13 GND : LCD_(RW) 5
// PORTC(1)15 : LCD(DB6)12 PORTC(5) 5 : LCD_(RS) 4
// PORTC(0)16 : LCD(DB4)11 VR : LCD_(Vo) 3
// +3.3v : LCD(Vdd) 2
// GND : LCD(Vss) 1
// 2)OSC
// 4MHz (内部クロック)
//
// Language: MPLABX XC8
// Target: PIC16F1455
//*********************************************************
#include <xc.h>
#define _XTAL_FREQ 4000000
//************* I/O Define **********************
#define LCD_DB LATC
#define LCD_EN LATC4
#define LCD_RS LATC5
//************* Config **********************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF
//********************************************************
void LCD_dat(char); // 1文字表示
void LCD_cmd(char); // コマンド出力
void LCD_clr(void); // 全消去
void LCD_int(void); // 初期化
void LCD_str(char *); // 文字列表示
void LCD_ROMstr(const char *); // ROM文字列表示
void LCD_posyx(char,char); //カーソル位置指定、行 y、横位置 x
void LCD_hex(char); // 16進文字変換表示
//////////// Main //////////////////////////////////
void main(void){
char msgStart[] ="LCD Test";
unsigned char num = 0;
OSCCON = 0b00110100; // 内部クロック4Mhz
TRISC = 0b00000000; // LCD接続端子を出力にする
LCD_int(); // LCD初期化
// --------------------------------------------
LCD_str(msgStart); // 1行目に表示
LCD_dat(' ');
LCD_dat('!');
// --------------------------------------------
LCD_posyx(1,0); // 2行目に表示
LCD_ROMstr("1234567890123456");
while(1){
LCD_posyx(0,14); // 1行14文字目に表示
LCD_hex(num++); // 数値を表示し、+1する
__delay_ms(1000); // 1000msec
}
}
//////////// LCD //////////////////////////////////
//-------- 上位4ビットをデータ出力 (Lower nibble接続)
void LCD_out(char c){
LCD_DB = (c>>4) | (LCD_DB & 0xF0);
LCD_EN = 1; // Enable Hi
NOP(); // NOP
LCD_EN = 0; // Enable Low
}
//-------- 1文字表示
void LCD_dat(char c){
LCD_RS = 1; // 表示データの送信
LCD_out(c); // 上位4ビット出力
LCD_out(c<<4); // 下位4ビット出力
__delay_us(50); // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char c){
LCD_RS = 0; // コマンドデータの送信
LCD_out(c); // 上位4ビット出力
LCD_out(c<<4); // 下位4ビット出力
if(c & 0xFC) // 上位6ビットに1がある命令
__delay_us(50); // 50usec
else
__delay_ms(2); // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
LCD_cmd(0x01); //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
unsigned char pcode;
switch(ypos & 0x03){
case 0: pcode=0x80;break;
case 1: pcode=0xC0;break;
case 2: pcode=0x94;break;
case 3: pcode=0xD4;break;
}
LCD_cmd(pcode += xpos);
}
//-------- 文字列出力
void LCD_str(char *str){
while(*str) //文字列の終わり(00)まで継続
LCD_dat(*str++); //文字出力しポインタ+1
}
// //-------- Rom 文字列出力
void LCD_ROMstr(const char *str){
while(*str) //文字列の終わり(00)まで継続
LCD_dat(*str++); //文字出力しポインタ+1
}
//-------- 16進文字変換表示
void LCD_hex(char c){
const char hexch[] ="0123456789ABCDEF";
LCD_dat(hexch[c >> 4]);
LCD_dat(hexch[c & 0xF]);
}
//-------- 初期化
void LCD_int(void){
__delay_ms(40); //40msec
LCD_RS = 0; //コマンドの送信
LCD_out(0x30);__delay_ms(5); // 8bit mode set//5msec
LCD_out(0x30);__delay_ms(1); // 8bit mode set
LCD_out(0x30);__delay_ms(1); // 8bit mode set
LCD_out(0x20);__delay_ms(1); // 4bit mode set
LCD_cmd(0x2E); // DL=0 (4bit mode)
LCD_cmd(0x08); // Display off
LCD_cmd(0x0C); // Display on Cursor=1 Blink=0
LCD_cmd(0x06); // Entry Inc/Dec=1 Shift=0
LCD_cmd(0x01); // Clear
}