/*————————————————————————–
LCD1602.H
The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
————————————————————————–*/
#ifndef __LCD1602_H__
#define __LCD1602_H__
/*衔接线图:
—————————————————
| LCM—–51 | LCM—–51 | LCM——51 |
| ———————————————– |
| DB0—–P0.0 | DB4—–P0.4 | RS——-P2.0 |
| DB1—–P0.1 | DB5—–P0.5 | RW——-P2.1 |
| DB2—–P0.2 | DB6—–P0.6 | E——–P2.2 |
| DB3—–P0.3 | DB7—–P0.7 | VLCD接1K电阻到GND |
—————————————————*/
/****************** LCD1602指令 ***********************************/
//输入方法设置
#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC主动增一
#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC主动减一
#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
//设置显现、光标及闪耀开、关
#define LCD_DISPLAY_ON 0x0C // 显现开
#define LCD_DISPLAY_OFF 0x08 // 显现关
#define LCD_CURSOR_ON 0x0A // 光标显现
#define LCD_CURSOR_OFF 0x08 // 光标不显现
#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪耀
#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪耀
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 // LCD显现左移一位
#define LCD_RIGHT_MOVE 0x1C // LCD显现右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
//作业方法设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显现
#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显现
#define LCD_CLEAR_SCREEN 0x01 // 清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 榜首行DDRAM开端地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM开端地址
#define LINE1 0 // 榜首行
#define LINE2 1 // 第二行
#define LINE_LENGTH 8 // 每行的最大字符长度
/***********************LCD1602接线引脚界说**************************/
#define LCM_RS P2_0 // 数据/指令挑选信号
#define LCM_RW P2_1 // 读/写挑选信号
#define LCM_E P2_2 // 使能信号
#define LCM_Data P0 // 显现数据端口
#define Busy 0x80 // 用于检测LCM状况字中的Busy标识
#define uchar unsigned char
#define uint unsigned int
//================================ LCM1602操控部分 =========================================================
/*****************************************************
函 数 名:void Delay_LCD(void)
功 能:5ms延时
说 明:LCD显现延时
进口参数:无
返 回 值:无
*****************************************************/
void Delay_LCD(void)
{
uint TempCyc = 5552; // 放入延时数据
while(TempCyc–)
{
;
}
}
/*****************************************************
函 数 名:uchar ReadStatusLCM()
功 能:读忙状况
说 明:判别LCM的作业状况;也能够不必此函数,用一段延时程序替代
进口参数:无
返 回 值:LCM_Data
*****************************************************/
//读状况
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF; // LCM数据口先置1
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy) // 检测忙信号.假如忙,则不履行
{
;
}
return (LCM_Data); // 不忙回来读取数据
}
/*****************************************************
函 数 名:void WriteDataLCM()
功 能:向LCM1602中写入数据
说 明:将形参WDLCM中的数据写入LCM中
进口参数:WDLCM
返 回 值:无
*****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); // 检测忙
LCM_Data = WDLCM; // 写入数据到LCM
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高能够在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}
/*****************************************************
函 数 名:void WriteCommandLCM()
功 能:向LCM1602中写入指令
说 明:向LCM中写入指令;假如BuysC=0时,疏忽忙检测,假如BuysC=1时,不疏忽忙检测
进口参数:WCLCM,BuysC
返 回 值:无
*****************************************************/
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时疏忽忙检测
{
if (BuysC)
{
ReadStatusLCM(); // 根据需要检测忙
}
LCM_Data = WCLCM; // 写入指令
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*****************************************************
函 数 名:void LCMInit()
功 能:初始化LCM1602
说 明:LCM在作业前先要对显现屏初始化,不然模块无法正常作业
进口参数:无
返 回 值:无
*****************************************************/
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显现形式设置,不检测忙信号
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表明:8位数据显现形式,俩行多显现
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显现形式设置,开端要求每次检测忙信号
WriteCommandLCM(LCD_DISPLAY_OFF,1); // 封闭显现
WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显现清屏
WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显现光标移动设置
WriteCommandLCM(LCD_DISPLAY_ON,1); // 显现开及光标设置
}
/*****************************************************
函 数 名:void DisplayOneChar()
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标,DData为ASCII值
进口参数:X,Y,DData
返 回 值:无
*****************************************************/
//按指定方位显现一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x01;
X &= 0x0F; // 约束X不能大于15,Y不能大于1
if (Y)
{
X |= LINE2_HEAD; // 当要显现第二行时地址码:0xc0
}
X |= LINE1_HEAD; // 榜首行的地址码:0x80
WriteCommandLCM(X, 0); // 这儿不检测忙信号,发送地址码
WriteDataLCM(DData);
}
/*在LCD1602中运用此函数,在DIPS082中运用下面的函数
/*****************************************************
函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
功 能:向指定坐标中写入字符串(在LCD1602中运用此函数)
说 明:X-横坐标,Y-纵坐标
进口参数:X,Y,*DData
返 回 值:无
*****************************************************
//按指定方位显现字符串
void DisplayListChar(uchar x,uchar y,uchar *DData)
{
if (y == LINE1) // 判别是否写入第1行
{
if (x < LINE_LENGTH) // 写入位数
{
WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址
for (;x
WriteDataLCM(*(DData++)); // 写入数据
}
if(*DData != \0) // 判别数据是否写完
{
x = 0; // 没写完写入第2行
y = LINE2;
}
}
}
if (y == LINE2) // 判别是否写入第2行
{
WriteCommandLCM(LINE2_HEAD+x,0); // 写入第2行地址
for (; x
WriteDataLCM(*(DData++)); // 写入数据
}
}
}*/
/*****************************************************
函 数 名:void DisplayListChar(uchar X, uchar Y, uchar code *DData)
功 能:向指定坐标中写入字符串(在DIPS082中运用此的函数)
说 明:X-横坐标,Y-纵坐标
进口参数:X,Y,*DData
返 回 值:无
*****************************************************/
//按指定方位显现一串字符 ***本来的遇到空格0x20就不显现***
void DisplayListChar(uchar X, uchar Y, uchar code *DData)
{
uchar ListLength,j;
ListLength = strlen(DData); // strlen:读取字符串的长度
Y &= 0x1;
X &= 0xF; // 约束X不能大于15,Y不能大于1
if (X <= 0x0F) // X坐标应小于0xF
{
for(j=0; j
DisplayOneChar(X, Y, DData[j]); // 显现单个字符
X++; // 横坐标加1,纵坐标不变
}
}
}
/*****************************************************
函 数 名:void Mychar()
功 能:自界说字符–CGRAM
说 明:LCM1602字符库中没有温度符号,自界说温度符号
进口参数:无
返 回 值:无
/*****************************************************/
void Mychar(void)
{
//———自界说字符代码–00H——闹铃符号————-
WriteCommandLCM(0x40,1); //第1行
WriteDataLCM(0x01);//
WriteCommandLCM(0x41,1); //第2行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x42,1); //第3行
WriteDataLCM(0x1d);//
WriteCommandLCM(0x43,1); //第4行
WriteDataLCM(0x19);//
WriteCommandLCM(0x44,1); //第5行
WriteDataLCM(0x1d);//
WriteCommandLCM(0x45,1); //第6行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x46,1); //第7行
WriteDataLCM(0x01);//
WriteCommandLCM(0x47,1); //第8行
WriteDataLCM(0x00);//
//———自界说字符代码–01H——-温度符号————
WriteCommandLCM(0x48,1); //第1行
WriteDataLCM(0x02);//
WriteCommandLCM(0x49,1); //第2行
WriteDataLCM(0x05);//
WriteCommandLCM(0x4a,1); //第3行 1——**–
WriteDataLCM(0x05);// 2—-**–**
WriteCommandLCM(0x4b,1); //第4行 3—-**–**
WriteDataLCM(0x02);// 4——**–
WriteCommandLCM(0x4c,1); //第5行 5———-
WriteDataLCM(0x00);// 6———-
WriteCommandLCM(0x4d,1); //第6行 7———-
WriteDataLCM(0x00);// 8———-
WriteCommandLCM(0x4e,1); //第7行
WriteDataLCM(0x00);//
WriteCommandLCM(0x4f,1); //第8行
WriteDataLCM(0x00);//
//———自界说字符代码–02H——-当时时刻————
WriteCommandLCM(0x50,1); //第1行
WriteDataLCM(0x1f);//
WriteCommandLCM(0x51,1); //第2行
WriteDataLCM(0x11);//
WriteCommandLCM(0x52,1); //第3行
WriteDataLCM(0x15);//
WriteCommandLCM(0x53,1); //第4行
WriteDataLCM(0x11);//
WriteCommandLCM(0x54,1); //第5行
WriteDataLCM(0x1b);//
WriteCommandLCM(0x55,1); //第6行
WriteDataLCM(0x0a);//
WriteCommandLCM(0x56,1); //第7行
WriteDataLCM(0x1f);//
WriteCommandLCM(0x57,1); //第8行
WriteDataLCM(0x00);//
//———————————————–
}
#endif