标题: 请问数码管动态显示为什么必须要延迟呢? [打印本页]
作者: cir_biochem 时间: 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编辑过]
作者: admin 时间: 2012-6-9 01:58
delay(2); 的作用就是让他显示一段时间啊
作者: 青苹果 时间: 2012-6-9 06:40
不延时的话,一闪而过,你看得清楚呀
作者: cir_biochem 时间: 2012-6-9 12:25
谢谢,以后记住这个例行步骤;)
作者: cir_biochem 时间: 2012-6-9 12:30
从实验的结果看,该显的段显示比较亮,奇怪的就是为什么不该显示的段也会微微发亮。加延时后不该亮的段一点都不亮的。
作者: admin 时间: 2012-6-9 19:51
这个问题 就要考虑到消隐了,只所以出现那个微亮的,可见 消隐没有做好 具体你可参考 http://www.51hei.com/bbs/dpj-10971-1.html
按上面的操作一下 应该微亮问题可以解决,,
delay(2); 这段显示的延时理论上 延时越长显示的亮度就越大
作者: cir_biochem 时间: 2012-6-9 22:18
谢谢您的耐心解答,我程序中在WEI = 1 之前的 P0 = 0xff,也可以消影,当然链接中程序的方法还可以节省一行,更好些。
如果把该程序的delay语句去掉,显示的结果还是有点怪。
也不去深究了,继续往下学习。谢谢;)
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |