delay1ms();
}
//函数功能:
判断液晶模块的忙碌状态
//返回值:
result。
result=1,忙碌;result=0,不忙
ucharBusyTest(void)
{
ucharresult;
WRITE_RS(0);//根据规定,RS为低电平,RW为高电平时,可以读状态
WRITE_RW
(1);
WRITE_E
(1);//E=1,才允许读写
delaynms(20);//空操作四个机器周期,给硬件反应时间
result=READ_BF();//将忙碌标志电平赋给result
WRITE_E(0);//将E恢复低电平
returnresult;
}
//函数功能:
将模式设置指令或显示地址写入液晶模块
//入口参数:
dictate
voidWriteInstruction(uchardictate)
{
while(BusyTest()==1);//如果忙就等待
WRITE_RS(0);//根据规定,RS和R/W同时为低电平时,可以写入指令
WRITE_RW(0);
WRITE_E(0);//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
delaynms(10);//空操作两个机器周期,给硬件反应时间
WRITE_DATABUS(dictate);//将数据送入P0口,即写入指令或地址
delaynms(20);//空操作四个机器周期,给硬件反应时间
WRITE_E
(1);//E置高电平
delaynms(20);//空操作四个机器周期,给硬件反应时间
WRITE_E(0);//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//函数功能:
指定字符显示的实际地址
//入口参数:
x
voidWriteAddress(ucharx)
{
WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
//函数功能:
将数据(字符的标准ASCII码)写入液晶模块
//入口参数:
y(为字符常量)
voidWriteData(uchary)
{
while(BusyTest()==1);
WRITE_RS
(1);//RS为高电平,RW为低电平时,可以写入数据
WRITE_RW(0);
WRITE_E(0);//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
WRITE_DATABUS(y);//将数据送入P0口,即将数据写入液晶模块
delaynms(20);//空操作四个机器周期,给硬件反应时间
WRITE_E
(1);//E置高电平
delaynms(20);//空操作四个机器周期,给硬件反应时间
WRITE_E(0);//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//函数功能:
对LCD的显示模式进行初始化设置
voidLcdInitiate(void)
{
delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);//连续三次,确保初始化成功
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delaynms(5);//延时5ms ,给硬件一点反应时间
}
//以下是1302数据的显示程序
//函数功能:
显示秒
//入口参数:
x
voidDisplaySecond(ucharx)
{
uchari,j;//i,j分别储存秒的十位,个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x4E);//写显示地址,将在第2行第15列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
显示分钟
//入口参数:
x
voidDisplayMinute(ucharx)
{
uchari,j;//i,j分别储存分钟的十位,个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x4B);//写显示地址,将在第2行第12列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
显示小时
//入口参数:
x
voidDisplayHour(unsignedcharx)
{
uchari,j;//i,j分别储存秒的十位,个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x48);//写显示地址,将在第2行第9列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
显示日
//入口参数:
x
voidDisplayDay(ucharx)
{
uchari,j;//i,j分别储存秒的十位,个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x0E);//写显示地址,将在第1行第15列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
显示月
//入口参数:
x
voidDisplayMonth(ucharx)
{
uchari,j;//i,j分别储存秒的十位,个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x0B);//写显示地址,将在第1行第12列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
显示年
//入口参数:
x
voidDisplayYear(ucharx)
{
uchari,j;//j,k,l分别储存温度的百位、十位和个位
i=x/10;//取十位
j=x%10;//取个位
WriteAddress(0x08);//写显示地址,将在第1行第9列开始显示
WriteData(digit[i]);//将百位数字的字符常量写入LCD
WriteData(digit[j]);//将十位数字的字符常量写入LCD
delaynms(50);//延时1ms给硬件一点反应时间
}
//函数功能:
液晶显示年月日以及时间
voiddisplaytime()
{
unsignedcharsecond,minute,hour,day,month,year;//分别储存秒、分、小时,日,月,年
unsignedcharReadValue;//储存从1302读取的数据
WriteAddress(0x03);//写Date的显示地址,将在第1行第4列开始显示
WriteData('T');//将字符常量写入LCD
WriteData('i');//将字符常量写入LCD
WriteData('m');//将字符常量写入LCD
WriteData('e');//将字符常量写入LCD
WriteData(':
');//将字符常量写入LCD
WriteAddress(0x0A);//写年月分隔符的显示地址,显示在第1行第11列
WriteData('-');//将字符常量写入LCD
WriteAddress(0x0D);//写月日分隔符的显示地址,显示在第1行第14列
WriteData('-');//将字符常量写入LCD
WriteAddress(0x4A);//写小时与分钟分隔符的显示地址,显示在第2行第11列
WriteData(':
');//将字符常量写入LCD
WriteAddress(0x4D);//写分钟与秒分隔符的显示地址,显示在第2行第14列
WriteData(':
');//将字符常量写入LCD
while
(1)
{
ReadValue=ReadSet1302(READ_SECOND);//从秒寄存器读数据
second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplaySecond(second);//显示秒
ReadValue=ReadSet1302(READ_MINUTE);//从分寄存器读
minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplayMinute(minute);//显示分
ReadValue=ReadSet1302(READ_HOUR);//从小时寄存器读
hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplayHour(hour);//显示小时
ReadValue=ReadSet1302(READ_DAY);//从日寄存器读
day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplayDay(day);//显示日
ReadValue=ReadSet1302(READ_MONTH);//从月寄存器读
month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplayMonth(month);//显示月
ReadValue=ReadSet1302(READ_YEAR);//从年寄存器读
year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化
DisplayYear(year);//显示年
}
}
//函数功能:
主函数
voidmain(void)
{
*P_IOA_Dir=0xffff;//可知IOA[0--5],和IOA[7--14这六个引脚都是输出控制引脚
*P_IOA_Attrib=0xffff;
*P_IOB_Dir=0x0000;//将IOB0设置成带下拉电阻的输入
*P_IOB_Attrib=0x0000;
*P_IOB_Buffer=0x0000;
LcdInitiate();//将液晶初始化
Init_DS1302();//将1302初始化
displaytime();//显示时间
}