测试程序7:DS1302时钟芯片。刚开始时间能设置,能读写。后来在单步执行的过程中,一缕烟从DS1302上冒出来。不知是什么原因。芯片很烫。
现在好了。(在DS1302的数据端串入一个电阻可能更好,欢迎指正)。
时间设置与时间读取都用批传送模式。自定义了几个汉字。先上个图。
void ds1302wrNb(unsigned char * string)
{
//输入程序代码
DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;
DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;
DS1302CLK=0;
temp=0xbe;//read:80 write:81
for(i=0;i<8;i++) //write command to DS1302
{
if(temp&1) DS1302IO=1;else DS1302IO=0;
temp=temp>>1;
DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
}
while(*string!=0)
{
temp=*string;string++;
for(i=0;i<8;i++) //write data to DS1302
{
if(temp&1) DS1302IO=1;else DS1302IO=0;
temp=temp>>1;
DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
}
}
temp=0;//写 保护位
for(i=0;i<8;i++) //write data to DS1302
{
if(temp&1) DS1302IO=1;else DS1302IO=0;
temp=temp>>1;
DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
}
DS1302RST=0;
}
void d1302rdN(void)
{
//输入程序代码
DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;DS1302RST=0;
DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;DS1302RST=1;
DS1302CLK=0;
temp=0xbf;//read:80 write:81
for(i=0;i<8;i++) //write command to DS1302
{
if(temp&1) DS1302IO=1;else DS1302IO=0;
temp=temp>>1;
DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
}
DS1302IO=1;
for(j=0;j<7;j++)
{ temp=0;
for(i=0;i<8;i++)
{ temp>>=1;
if (DS1302IO) temp+=128;
DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;DS1302CLK=1;
DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;DS1302CLK=0;
}
dispbuf[j]=temp;
}
DS1302RST=0;
}
/*
func:0: time stop
1: time start
2: write protect
3: write free
4: charge mode 1
5: charge mode 2
*/
void ds1302ctr(unsigned char func)
{
//输入程序代码
if (func==0) {temp=ds1302read(0); temp|=0x80;ds1302write(0,temp); } //time stop
if (func==1) {temp=ds1302read(0); temp&=0x7f;ds1302write(0,temp); } //time start
if (func==2) {ds1302write(7,0x80); }
if (func==3) {ds1302write(7,0x0); }
}