完善资料让更多小伙伴认识你,还能领取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码,另一种说法是转换成十进制。个人理解……
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2594 浏览 0 评论
1560 浏览 0 评论
ESP32驱动ST7789触摸屏开发指南:LVGL主题设置与示波器面板
1249 浏览 0 评论
ULink2 和keil4 连接显示 SWD通讯失败,硬件在另一台电脑上是可以连接成功的,有没有大佬能帮忙解答一下的
2212 浏览 0 评论
2788 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
13069 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-5-7 17:31 , Processed in 0.572695 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191