//初始化时钟芯片的秒寄存器,用数码管显示
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^4;
sbit IO=P1^5;
sbit RST=P2^2;
sbit Q0=P2^0; //第一位数码管
sbit Q1=P2^1; //第二位数码管
uchar code table[]={
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x98
};
void delay(uint z)
{
uchar i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void write_DS1302(uchar d)
{
uchar i,byte;
byte = d;
for(i=0; i<8; i++)
{
IO = (byte>>i)&0x01;
CLK = 1;
CLK = 0;
}
}
uchar read_DS1302()
{
uchar i,byte;
for(i=0; i<8; i++)
{
byte=byte>>1;
if(IO==1)
{
byte=byte|0x80;
}
CLK = 1;
CLK = 0;
}
return(byte);
}
void W1302(uchar ucAddr, uchar ucDa)
{
RST = 0;
CLK = 0;
RST = 1;
write_DS1302(ucAddr); /* 地址,命令 */
write_DS1302(ucDa); /* 写1Byte数据*/
CLK = 1;
RST = 0;
}
uchar R1302(uchar ucAddr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
write_DS1302(ucAddr); /* 地址,命令 */
ucData = read_DS1302(); /* 读1Byte数据 */
CLK = 1;
RST = 0;
return(ucData);
}
void main()
{
uchar byte;
W1302(0x8e,0x00);
W1302(0x80,0x00);
while(1)
{
W1302(0x8e,0x80);
byte=R1302(0x81);
P2=0xfe;
P0=table[byte/0x10];
delay(5);
P2=0xfd;
P0=table[byte%0x10];
delay(5);
}
问题是:我搞不太清楚DS1302 的时序。DS1302的datasheet里明明说上升沿写入数据,为什么write_DS1302(uchar d)函数写的是:
IO = (byte>>i)&0x01;
CLK = 1;
CLK = 0;
这不是下降沿吗?如果我改成:
IO = (byte>>i)&0x01;
CLK = 0;
CLK = 1;
结果就不对了。
还有一个问题是:read_DS1302()函数,如果我把它改成:
for(i=0; i<8; i++)
{
CLK = 1;
CLK = 0;
byte=byte>>1;
if(IO==1)
{
byte=byte|0x80;
}
}
或者:
for(i=0; i<8; i++)
{
if(IO==1)
{
byte=byte|0x80;
}
CLK = 1;
CLK = 0;
byte=byte>>1;
}
我觉得这两种写法没啥差呀。
求大牛指教,万分感谢!
} |