最近研究DS1302做的一个只显示小时、分钟和秒的程序时,在其的一个子程序中发现的一个问题,子程序代码如下:
* 函 数 名 : Ds1302Read
* 函数功能 : 读取一个地址的数据
* 输 入 : addr
* 输 出 : dat2
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat1,dat2;
EA =0; //在此设置一个断点,调试发现程序第一次到这里时,addr=0x81,dat1=0x81,dat2=0x08;而且在执行下面第一个for循环时,dat2的值总是与addr的值相同的,此程序在其他地方没有出现或者用到这个dat2,为什么第一次在初始化dat2后会有值?不应该是0么?而且addr与dat1为什么总是相同的?
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat2 = (dat2>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
EA = 1;
return dat2;
}
请大神指教!!
|