从我学习C语言以来,我就一直以为for(i = 0; i < 8; i++)语句与for(i = 8; i > 0; i--)是等价的,两个语句的作用都是循环八次,当然,到现在我还是这样子以为。在这两个语句中,无论在什么时候我都会用前面那个,这只是我个人的一个编程习惯,可是,在今天写
单片机与DS1302的通讯协议时,却遇到了一些麻烦。。。。
在写单片机与DS1302的协议时,有两个向DS1302写出写入字节的函数,其中有一个写入字节的函数我是这样子写的:
void DS1302_InputByte(uchar dat)
{ uchar i;
ACC = dat;
DS1302_RST = 1;
for(i = 0; i < 8; i++)
{ DS1302_IO = ACC0;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
ACC = ACC >> 1;
}
}
在把其他函数都写好后,我就把程序下载到
开发板上调试,可一调试就出问题了,数码管上显示几个不动的乱码,而不是一秒一秒跳动的时钟。出问题了,就要去找问题的所在,因此,我就回头去查我写的代码,我先把无头紧要的函数都去掉,然后下载、调试,但问题还在,于是又删又改的,搞了很久,到最后只剩下几个很关键的函数,但还是老样子。。。。于是,我就去找配套资料的源代码,然后和我自己写的一条一条的作对比,最后发现配套上写入写出字节的函数是类似于这样子写的:
void DS1302_InputByte(uchar dat)
{ uchar i;
ACC = dat;
DS1302_RST = 1;
for(i = 8; i > 0; i--)
{ DS1302_IO = ACC0;
DS1302_SCLK = 1;
DS1302_SCLK = 0;
ACC = ACC >> 1;
}
}
两个函数的不同就只在于for循环,于是我就把我写代码中的for(i = 0; i < 8; i++)改成了for(i = 8; i > 0; i--),然后把程序下载到开发板上调试运行,没想到居然成功了,我看着数码管上跳动的数字,心情有点郁闷。。。。。就这个我就调了两三个小时啊!!!
虽然也经常用看DS1302的
芯片资料,但对于DS1302的通讯还不能做到全都懂。可是让我特别疑惑的是这个for循环啊,为什么用for(i = 0; i < 8; i++)不行??而用for(i = 8; i > 0; i--)就可以了呢???这两个在我看来可是完全等价的啊!最后虽然还是调出来了,但我还是很疑惑,我情愿我还没有调出来,因为我还没有弄懂为什么是这样子。。。。
我只是一个在学单片机的菜鸟,还请各位高手帮忙解解我的困惑。。。。。。
一周热门 更多>