完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
从我学习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--)就可以了呢???这两个在我看来可是完全等价的啊!最后虽然还是调出来了,但我还是很疑惑,我情愿我还没有调出来,因为我还没有弄懂为什么是这样子。。。。 我只是一个在学单片机的菜鸟,还请各位高手帮忙解解我的困惑。。。。。。 |
|
相关推荐
2个回答
|
|
没碰到过,帮不了你!
|
|
|
|
两个循环的次数是一样的,但i的大小变化不同,(i=0; i<8; i++)是i逐步增加,而(i=8; i>0, i--)i是逐步减小的,而ds1302写时必须是从低位向高位来写。和 ACC = ACC >> 1;进行配合,假若i是增加的,地址也是增加的,那应该没有问题,但若i是增加的而地址是减小的,那就会产生矛盾。估计问题出在这。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12035 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 00:13 , Processed in 0.500497 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号