1602液晶显示DS1302+S51时钟+温度显示
/*****************************************************
函 数 名:void Disp_line1()
功 能:显示时间和温度 (XX:XX:XX XX.X C)
说 明:第一行显示数据处理
入口参数:无
返 回 值:无
*****************************************************/
//屏幕显示第一行: 时间和温度显示
void Disp_line1(void)
{
Read_Temperature(10,0); //温度显示
//冒号闪烁
if(flag==0)
{DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}
else
{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}
if(sec==1) //秒闪烁标志位
{
if(flag==1)
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位
DisplayOneChar(8,0,R1302(0x81)%16+0x30); //显示秒个位
}
else
{
DisplayOneChar(7,0,0x20); //显示秒十位
DisplayOneChar(8,0,0x20); //显示秒个位
}
}
else
{
DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位
DisplayOneChar(8,0,R1302(0x81)%16+0x30); //显示秒个位
}
if(min==1) //分钟闪烁标志位
{
if(flag==1)
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位
DisplayOneChar(5,0,R1302(0x83)%16+0x30); //显示分钟个位
}
else
{
DisplayOneChar(4,0,0x20); //显示分钟十位
DisplayOneChar(5,0,0x20); //显示分钟个位
}
}
else
{
DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位
DisplayOneChar(5,0,R1302(0x83)%16+0x30); //显示分钟个位
}
if(hour==1) //小时闪烁标志位
{
if(flag==1)
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位
DisplayOneChar(2,0,R1302(0x85)%16+0x30);//显示小时个位
}
else
{
DisplayOneChar(1,0,0x20); //显示小时十位
DisplayOneChar(2,0,0x20); //显示小时个位
}
}
else
{
DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位
DisplayOneChar(2,0,R1302(0x85)%16+0x30);//显示小时个位
}
}
/*****************************************************
函 数 名:void Disp_line2()
功 能:显示日期和星期 (XX/XX/XX Week.X)
说 明:第二行显示数据处理
入口参数:无
返 回 值:无
*****************************************************/
// 屏幕显示第二行 日期和星期
void Disp_line2(void)
{
DisplayOneChar(3,1,0x2f); //显示固定字符
DisplayOneChar(6,1,0x2f);
DisplayListChar(10,1,week);
if(year==1) //年闪烁标志位
{
if(flag==1)
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年十位
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//显示年个位
}
else
{
DisplayOneChar(1,1,0x20); //显示年十位
DisplayOneChar(2,1,0x20); //显示年个位
}
}
else
{
DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年十位
DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//显示年个位
}
if(mon==1) //月闪烁标志位
{
if(flag==1)
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月十位
DisplayOneChar(5,1,R1302(0x89)%16+0x30);//显示月个位
}
else
{
DisplayOneChar(4,1,0x20); //显示月十位
DisplayOneChar(5,1,0x20); //显示月个位
}
}
else
{
DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月十位
DisplayOneChar(5,1,R1302(0x89)%16+0x30);//显示月个位
}
if(day==1) //日闪烁标志位
{
if(flag==1)
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日十位
DisplayOneChar(8,1,R1302(0x87)%16+0x30);//显示日个位
}
else
{
DisplayOneChar(7,1,0x20); //显示日十位
DisplayOneChar(8,1,0x20); //显示日个位
}
}
else
{
DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日十位
DisplayOneChar(8,1,R1302(0x87)%16+0x30);//显示日个位
}
if(weekk==1) //星期闪烁标志位
{
if(flag==1)
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
}
else
{
DisplayOneChar(15,1,0x20); //显示星期
}
}
else
{
DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
}
}
//================================ LCM1602控制部分 =======================================
/*****************************************************
函 数 名: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;
}
/*****************************************************
函 数 名: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 LCMInit()
功 能:初始化LCM1602
说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
入口参数:无
返 回 值:五
*****************************************************/
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0); // 0x38指令表示:8位数据显示模式,俩行多显示
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); // 关闭显示
WriteCommandLCM(0x01,1); // 显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
/*****************************************************
函 数 名:void DisplayOneChar()
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标
入口参数:X,Y,DData
返 回 值:
*****************************************************/
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x01;
X &= 0x0F; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
/*****************************************************
函 数 名:void DisplayListChar()
功 能:向指定坐标中写入字符串
说 明: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 <= 0xF) //X坐标应小于0xF
{
for(j=0;j
1602液晶DS1302S51时钟温度显 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)