编写c51电子钟程序,出现了个奇怪的问题,程序如下
从pcf8563读出时间和日期值,读出数值暂存在数组num[]中,num[0]为秒数据(BCD码),将BCD码转换成十进制数放入结构体秒单元etime.sec=((num[0]/16)>>4)*10+num[0]&0x0f;
但是在1602液晶上显示的时候采用指令LCDSendData(num[0]/16+0x30); LCDSendData(num[0]%16+0x30);显示时钟正常.
采用指令LCDSendData(etime.sec/10+0x30); LCDSendData(etime.sec%10+0x30); 显示不正常,秒从0走到15就变为0了,但是其他显示没问题.
想不明白啊,请大家看看!
#include "i2c.h"
#include "1602.h"
#include "eclock.h"
struct time
{
char hour;
char min;
char sec;
uchar day;
char week;
uchar month;
char year;
uchar centry; // 表示19**/20**
};
uchar num[9]; // 时间日期存储缓冲区
struct time etime;
void pcf8563init(void)
{
I2CInit();
num[1]=0x02; //设置闹钟使能
num[5]=0x01;
num[7]=0x01;
I2CSendS(pcfsla,0,num,9);
num[0]=0x80; //关闭闹钟报警
num[1]=0x80;
num[2]=0x80;
num[3]=0x80;
I2CSendS(pcfsla,9,num,4);
delay10ms();
}
void Readpcf8563(void)
{
I2CRecS(pcfsla,2,num,7);
num[0]&=0x7f; // 秒
num[1]&=0x7f; // 分
num[2]&=0x3f; // 时
num[3]&=0x3f; // 日
num[4]&=0x07; // 星期
if(num[5]&0x80) // 判断是19** 还是 20**
etime.centry=19;
else
etime.centry=20;
num[5]&=0x1f; // 月
etime.sec=((num[0]/16)>>4)*10+num[0]&0x0f;
etime.min=((num[1]/16)>>4)*10+num[1]&0x0f;
etime.hour=((num[2]/16)>>4)*10+num[2]&0x0f;
etime.day=((num[3]/16)>>4)*10+num[3]&0x0f;
etime.week=num[4]&0x07;
etime.month=((num[5]/16)>>4)*10+num[5]&0x0f;
etime.year=((num[6]/16)>>4)*10+num[6]&0x0f;
//在1602上显示时间和日期
LCDSendCommand(LCDROW1ADR); //第一行显示 月/日 星期 小时:分钟:秒
LCDSendData(etime.month/10+0x30);
LCDSendData(etime.month%10+0x30);
LCDSendData('/');
LCDSendData(etime.day/10+0x30);
LCDSendData(etime.day%10+0x30);
LCDSendData(' ');
LCDSendData(etime.week+0x31);
LCDSendCommand(LCDROW1ADR+8);
LCDSendData(etime.hour/10+0x30);
LCDSendData(etime.hour%10+0x30);
LCDSendData(':');
LCDSendData(etime.min/10+0x30);
LCDSendData(etime.min%10+0x30);
LCDSendData(':');
LCDSendData(num[0]/16+0x30);
LCDSendData(num[0]%16+0x30);
//采用下面指令显示不正常
/*
LCDSendData(etime.sec/10+0x30);
LCDSendData(etime.sec%10+0x30);
*/
LCDSendCommand(LCDROW2ADR+2); //液晶第二行显示年
LCDSendData(etime.centry/10+0x30);
LCDSendData(etime.centry%10+0x30);
LCDSendData(etime.year/10+0x30);
LCDSendData(etime.year%10+0x30);
}
void main(void)
{
uchar i;
delay10ms();
for(i=9;i>0;i--)
num[i-1]=0;
pcf8563init();
initlcd();
while(1)
{
Readpcf8563();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
etime.sec=(num[0]>>4)*10+num[0]&0x0f;
LCDSendData(etime.sec/10+0x30);
LCDSendData(etime.sec%10+0x30);
一周热门 更多>