求助PCF8563c51程序显示问题?想不通啊,郁闷!

2020-02-05 09:30发布

编写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();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
river0830
2020-02-05 15:28
唉,采用下面指令分钟显示也不正常了,走到6分就变为0了,
LCDSendData(etime.min/10+0x30);  
LCDSendData(etime.min%10+0x30);
改为
LCDSendData(num[1]/16+0x30);  
LCDSendData(num[1]%16+0x30);
显示了半个小时了,没出现问题,估计小时显示也得改了,不然走了5、6个小时后就能归零了
I2C读写时序没问题,采用结构体数据的键盘扫描也没问题,没有仿真器,就只能反汇编一步一步查,太郁闷了

一周热门 更多>