有哪位用DS1302调试显示时间成功的,可不可以帮我看一下,或者有调试成功的可以给我参考一下,我现做的东西急需要显示当前时间,调试的时候读不出时间,非常着急,求帮助,谢谢了
/***************************1302写入操作*********************/
void write_byte(uchar dat)
{
uchar a;
ACC=dat;
for(a=8;a>0;a--) //循环8次 写入数据
{
IO=ACC0; //每次传输低字节
SCLK=1; //错误,先为1后为0
SCLK=0;
ACC=ACC>>1; //右移一位
}
}
uchar read_byte()//读一个字节
{
uchar a;
for(a=8;a>0;a--)
{
ACC=ACC>>1;
ACC7=IO;
SCLK=1;
SCLK=0;
}
return(ACC);
}
/***************************1302写入数据*****************************/
void write_1302( uchar add,uchar dat ) //先写地址,再写数据
{
RST=0;
SCLK=0;
RST=1; //重新工作
write_byte(add); //发送地址
write_byte(dat); //发送数据
// SCLK=1;
RST=0;
}
/***************************1302读出数据***********************************/
uchar read_1302(uchar add) //先送地址,再读数据
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
//SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init() //1302芯片初始化子函数
{
if(read_1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化
{
return;
}
else
{
write_1302(0x8e,0x00); //关闭写保护
write_1302(0x90,0x00); //电池充电设置
write_1302(0x80,0x00); //秒
write_1302(0x82,0x54); //分
write_1302(0x84,0x20); //时
write_1302(0xd0,0x55); //写RAM
write_1302(0x8e,0x80); //打开写保护
}
}
void read_data(void)
{
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
write_com(0x80);
write_data(shi/10+0x30);
write_data(shi%10+0x30);
write_data(':');
write_data(fen/10+0x30);
write_data(fen%10+0x30);
write_data(':');
write_data(miao/10+0x30);
write_data(miao%10+0x30);
}
void main()
{
lcd_init();
write_com(0x01);
lcd_display();
ds1302_init();
while(1)
{
read_data();
key();
delayms(5);
}
}
|