完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
请教郭天祥书中关于数码管的消影的问题
程序的一段如下: void main() { while(1) { dula=1; P0=table[1]; dula=0; P0=0xff; /*消影,避免高速显示时的显示混乱*/ wela=1; P0=0xfe; wela=0; delayms(500); dula=1; P0=table[2]; dula=0; P0=0xfd; wela=1; P0=0xfd; wela=0; delayms(500); 1.请问这样段选-消影-位选是最好的顺序还是较为良好的编程习惯? 2.我有试过其他的几种排列方式,没有显示混乱的是:段选-消影-位选;位-段-消;消-位-段; 显示混乱的是:位-消-段;段-位-消;消-段-位。这样看来似乎段选前一定要消影,可是郭天祥 书中的这段代码第二段的位选前不是没有消影吗?第一段的位选不会影响到第二段的段选吗? 我不太理解,求大神指点 |
|
相关推荐
11个回答
|
|
消隐的作用是在上一个数据结束后,下一个数据来之前,对数码管进行清零or置1.貌似是第一段完成之后把段选关了,第二段再打开就不用消隐了
|
|
|
|
我懂了,我试过在dula=1后加delayms(500);之后出现显示混乱。可能因为数据从芯片到端口需要一定时候,数码管响应需要时间,数码管来不及响应IO口就已经更新了,位选后的delayms(500);是为了让数码管响应进入正常工作,和让人识别到灯亮了 虽然已经懂了但谢谢你的雪中送炭啊 |
|
|
|
真正的不是段选前一定要消隐。而是位选前一定要将段码变成高电平不显示才改变位选。而你这种情况比较特殊。他的段选和位选都是由P0口通过锁存器控制。要锁存器时能端高电平才能改变数据。而且锁存器数据改变也是有一定时间的,因此影响不大。这段代码没有实现理论上的全部消隐。
|
|
|
|
因为位选与段选不能同时改变,所以才需要消隐的。如果能做到两个同时变,那就不需要消隐。
最好的做法是先令位选=0xff,再给出段选,最后令位选=有效值(消-段-位)。这样是没有一点鬼影的。 不是你说的数据传输的延迟和数码管响应的延时。 如果按照我说的出现混乱,那是因为你并不是真正按照我说的去做。 给个示例: P0=0xff; /*消影,避免高速显示时的显示混乱*/ wela=1; wela=0; P0=table[1]; dula=1; dula=0; P0=0xfe; wela=1; wela=0; delayms(500); P0=0xff; /*每个前面都要*/ wela=1; wela=0; P0=table[2]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delayms(500); P0=0xff; /*每个前面都要*/ wela=1; wela=0; P0=table[3]; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delayms(500); ... 不妨按照上面的格式修改一下你的代码看看效果 |
|
|
|
动态扫描显示的,如果按照你说的,第二位数码管之前消影的话,就不能同时显示两位数了。扫描频率达到一定数值后,人眼有影像滞后的,不会看到有乱显。你可以把显示放到中断里面,不停调用显示,不消影,无乱显
评分
|
||
|
||
{:1:}{:1:}{:1:}{:1:}
|
|
|
|
其实这个东西我也是看郭天祥的书过来的,当时自己焊接的电路板就在消影的时候出的问题。具体问题还得具体分析啊。
评分
|
||
|
||
数码管在刷新下一个数据之前,上次的数据留有余晖;郭天祥书中的数码管是共阳数码管,所以要先写P0 = 0Xff来对数码管之前的数据关掉再去显示最新的数据,从而达到消隐的目的。
|
|
|
|
#include
#define uchar unsigned char #define uint unsigned int ***it dula=P2^6; ***it wela=P2^7; uchar code table[]={0x3f,0x06,0x5b, 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar code wetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; void delay(uint); void main() { while(1) { uchar num; for(num=0;num<6;num++) { P0=0xff; wela=1; wela=0; P0=table[num+1]; dula=1; dula=0; P0=wetab[num]; wela=1; wela=0; delay(0); } } } void delay(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 这样看便于分析。 |
|
|
|
|
|
|
|
youzizhile 发表于 2014-4-13 21:19 纠正下 是共阴数码管 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
820 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第十一章 KEY实验
388 浏览 0 评论
783 浏览 0 评论
801 浏览 2 评论
飞凌嵌入式-ELFBOARD-ELF 2硬件知识分享-最小系统原理
466 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11929 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 15:39 , Processed in 0.743469 second(s), Total 66, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号