搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2010-4-27 23:12:06 | 显示全部楼层 |阅读模式
编写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();
}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-4-28 00:04:20 | 显示全部楼层
唉,采用下面指令分钟显示也不正常了,走到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读写时序没问题,采用结构体数据的键盘扫描也没问题,没有仿真器,就只能反汇编一步一步查,太郁闷了

出0入0汤圆

发表于 2010-4-28 15:38:40 | 显示全部楼层
etime.sec=((num[0]/16)>>4)*10+num[0]&0x0f;
这句有问题,num[0]/16已经得到秒十位了,为什么还要右移4位?num[0]/16等于num[0]>>4

用下面的就好了
etime.sec=(num[0]/16)*10+num[0]&0x0f;

出0入0汤圆

 楼主| 发表于 2010-4-28 21:05:43 | 显示全部楼层
哦,谢谢2楼提醒,不过改了之后显示也不行啊,一样是走到15秒就为0了
etime.sec=(num[0]>>4)*10+num[0]&0x0f;
LCDSendData(etime.sec/10+0x30);
LCDSendData(etime.sec%10+0x30);

出0入0汤圆

发表于 2010-4-28 21:23:13 | 显示全部楼层
优先级问题
etime.sec=(num[0]>>4)*10+(num[0]&0x0f);

出0入0汤圆

 楼主| 发表于 2010-4-28 22:04:48 | 显示全部楼层
谢谢四楼提醒,+运算符优先级大于&,改后程序没问题了
呵呵,C语言不熟悉啊,还要努力才行!
呵呵,终于调试没问题了,感谢大家提醒,上传电子钟keil工程代码,带温度显示

出0入0汤圆

 楼主| 发表于 2010-4-28 22:06:39 | 显示全部楼层
电子钟程序,采用ds18b20,pcf8563,1602显示,四个独立按键,可以设置闹钟,调整时间和日期!

点击此处下载 ourdev_549996.rar(文件大小:65K) (原文件名:EClock.rar)

出0入0汤圆

发表于 2012-5-5 14:31:20 | 显示全部楼层
文件压缩包错误啊~~~哪里可以下载的~~~

出0入0汤圆

发表于 2012-5-5 14:44:37 | 显示全部楼层
river0830 发表于 2010-4-28 22:06
电子钟程序,采用ds18b20,pcf8563,1602显示,四个独立按键,可以设置闹钟,调整时间和日期!

点击此处下 ...

你好,请问能发一份到我邮箱吗?xinghuncool@163.com~~谢谢。目前论坛不能下载~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表