完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 chenengood 于 2013-2-22 10:36 编辑
我用4个4位一体的数码管做一个万能历, 如:2个4位一体的数码管显示年月日:13-02-21, 还有2个4位一体的数码管显示时分秒:11-34-53。 问下大家 16位(个)数码管动态扫描 显示不清楚,不知道怎么调整 延时时间长了,一闪一闪,延时时间短了,看不清楚 。如果少显示几个数码管,效果又好一点。 附上程序,望大家参考一下(仿真完全OK,硬件使用的话,数码管多了,就不行了)。 #include #define uchar unsigned char #define uint unsigned int ***it ds1302_sclk = P3^6; ***it ds1302_rst = P3^5; ***it ds1302_io = P3^4; uchar code gongyin[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //共阴0~9,-,熄灭 uchar code weixuan[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; uchar tab[16]; void delay() //延时计算约等于 a*0.011ms { uint a; for(a=30;a>0;a--); //a*0.011ms } void write1302byte(uchar dat) {uchar i; ds1302_rst=1; ds1302_sclk=0; for(i=8;i>0;i--) { ds1302_io=dat&0x01; _nop_(); _nop_(); ds1302_sclk=1; _nop_(); _nop_(); ds1302_sclk=0; dat>>=1; } } uchar read1302byte() { uchar i,dat=0; for(i=8;i>0;i--) { dat>>=1; if(ds1302_io) dat|=0x80; //dat=dat|0x80; ds1302_sclk=1; _nop_(); _nop_(); ds1302_sclk=0; _nop_(); _nop_(); } return dat; //返回读取的数 } void write1302(uchar cmd,uchar dat) { ds1302_rst=0; ds1302_sclk=0; _nop_(); _nop_(); ds1302_rst=1; write1302byte(cmd); _nop_(); write1302byte(dat); ds1302_sclk=1; ds1302_rst=0; } uchar read1302(uchar cmd) {uchar dat; ds1302_rst=0; ds1302_sclk=0; _nop_(); _nop_(); ds1302_rst=1; _nop_(); _nop_(); write1302byte(cmd); dat=read1302byte(); ds1302_sclk=1; ds1302_rst=0; return dat; } void init1302() //初始化DS1302 { //写入2013-02-28星期三 23:58:51 write1302(0x8e,0x00); write1302(0x80,(51/10*16+51%10)); //写入51秒 0101.0001 write1302(0x82,(58/10*16+58%10)); //写入58分 0101.1000 write1302(0x84,(23/10*16+23%10)); //写入23时 0010.0011 write1302(0x86,(28/10*16+28%10)); //写入28日 write1302(0x88,( 2/10*16+ 2%10)); //写入2月 write1302(0x8a,( 3/10*16+ 3%10)); //写入星期三 write1302(0x8c,(13/10*16+13%10)); //写入13年,2013 write1302(0x8e,0x80); } void main() { init1302(); while(1) { uchar i; //时-分-秒 tab[0]=read1302(0x85)/16; //存放时,十位 tab[1]=read1302(0x85)&0x0f; //存放时,个位 tab[2]=10; tab[3]=read1302(0x83)/16; //存放分,十位 tab[4]=read1302(0x83)&0x0f; //存放分,个位 tab[5]=10; tab[6]=read1302(0x81)/16; //存放秒,十位 tab[7]=read1302(0x81)&0x0f; //存放秒,个位 //年-月-日 tab[8]=read1302(0x8D)/16; //存放年,十位 tab[9]=read1302(0x8D)&0x0f; //存放年,个位 tab[10]=10; //数码管显示“—” tab[11]=read1302(0x89)/16; //存放月,十位 tab[12]=read1302(0x89)&0x0f; //存放月,个位 tab[13]=10; tab[14]=read1302(0x87)/16; //存放日,十位 tab[15]=read1302(0x87)&0x0f; //存放日,个位 for(i=0;i<16;i++) { P2=weixuan; //数码管位选 P0=gongyin[tab]; //数码管段选 delay(); P2=0X00; //消影 P0=0X00; delay(); } } } |
|
相关推荐
11个回答
|
|
闪的话应该是显示时间太短了
|
|
|
|
楼主的帖子怎么仅作者可见
|
|
1 条评论
|
|
|
|
|
|
|
|
不懂,但支持能人,加强学习.
|
|
|
|
|
|
很棒好喜欢纳
|
|
|
|
对于这个问题,我觉得可能是硬件的驱动没做好,如果仿真没问题的话,就应该是硬件的原因了。不过可以这么改把年月日改为静态显示。
|
|
|
|
年月日 改为静态显示?51单片机哪有这么多IO资源啊?难道每个数码管都加一个锁存器? |
|
|
|
主程序中,FOR循环前面那一连串用来读取年月日的,不用随时读取,LED扫秒速度被拖慢了,
1秒左右读一次可以了! char j=0; j++ if(j>=200) //按实际需要可以修改,控制在1秒左右 { j=0; 在这儿加入读取年月日和时间的代码 } |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
479 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
229 浏览 0 评论
334 浏览 0 评论
165 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》 第十六章 WATCH_DOG实验
496 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11972 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 13:20 , Processed in 1.098714 second(s), Total 107, Slave 86 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号