完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
函 数 名 : Ds1302Read
* 函数功能 : 读取一个地址的数据 * 输 入 : addr * 输 出 : dat *******************************************************************************/ uchar Ds1302Read(uchar addr) { uchar n,dat,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;//从最低位开始接收 dat = (dat>>1) | (dat1<<7);//不懂的就是这一处,当把dat1的数据左移7位后,那么岂不是每次都是DSIO的最后一位放到dat的第一位吗?可是实际需要时把DSIO从低到高放到dat中呀?实在是想不通 SCLK = 1; _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); } RST = 0; _nop_(); //以下为DS1302复位的稳定时间,必须的。 SCLK = 1; _nop_(); DSIO = 0; _nop_(); DSIO = 1; _nop_(); return dat; } |
|
相关推荐
5 个讨论
|
|
|
应该是对的把,执行有先后顺序的
|
|
|
|
|
|
|
|
人中狼 发表于 2017-7-16 18:43 谢谢您的回答,您讲的这个关于dat的移动我是懂的,我不懂的是dat1的移动,dat1左移7位后,比如原来dat1是0000 0001 就变成了1000 0000 ,经过dat = (dat>>1) | (dat1<<7)的运算,dat就成了1xxx xxxx;第二次循环时,data右移1位,dat1仍然左移7位,那么,经过dat = (dat>>1) | (dat1<<7)的运算后,dat就成了11xx xxxx 。如此循环,每次都是把dat1的最低位放到dat的最高位去,这样显然是不对的。 |
|
|
|
|
|
|
|
112 浏览 0 评论
219 浏览 0 评论
721 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
702 浏览 0 评论
有人有STM8H1K08T连接TM1650的源码吗,可以直接使用的那种,我的代码在烧录之后数码管一直处于熄灭状态
1036 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16972 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-10 10:52 , Processed in 0.598263 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1490