基础的LED灯和数码管同时点亮的问题

2019-03-24 19:17发布

如题,我在练习的时候遇到了一个可能比较基本的问题:不通过定时器,只写一个delay函数来实现LED灯的闪烁和数码管的点亮。 我自己用这种方式写的(8个LED闪烁,点亮2个数码管),无法实现上述功能。LED能闪烁,但是两位数码管中的第一位不能稳定显示,第一位数码管是在闪烁,和LED灯的闪烁频率差不多一致。如果只点亮一个数码管,在下面的程序中删掉一个点亮数码管的程序后,剩下的1个数码管能够正常点亮(不闪烁),如果增加点亮数码管的数量至6个,前5个数码管是闪烁着显示的,频率与LED灯差不多,最后一个数码管正常显示。 我想问问产生这种现象的原因是什么,还有如何只用一个delay函数,不用定时器,来完成这样的功能。    #include<reg52.h> sbit dula=P2^6; sbit wela=P2^7;   void delay(unsigned int z) //延时程序 { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }    void main() { P1=0x00; while(1)  { dula=1; P0=0x3f; dula=0; P0=0xff;       //点亮第一个数码管,显示0 wela=1; P0=0xfe;  wela=0; delay(1);   dula=1; P0=0x3f;  dula=0; P0=0xff; wela=1;             //点亮第二个数码管,显示0 P0=0xfd; wela=0; delay(1);   delay(100);       //LED灯闪烁 P1=~P1;  }  } 用的是共阴极数码管,郭天祥教程的板子。我自己分析了这个程序,按理说应该两个数码管都是闪烁的状态,但是板子上的结果是第一个闪烁,第二个稳定显示..... [ 本帖最后由 qrswll 于 2012-4-8 16:40 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
jishuaihu
1楼-- · 2019-03-25 00:08
用delay肯定不合适,因为你把时间都浪费到了delay里面,数码管显示当然就不能稳定了,闪烁和稳定是个矛盾,要CPU同时完成用delay不好吧。当然这样的要求是可以满足的,那就是你一直跑着显示的函数,然后用一个计数标志计数,每显示多少遍之后把LED取反就可以了!
Li_Lei
2楼-- · 2019-03-25 00:51
楼上说的极是,资源全部浪费了。另外你一旦使用中断delay的时间就不好控制了。
qrswll
3楼-- · 2019-03-25 03:59

原帖由 jishuaihu 于 2012-4-8 19:41 发表 用delay肯定不合适,因为你把时间都浪费到了delay里面,数码管显示当然就不能稳定了,闪烁和稳定是个矛盾,要CPU同时完成用delay不好吧。当然这样的要求是可以满足的,那就是你一直跑着显示的函数,然后用一个计数标 ...
斑竹前辈大好人=。=给我提示了一个很好的思路,明天我就去试验一下。

还有,我的一个疑问是,在我的问题中,为什么数码管总有一位是稳定的呢?我理解自己的程序,好像delay(100)干扰到每个数码管的显示了,但是总会有一位显示是稳定的(比如像点亮4个数码管,这样的程序前3个数码管是闪烁的,但是最后一个数码管是稳定显示的)。

beck_ck
4楼-- · 2019-03-25 05:30
 精彩回答 2  元偷偷看……
yongpeiyuan
5楼-- · 2019-03-25 05:43
延时的问题吧!
xhb_123
6楼-- · 2019-03-25 10:21
去掉delay(100),改为循环50次P1取反,应该就能实现你想要的结果

一周热门 更多>