以下读1302数据程序可正常运行,读出数据。请注意红色部分注解
uchar read_DS(uchar command)
{
uint i=0;
uchar zhi=0;
DS_RST=0; //此三句也是必须要的。否则又存在初始化归0问题。
DS_CLK=0;
DS_RST=1;
for(i=0;i<8;i++) //先写地址
{
DS_IO=command&0x01; //写数据时必须先将数据位置于IO口然后拉时钟。
//此句与下面两句交换位置也会出错。
DS_CLK=0;
DS_CLK=1; //时钟上升沿写数据有效
command>>=1; //从低位写起
}
for(i=0;i<8;i++) //再读数据
{
DS_CLK=1; //时钟下降沿后读数据有效,先读低位。
DS_CLK=0;
if(DS_IO) zhi|=0x01<<i; //0x01<<i;zhi=zhi|0x01;<< 优先级
else zhi|=0x00<<i; //此句可以不要。
// ACC0=DS_IO;
// zhi=zhi|(ACC<<i); //很奇怪此三句不能正确读出数据。
// ACC=0;
}
DS_RST=0;
zhi=(zhi/16*10)+zhi%16; //两位BCD码转换为十进制
return zhi;
}
-------------------------------
但是奇怪的是,标记红色部分语句若换成紫色语句则不能正确读出数据。但是仔细推敲感觉二者的功能相同啊!!
注:ACC0为宏定义,即ACC的第0位。
望高手指点迷津!!! |