找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20590|回復(fù): 6
收起左側(cè)

請問數(shù)碼管動(dòng)態(tài)顯示為什么必須要延遲呢?

[復(fù)制鏈接]
ID:1805 發(fā)表于 2012-6-9 01:11 | 顯示全部樓層 |閱讀模式
 以下是個(gè)簡單的數(shù)碼管動(dòng)態(tài)顯示的C語言程序,
假如我們把延時(shí)的delay(2);這個(gè)去掉,結(jié)果雖然從邏輯上講是沒問題的,但是下載到板上后,看到顯示比較模糊,一些不該亮的地方也有點(diǎn)亮。
這是為什么呢?


1 #include <reg52.h>
2 sbit DUAN = P2^6;
3 sbit WEI = P2^7;
4
5 void delay(unsigned int z) //1ms延時(shí)
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函數(shù)還是有點(diǎn)浪費(fèi)資源,改為定時(shí)器來完成延時(shí),
以下是剛調(diào)試好的60秒倒計(jì)時(shí)。就是在調(diào)試這個(gè)程序時(shí)遇到了前面提到的數(shù)碼管模糊現(xiàn)象。



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是顯示位數(shù)。
9 #define START 59
10 #define TIMER_NUM 1000
11
12 uchar tmp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管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     }
[此貼子已經(jīng)被作者于2012-6-9 12:19:33編輯過]
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2012-6-9 01:58 | 顯示全部樓層
delay(2); 的作用就是讓他顯示一段時(shí)間啊
回復(fù)

使用道具 舉報(bào)

ID:27916 發(fā)表于 2012-6-9 06:40 | 顯示全部樓層
不延時(shí)的話,一閃而過,你看得清楚呀
回復(fù)

使用道具 舉報(bào)

ID:1805 發(fā)表于 2012-6-9 12:25 | 顯示全部樓層
 謝謝,以后記住這個(gè)例行步驟;)
回復(fù)

使用道具 舉報(bào)

ID:1805 發(fā)表于 2012-6-9 12:30 | 顯示全部樓層
從實(shí)驗(yàn)的結(jié)果看,該顯的段顯示比較亮,奇怪的就是為什么不該顯示的段也會(huì)微微發(fā)亮。加延時(shí)后不該亮的段一點(diǎn)都不亮的。
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2012-6-9 19:51 | 顯示全部樓層

這個(gè)問題 就要考慮到消隱了,只所以出現(xiàn)那個(gè)微亮的,可見 消隱沒有做好 具體你可參考 http://www.torrancerestoration.com/bbs/dpj-10971-1.html

 

按上面的操作一下 應(yīng)該微亮問題可以解決,,

delay(2); 這段顯示的延時(shí)理論上  延時(shí)越長顯示的亮度就越大

回復(fù)

使用道具 舉報(bào)

ID:1805 發(fā)表于 2012-6-9 22:18 | 顯示全部樓層
 謝謝您的耐心解答,我程序中在WEI = 1 之前的 P0 = 0xff,也可以消影,當(dāng)然鏈接中程序的方法還可以節(jié)省一行,更好些。
如果把該程序的delay語句去掉,顯示的結(jié)果還是有點(diǎn)怪。
也不去深究了,繼續(xù)往下學(xué)習(xí)。謝謝;)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表