单片机c语言问题 时钟芯片1302程序问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 20:50:36
麻烦高手给我看一下下面的程序,用1302时钟芯片在1602lcd上显示时间,
为什么我这个程序显示的数是00:00:00时钟怎么没走啊?
先说声谢谢了,我是初学者...呵呵...

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dsrst=P2^4;
sbit dsio=P2^5;
sbit dssclk=P2^6;
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcdre=P3^2;
char shi,fen,miao;
void delay(uint);
void write_ds(uchar com)
{
uchar i;
dsrst=1;
dssclk=0;
for(i=0;i<8;i++)
{
dssclk=0;
dsio=com&0x01;
com=com>>1;
dssclk=1;
dssclk=0;
}
}
uchar read_ds(void)
{
uchar i,dat;
dsrst=1;
dssclk=1;
for(i=0;i<8;i++)
{
dssclk=1;
dat>>=1;

if(dsio==1)
dat=dat&0x80;

dssclk=0;
}
return dat;
}
void write_ds_set(uchar com,uchar dat)
{
dsrst=0;
dssclk=0;
dsrst=1;
write_ds(com);
write_

我没用过这个片子,对它的通信协议不是很了解,分析程序发现以下代码好像有问题:
for(i=0;i<8;i++)
{
dssclk=0;
dsio=com&0x01;

/*dsio是P2^5,只有一位,而com&0x01是一个8位数,不知道这种操作会有什么后果,建议将代码"dsio=com&0x01;"改为:
dsio=0;
if(com&0x01) dsio=1;*/

com=com>>1;
dssclk=1;
dssclk=0;
}

for(i=0;i<8;i++)
{
dssclk=1;
dat>>=1;

if(dsio==1)
dat=dat&0x80;
/*这个地方的意思是不是,如果dsio=1,那么dat的最高位置一。这样的话就应改为:dat|=0x80;
我想你的问题就出在代码“dat=dat&0x80;”上,它的直接后果就是将dat后7位(Bit0-Bit6)全部清零,而它的最高位Bit7也是0(dat>>=1的效果之一就是最高位补0),最后dat=0。这样,你所接收到的数据全是0,即00:00:00*/

dssclk=0;
}
return dat;
}

检查电路板,IC,LCD,示波器观察引脚波形, 模块化测试,一步一步解决问题...

http://blog.ednchina.com/warden/246079/message.aspx

我这里有一个也是1602显示1302时钟的,你可以下来看下;保证可用;

你的程序我