完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
问一下DS1302写的时候要把十进制数转为BCD码,读的时候要不要转回来呢?
下面是俺写的一个DS1302设置时间的函数,大伙看看这样写对不对? ====================================================== void write_ds1302(uchar add,uchar dat)// 写时序 { uchar i,k=0x01; rst=0; sck=0; rst=1; for(i=0;i<8;i++)//写地址 { if(add&k==0)sio=0; else sio=1; k<<=1; sck=1; sck=0; } k=0x01;//重新置K,将在下一for语句使用 for(i=0;i<8;i++)//写数据 { if(dat&k==0)sio=0; else sio=1; k<<=1; sck=1; sck=0; } rst=0; } ======================================================== uchar read_ds1302(uchar add) 读时序 { uchar i,k=0x01,dat=0; rst=0; sck=0; rst=1; for(i=0;i<8;i++)//写地址 { if(add&k==0)sio=0; else sio=1; k<<=1; sck=1; if(k!=0)sck=0;//当写完最后位时,K为0.此时SCK=1; } k=0x01;//重新置K,将在下一for语句使用 for(i=0;i<8;i++)//读数据 { sck=0;//产生下降沿,此时读数据 if(sio==1)dat|=k; k<<=1; sck=1; sck=0; } rst=0; return dat; } ================================================== void set_time(uchar *P) //写时间函数 { uchar i,tmp; for(i=0;i<7;i++)//十进制转为BCD码 { tmp=p[i]/10;//shiwei p[i]=(p[i]%10)+tmp*16; } write_ds1302(0x8e,0)//清写保护 for(i=0;i<7;i++) { write_ds1302(0x80+(2*i),p[i]);//将时间写入 delayms(1); } write_ds1302(0x8e,0x80)//写写保护; } |
|
相关推荐
3个回答
|
|
读完以后再转的。
|
|
|
|
very helpful, thanks
|
|
|
|
写的时候直接写十六进制表示的BCD码即可,比如要写如13年就写0X13,08月就写0X08……,读出的时候要把读出的BCD码分离成非压缩BCD码,另一种说法是转换成十进制。个人理解……
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
657 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
640 浏览 0 评论
753 浏览 1 评论
546 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
910 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11652 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 12:55 , Processed in 0.677409 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号