单片机内外部资源操作篇之数码管动态显示
扫描二维码
随时随地手机看文章
假定你已经会了数码管的静态显示,在静态显示的学习中,我们知道,六位数码管同一时刻只能显示同一符号。但我们在日常生活中
经常看到几个数码管同时能显示不同数字,例如时钟等。这就是接下来要讨论的话题——数码管动态显示。
先来看一个例子:
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; //让第一位数码管显示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; //让第二位数码管显示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; //让第三位数码管显示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; //让第四位数码管显示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; //让第五位数码管显示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; //让第六位数码管显示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) //延时函数
74 {
75 uint i;
76 for(; ms > 0; ms --)
77 {
78 for(i = 114; i > 0; i --)
79 {
80 }
81 }
82 }
这段代码不难理解,在while()循环中,首先让第一个数码管显示1,延时500ms,然后让第二位数码管显示2,延时500ms秒,....依次循环下去。
将这段代码编译后下载到实验板上观察,看到预期的现象。
下面将每个数码管点亮后的延时缩短为100ms,即delay(100);,编译下载,可以看见数码管变换显示的速度快多了。
再缩短到10ms,编译下载,此时已经隐约看见6个数码管上同时显示着数字123456字样,但是有些闪烁。
继续缩短到1ms,编译下载,这时6个数码管上便清晰地显示着123456字样。
我想大家应该理解了动态显示的概念和原理了,所谓的动态显示,就是轮流向各位数码管送入字型码,只是时间非常快,让人眼感觉不到它是
一位一位轮流显示的。