#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_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;
}
|