單片機(jī)內(nèi)外部資源操作篇之?dāng)?shù)碼管動(dòng)態(tài)顯示
掃描二維碼
隨時(shí)隨地手機(jī)看文章
假定你已經(jīng)會(huì)了數(shù)碼管的靜態(tài)顯示,在靜態(tài)顯示的學(xué)習(xí)中,我們知道,六位數(shù)碼管同一時(shí)刻只能顯示同一符號(hào)。但我們?cè)谌粘I钪?/p>
經(jīng)常看到幾個(gè)數(shù)碼管同時(shí)能顯示不同數(shù)字,例如時(shí)鐘等。這就是接下來要討論的話題——數(shù)碼管動(dòng)態(tài)顯示。
先來看一個(gè)例子:
1 #include
2 #define uint unsigned int
3 #define uchar unsigned char
4 uchar code table[] = {
5 0x3f,0x06,0x5b,0x4f,
6 0x66,0x6d,0x7d,0x07,
7 0x7f,0x6f,0x77,0x7c,
8 0x39,0x5e,0x79,0x71};
9 sbit WELA = P2^7;
10 sbit DULA = P2^6;
11 void delay(uint);
12
13 void main()
14 {
15 while(1)
16 {
17 WELA = 1; //讓第一位數(shù)碼管顯示1
18 P0 = 0xfe;
19 WELA = 0;
20 P0 = 0xff; //消影
21 DULA = 1;
22 P0 = table[1];
23 DULA = 0;
24 delay(500);
25
26 WELA = 1; //讓第二位數(shù)碼管顯示2
27 P0 = 0xfd;
28 WELA = 0;
29 P0 = 0xff;
30 DULA = 1;
31 P0 = table[2];
32 DULA = 0;
33 delay(500);
34
35 WELA = 1; //讓第三位數(shù)碼管顯示3
36 P0 = 0xfb;
37 WELA = 0;
38 P0 = 0xff;
39 DULA = 1;
40 P0 = table[3];
41 DULA = 0;
42 delay(500);
43
44 WELA = 1; //讓第四位數(shù)碼管顯示4
45 P0 = 0xf7;
46 WELA = 0;
47 P0 = 0xff;
48 DULA = 1;
49 P0 = table[4];
50 DULA = 0;
51 delay(500);
52
53 WELA = 1; //讓第五位數(shù)碼管顯示5
54 P0 = 0xef;
55 WELA = 0;
56 P0 = 0xff;
57 DULA = 1;
58 P0 = table[5];
59 DULA = 0;
60 delay(500);
61
62 WELA = 1; //讓第六位數(shù)碼管顯示6
63 P0 = 0xdf;
64 WELA = 0;
65 P0 = 0xff;
66 DULA = 1;
67 P0 = table[6];
68 DULA = 0;
69 delay(500);
70 }
71 }
72
73 void delay(uint ms) //延時(shí)函數(shù)
74 {
75 uint i;
76 for(; ms > 0; ms --)
77 {
78 for(i = 114; i > 0; i --)
79 {
80 }
81 }
82 }
這段代碼不難理解,在while()循環(huán)中,首先讓第一個(gè)數(shù)碼管顯示1,延時(shí)500ms,然后讓第二位數(shù)碼管顯示2,延時(shí)500ms秒,....依次循環(huán)下去。
將這段代碼編譯后下載到實(shí)驗(yàn)板上觀察,看到預(yù)期的現(xiàn)象。
下面將每個(gè)數(shù)碼管點(diǎn)亮后的延時(shí)縮短為100ms,即delay(100);,編譯下載,可以看見數(shù)碼管變換顯示的速度快多了。
再縮短到10ms,編譯下載,此時(shí)已經(jīng)隱約看見6個(gè)數(shù)碼管上同時(shí)顯示著數(shù)字123456字樣,但是有些閃爍。
繼續(xù)縮短到1ms,編譯下載,這時(shí)6個(gè)數(shù)碼管上便清晰地顯示著123456字樣。
我想大家應(yīng)該理解了動(dòng)態(tài)顯示的概念和原理了,所謂的動(dòng)態(tài)顯示,就是輪流向各位數(shù)碼管送入字型碼,只是時(shí)間非??欤屓搜鄹杏X不到它是
一位一位輪流顯示的。