1 #include "8051.h"
2 typedef unsigned char u8;
3 typedef unsigned int u16;
4 u8 smgduan[]= {
5 /*0 1 2 3 4 5 6 7 */
6 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
7 /*8 9 A B C D E F */
8 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
9
10 // P0口为数码管的位选的8位输入引脚
11 // P0 = 0x00;
12
13
14 void Delayms(u16 ms);
15 void shumaguan(u8 n);
16 void DigDisplay();
17
18 void main()
19 {
20 while (1)
21 {
22 /*
23 * 不推荐此做法
24 * 此做法占用内存高
25 */
26 if (!K1)
27 {
28 // 软件延时消除抖动
29 Delayms(10);
30 if (!K1)
31 {
32 LED_1 = !LED_1;
33 }
34 // 确认按键已经按下
35 while(!K1);
36 }
37 if (!K2)
38 {
39 // 软件延时消除抖动
40 Delayms(10);
41 if (!K2)
42 {
43 LED_2 = !LED_2;
44 }
45 while(!K2);
46 }
47 if (!K3)
48 {
49 // 软件延时消除抖动
50 Delayms(10);
51 if (!K3)
52 {
53 LED_3 = !LED_3;
54 }
55 while(!K3);
56 }
57 if (!K4)
58 {
59 // 软件延时消除抖动
60 Delayms(10);
61 if (!K4)
62 {
63 LED_4 = !LED_4;
64 }
65 while(!K4);
66 }
67 }
68 }
69
70
71 void Delayms(u16 ms)
72 {
73 unsigned int i, j;
74 for(i = ms; i > 0; i--)
75 for(j = 110; j > 0; j--);
76 return;
77 }
78
79 void shumaguan(u8 n)
80 {
81 switch(n)
82 {
83 case 0:
84 LSA = 0;LSB = 0;LSC = 0;break;
85 case 1:
86 LSA = 1;LSB = 0;LSC = 0;break;
87 case 2:
88 LSA = 0;LSB = 1;LSC = 0;break;
89 case 3:
90 LSA = 1;LSB = 1;LSC = 0;break;
91 case 4:
92 LSA = 0;LSB = 0;LSC = 1;break;
93 case 5:
94 LSA = 1;LSB = 0;LSC = 1;break;
95 case 6:
96 LSA = 0;LSB = 1;LSC = 1;break;
97 case 7:
98 LSA = 1;LSB = 1;LSC = 1;break;
99 }
100 }
101
102 void DigDisplay()
103 {
104 u8 i1 = 0;
105 u8 i2 = 0;
106 u8 i3 = 0;
107 u8 i4 = 0;
108 u8 i5 = 0;
109 u8 i6 = 0;
110 u8 i7 = 0;
111 u8 i8 = 0;
112
113
114
115
116 for (i8 = 0; i8 < 10; i8++)
117 for (i7 = 0; i7 < 10; i7++)
118 for (i6 = 0; i6 < 10; i7++)
119 for (i5 = 0; i5 < 10; i5++)
120 for (i4 = 0; i4 < 10; i4++)
121 for (i3 = 0; i3 < 10; i3++)
122 for (i2 = 0; i2 < 10; i2++)
123 for (i1 = 0; i1 < 10; i1++)
124 {
125 u16 cnt = 10;
126 while (cnt--)
127 {
128 shumaguan(0); //选中第一个数码管
129 P0 = smgduan[i1]; //给他送一个数字
130 Delayms(1); //稍微延时一下下
131 shumaguan(1); //然后切换到第二个数码管。。。如此进行一直到最后一个数码管。。。最后再改变送入数码管的数值。。。再来一遍
132 P0 = smgduan[i2];
133 Delayms(1);
134 shumaguan(2);
135 P0 = smgduan[i3];
136 Delayms(1);
137 shumaguan(3);
138 P0 = smgduan[i4];
139 Delayms(1);
140 shumaguan(4);
141 P0 = smgduan[i5];
142 Delayms(1);
143 shumaguan(5);
144 P0 = smgduan[i6];
145 Delayms(1);
146 shumaguan(6);