找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19581|回复: 6
打印 上一主题 下一主题
收起左侧

请问数码管动态显示为什么必须要延迟呢?

[复制链接]
跳转到指定楼层
楼主
ID:1805 发表于 2012-6-9 01:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 以下是个简单的数码管动态显示的C语言程序,
假如我们把延时的delay(2);这个去掉,结果虽然从逻辑上讲是没问题的,但是下载到板上后,看到显示比较模糊,一些不该亮的地方也有点亮。
这是为什么呢?


1 #include <reg52.h>
2 sbit DUAN = P2^6;
3 sbit WEI = P2^7;
4
5 void delay(unsigned int z) //1ms延时
6 {
7     unsigned int x,y;
8     for(x=z;x>0;x--)
9         for(y=110;y>0;y--);
10 }
11
12 void main()
13     {
14     unsigned char code show[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
15     unsigned int i,which;
16     while(1)
17         {
18         which = 1;
19         for(i=0; i<8; i++)
20             {
21             DUAN = 1;
22             P0 = show;
23             DUAN = 0;
24             P0 = 0XFF;
25             WEI = 1;
26             P0 = 255-which;
27             WEI = 0;
28             which *= 2;
29             //delay(2);
30             }
31         }
32
33     }
34
35


delay函数还是有点浪费资源,改为定时器来完成延时,
以下是刚调试好的60秒倒计时。就是在调试这个程序时遇到了前面提到的数码管模糊现象。



1 #include <reg52.h>
2
3 #define uchar unsigned char
4 #define uint unsigned int
5 #define LED_LOCK openLed = 1
6 #define MATRIX_LOCK P2 = 0x35
7 #define N 2
8 //N是显示位数。
9 #define START 59
10 #define TIMER_NUM 1000
11
12 uchar tmp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管0~9编码
13
14 uint timer1 = 0; timer2 = 0;
15
16 sbit led1 = P0^0;
17 sbit openLed = P1^4;
18 sbit Duan = P2^6;
19 sbit Wei = P2^7;
20
21
22 void main()
23     {    
24     uint whichOne = 0;
25     uchar select[]={0xff - 1, 0xff - 2, 0xff - 4, 0xff - 8, 0xff-16, 0xff-32, 0xff-64, 0xff-128},
26         show[2],
27         num = START;
28     //select:位选编码
29     LED_LOCK;
30     MATRIX_LOCK;
31
32     TMOD = 0x01;
33     TH0 = (65536 - TIMER_NUM) >> 8;
34     TL0 = (65536 - TIMER_NUM) % 256;
35     EA = 1;
36     ET0 = 1;
37     TR0 = 1;
38
39     while(1)
40         {
41         if(timer1 >= 1000)
42             {
43             if(num == 0)
44                 num = START + 1;
45             num--;
46             timer1 = 0;
47             }
48             
49         if(timer2 >= 10)
50             {
51             whichOne++;
52             whichOne %= N;
53             show[0] = num / 10;
54             show[1] = num % 10;
55             Duan = 1;
56             P0 = tmp[show[whichOne]];
57             Duan = 0;
58             P0 = 0xff;
59             Wei = 1;
60             P0 = select[whichOne];
61             Wei = 0;
62             timer2 = 0;
63             }
64         }
65         
66     }
67
68 void Timer0() interrupt 1
69     {
70     TH0 = (65536 - TIMER_NUM) >> 8;
71     TL0 = (65536 - TIMER_NUM) % 256;
72     timer1 ++;
73     timer2 ++;
74     }
[此贴子已经被作者于2012-6-9 12:19:33编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2012-6-9 01:58 | 只看该作者
delay(2); 的作用就是让他显示一段时间啊
回复

使用道具 举报

板凳
ID:27916 发表于 2012-6-9 06:40 | 只看该作者
不延时的话,一闪而过,你看得清楚呀
回复

使用道具 举报

地板
ID:1805 发表于 2012-6-9 12:25 | 只看该作者
 谢谢,以后记住这个例行步骤;)
回复

使用道具 举报

5#
ID:1805 发表于 2012-6-9 12:30 | 只看该作者
从实验的结果看,该显的段显示比较亮,奇怪的就是为什么不该显示的段也会微微发亮。加延时后不该亮的段一点都不亮的。
回复

使用道具 举报

6#
ID:1 发表于 2012-6-9 19:51 | 只看该作者

这个问题 就要考虑到消隐了,只所以出现那个微亮的,可见 消隐没有做好 具体你可参考 http://www.51hei.com/bbs/dpj-10971-1.html

 

按上面的操作一下 应该微亮问题可以解决,,

delay(2); 这段显示的延时理论上  延时越长显示的亮度就越大

回复

使用道具 举报

7#
ID:1805 发表于 2012-6-9 22:18 | 只看该作者
 谢谢您的耐心解答,我程序中在WEI = 1 之前的 P0 = 0xff,也可以消影,当然链接中程序的方法还可以节省一行,更好些。
如果把该程序的delay语句去掉,显示的结果还是有点怪。
也不去深究了,继续往下学习。谢谢;)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表