完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想用数码管显示DS1302的值,不知道为什么返回值一直是FF,求各位大神搭一下眼
#include #include #define uchar unsigned char #define uint unsigned int ***it io=P3^4; //数据线为P3.4,片选线为P3.5,时钟线为P3.6 ***it ce=P3^5; ***it scl=P3^6; ***it LSA=P2^2; //38译码器进行位选,P0口进行段选 ***it LSB=P2^3; ***it LSC=P2^4; uchar time[7]; uchar timer[8]={0}; uchar code displaynum[]={ //数码管段选值,最后一位为-做时间间隔符 0x3f,0x06,0x5B,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x40 }; uchar code set[]={0x00,0x30,0x20,0x10,0x03,0x04,0x16}; //要设定的时间值20点30分00秒 uchar code read_com[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读取命令及地址 uchar code write_com[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写入命令及地址 void ds1302_byte_write(uchar add,uchar dat) { uchar mask; ce=0; _nop_(); scl=0; _nop_(); ce=1; _nop_(); for(mask=0x01;mask!=0;mask<<=1)//输入地址命令 { if(add&mask!=0) io=1; else io=0; scl=1; _nop_(); scl=0; _nop_(); } for(mask=0x01;mask!=0;mask<<=1)//输入设定时间值 { if(dat&mask!=0) io=1; else io=0; scl=1; _nop_(); scl=0; _nop_(); } ce=0; _nop_(); } uchar ds1302_byte_read(uchar add) { uchar mask,dat; dat=0; ce=0; _nop_(); scl=0; _nop_(); ce=1; _nop_(); for(mask=0x01;mask!=0;mask<<=1) //输入地址命令 { if(add&mask!=0) io=1; else io=0; scl=1; _nop_(); scl=0; _nop_(); } _nop_(); for(mask=0x01;mask!=0;mask<<=1) //读取时间值 { if(io!=0) dat=dat|mask; scl=1; _nop_(); scl=0; _nop_(); } ce=0; //仿照例程加入的恢复 _nop_(); scl=1; _nop_(); io=0; _nop_(); io=1; _nop_(); return dat; } void display() { uchar i,j; for(i=0;i<8;i++) //使用38译码器控制八个位选端,P0口控制段选 { switch(i) { case(0):LSA=0;LSB=0;LSC=0;break; case(1):LSA=1;LSB=0;LSC=0;break; case(2):LSA=0;LSB=1;LSC=0;break; case(3):LSA=1;LSB=1;LSC=0;break; case(4):LSA=0;LSB=0;LSC=1;break; case(5):LSA=1;LSB=0;LSC=1;break; case(6):LSA=0;LSB=1;LSC=1;break; case(7):LSA=1;LSB=1;LSC=1;break; } P0=displaynum[timer[i]]; j=50; //持续50ms while(j--); P0=0X00; //消隐 } } void ds1302_init() { uchar i; ds1302_byte_write(0x8E,0x00); //解除写保护 for(i=0;i<7;i++) { ds1302_byte_write(write_com[i],set[i]); //输入设定时间值 } ds1302_byte_write(0x8E,0X80); //添加写保护 } void main() { uchar j; ds1302_init(); while(1) { for(j=0;j<7;j++) //读取时间值放入time数组 { time[j]=ds1302_byte_read(read_com[j]); } timer[0]=time[2]/16; //把time数组中的时间值秒分时,各分为两部分,便于数码管显示 timer[1]=time[2]%16; timer[2]=16; //时间分隔符 timer[3]=time[1]/16; timer[4]=time[1]%16; timer[5]=16; timer[6]=time[0]/16; timer[7]=time[0]%16; display(); } } |
|
相关推荐
2个回答
|
|
代码看不出来 ,你是要做毕设还是? 需要代做吗 1002925094
|
|
|
|
找出问题了(add&mask)!=0
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
460 浏览 0 评论
【敏矽微ME32G070开发板免费体验】+ADC测试与LED点亮
418 浏览 0 评论
飞凌嵌入式-ELFBOARD ELF 2的硬件知识分享--核心板
352 浏览 0 评论
【敏矽微ME32G070开发板免费体验】\\+Lora通信终端产品开发项目
514 浏览 0 评论
1576 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 02:47 , Processed in 0.515339 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号