标题: 关于单片机数码管不灭的原因 [打印本页]

作者: 红了脚丫    时间: 2020-2-12 17:00
标题: 关于单片机数码管不灭的原因
我的数码管是直接和单片机连接的,没有用锁存器之类的。在按住按键时本来数码管是全部灭的,因为按键有松手检测,一直在那里死循环。可是我的秒钟十位那个数码管却亮着,而程序和分钟的十位一样,分钟十位的数码管却是灭的,真是搞不懂啊,我已经换了一个IO楼还是不行的。
作者: banalsheep    时间: 2020-2-12 21:59
检查一下是不是消隐问题
作者: qq603599910    时间: 2020-2-12 22:32
你看下按下按键循环前单片机做的最后一个动作是啥,一般这个就是在按键循环前IO最后的状态没有清零.
作者: csmyldl    时间: 2020-2-12 23:34
换IO口当然不能解决问题,只能修改程序去控制IO口的电平状态符合你想要的结果才能做到
作者: csmyldl    时间: 2020-2-13 02:26
至少有4位数码管,分钟2位 ,秒钟2位,按键前数码管全灭,但按键后程序有相应的显示控制(数码管要点亮),你的问题是按键未松开时,秒钟的十位亮了,而分钟也控制了且与秒钟程序完全一样,我想你这4个数码管一定是采用动态显示方式,动态显示就要去控制某一位点亮(某一时间),通过分析刚才是这时你控制了秒钟的十位亮了,最关键的是按键未松开怎么会有控制(你提到一直在那里死循环),最有可能的是你的按键在按下去抖动了,即你以为是一次按键,殊不知程序认为按下了几次,这样分析不知道是不是能解决你的困惑
作者: man1234567    时间: 2020-2-13 09:19
如果没有电平的转换指令,没有锁存也一样的效果。
作者: wannenggong    时间: 2020-2-13 10:22
不知道楼主的程序也搞不清现象,只能笼统的说了,一般都是设置一个数组做显示缓存,比如4位显示的数码时钟,设dat[4];调整小时的时候,显示数据为:
dat[0]=hour/10;
dat[1]=hour%10;
dat[2]=10;
dat[3]=10;
显示输出的时候就是;
for(i=0;i<4;i++)
{
Display_out(SEG7[dat[i]]);
****
}
其中:10的含义为------SEG7[10]=熄屏码,就是关闭不需要显示的数位。

作者: hantu    时间: 2020-2-13 12:56
程序有问题呗
作者: 红了脚丫    时间: 2020-2-13 14:49
banalsheep 发表于 2020-2-12 21:59
检查一下是不是消隐问题

谢谢,找到问题了,秒钟十位是放在数码管显示函数的最后一个,没有消隐,所以会显示。我现在也找到一个按住按键不放时会数码管会显示的方法,就是把显示函数放在松手检测死循环里了,具体见后面的程序截图。
作者: 红了脚丫    时间: 2020-2-13 14:51
不在一一回复谢谢各位了。
找到问题了,秒钟十位是放在数码管显示函数的最后一个,没有消隐,所以会显示。我现在也找到一个按住按键不放时会数码管会显示的方法,就是把显示函数放在松手检测死循环里了,具体见后面的程序截图。
作者: 红了脚丫    时间: 2020-2-13 14:56
程序部分截图

02.jpg (91.13 KB, 下载次数: 91)

02.jpg

01.jpg (288.49 KB, 下载次数: 138)

01.jpg

作者: lovexulu    时间: 2020-2-14 23:37
应该是扫描法驱动数码管的,一般扫描都会有最后一位显示过后不带消隐。如果想按键不妨碍显示,可以用分时序执行来解决。
作者: 1105730718    时间: 2020-2-15 14:48
进去循环前把断码清零,
作者: zjzj_007    时间: 2020-2-15 18:22
没有消隐,所以会显示




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1