单片机-4x4个矩阵按键控制数码管显示数字程序
1 #include ""
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 void KeyTest();
18 void smg(u8 n, u8 m);
19 void key_4x4();
20
21 void main()
22 {
23 while(1)
24 {
25 key_4x4();
26 }
27 }
28
29 // 不精确的延时函数
30 void Delayms(u16 ms)
31 {
32 unsigned int i, j;
33 for(i = ms; i > 0; i--)
34 for(j = 110; j > 0; j--);
35 return;
36 }
37
38 // 数码管根据74HC138译码器选择对应的段(选择哪个数码管显示)
39 void shumaguan(u8 n)
40 {
41 switch(n)
42 {
43 case 0:
44 LSA = 0;LSB = 0;LSC = 0;break;
45 case 1:
46 LSA = 1;LSB = 0;LSC = 0;break;
47 case 2:
48 LSA = 0;LSB = 1;LSC = 0;break;
49 case 3:
50 LSA = 1;LSB = 1;LSC = 0;break;
51 case 4:
52 LSA = 0;LSB = 0;LSC = 1;break;
53 case 5:
54 LSA = 1;LSB = 0;LSC = 1;break;
55 case 6:
56 LSA = 0;LSB = 1;LSC = 1;break;
57 case 7:
58 LSA = 1;LSB = 1;LSC = 1;break;
59 }
60 }
61
62 // 数码管显示数字,并以十进制递增
63 void DigDisplay()
64 {
65 u8 i1 = 0;
66 u8 i2 = 0;
67 u8 i3 = 0;
68 u8 i4 = 0;
69 u8 i5 = 0;
70 u8 i6 = 0;
71 u8 i7 = 0;
72 u8 i8 = 0;
73
74
75
76
77 for (i8 = 0; i8 < 10; i8++)
78 for (i7 = 0; i7 < 10; i7++)
79 for (i6 = 0; i6 < 10; i7++)
80 for (i5 = 0; i5 < 10; i5++)
81 for (i4 = 0; i4 < 10; i4++)
82 for (i3 = 0; i3 < 10; i3++)
83 for (i2 = 0; i2 < 10; i2++)
84 for (i1 = 0; i1 < 10; i1++)
85 {
86 u16 cnt = 10;
87 while (cnt--)
88 {
89 shumaguan(0); //选中第一个数码管
90 P0 = smgduan[i1]; //给他送一个数字
91 Delayms(1); //稍微延时一下下
92 shumaguan(1); //然后切换到第二个数码管。。。如此进行一直到最后一个数码管。。。最后再改变送入数码管的数值。。。再来一遍
93 P0 = smgduan[i2];
94 Delayms(1);
95 shumaguan(2);
96 P0 = smgduan[i3];
97 Delayms(1);
98 shumaguan(3);
99 P0 = smgduan[i4];
100 Delayms(1);
101 shumaguan(4);
102 P0 = smgduan[i5];
103 Delayms(1);
104 shumaguan(5);
105 P0 = smgduan[i6];
106 Delayms(1);
107 shumaguan(6);
108 P0 = smgduan[i7];
109 Delayms(1);
110 shumaguan(7);
111 P0 = smgduan[i8];
112 Delayms(1);
113 P0 = 0x00;
114 }
115 }
116 }
117
118 // 测试独立按键功能
119 void KeyTest()
120 {
121 while (1)
122 {
123 /*
124 * 不推荐此做法
125 * 此做法占用内存高
126 */
127 if (!K1)
128 {
129 // 软件延时消除抖动
130 Delayms(10);
131 if (!K1)
132 {
133 LED_1 = !LED_1;
134 }
135 // 确认按键已经按下
136 while(!K1);
137 }
138 if (!K2)
139 {
140 // 软件延时消除抖动
141 Delayms(10);
142 if (!K2)
143 {
144 LED_2 = !LED_2;
145 }
146 while(!K2);
147 }
148 if (!K3)
149 {
150 // 软件延时消除抖动
151 Delayms(10);
152 if (!K3)
153 {
154 LED_3 = !LED_3;
155 }
156 while(!K3);
157 }
158 if (!K4)
159 {
160 // 软件延时消除抖动
161 Delayms(10);
162 if (!K4)
163 {
164 LED_4 = !LED_4;
165 }
166 while(!K4);
167 }
168 }
169 }
170
171 // 给指定的数码管送入指定的数字
172 void smg(u8 n, u8 m)
173 {
174 if (1==n)
175 {
176 P0 = 0x00;
177 shumaguan(0); //选中第一个数码管
178 P0 = smgduan[m]; //给他送一个数字
179 Delayms(10);
180 }
181 if (2==n)
182 {
183 P0 = 0x00;
184 shumaguan(1); //选中第一个数码管
185 P0 = smgduan[m]; //给他送一个数字
186 Delayms(10);
187 }
188 if (3==n)
189 {
190 P0 = 0x00;
191 shumaguan(2); //选中第一个数码管
192 P0 = smgduan[m]; //给他送一个数字
193 Delayms(10);
194 }
195 if (4==n)
196 {
197 P0 = 0x00;
198 shumaguan(3); //选中第一个数码管
199 P0 = smgduan[m]; //给他送一个数字
200 Delayms(10);
201 }
202 if (5==n)
203 {
204 P0 = 0x00;
205 shumaguan(4); //选中第一个数码管
206 P0 = smgduan[m]; //给他送一个数字
207 Delayms(10);
208 }
209 if (6==n)
210 {
211 P0 = 0x00;
212 shumaguan(5); //选中第一个数码管
213 P0 = smgduan[m]; //给他送一个数字
214 Delayms(10);
215 }
216 if (7==n)
217 {
218 P0 = 0x00;
219 shumaguan(6); //选中第一个数码管
220 P0 = smgduan[m]; //给他送一个数字
221 Delayms(10);
222 }
223 if (8==n)
224 {
225 P0 = 0x00;
226 shumaguan(7); //选中第一个数码管
227 P0 = smgduan[m]; //给他送一个数字
228 Delayms(10);
229 }
230 }
231
232 // 可以定义按键按下的事件
233 void key_4x4()
234 {
235 // 每次选中其中一根地线的时候要消除其他地线的状态,不然会混乱
236 // 此处选定最上一列为低电平(使能)
237 P1_7 = 0;
238 P1_6 = 1;
239 P1_5 = 1;
240 P1_4 = 1;
241 if (!P1_3)
242 {
243 // 软件延时消除抖动
244 Delayms(10);
245 if (!P1_3)
246 {
247 smg(1,1);
248 }
249 // 确认按键已经按下
250 while(!P1_3);
251 }
252 if (!P1_2)
253 {
254 // 软件延时消除抖动
255 Delayms(10);
256 if (!P1_2)
257 {
258 smg(1,2);
259 }
260 // 确认按键已经按下
261 while(!P1_2);
262 }
263 if (!P1_1)
264 {
265 // 软件延时消除抖动
266 Delayms(10);
267 if (!P1_1)
268 {
269 smg(1,3);
270 }
271 // 确认按键已经按下
272 while(!P1_1);
273 }
274 if (!P1_0)
275 {
276 // 软件延时消除抖动
277 Delayms(10);
278 if (!P1_0)
279 {
280 ;
281 }
282 // 确认按键已经按下
283 while(!P1_0);
284 }
285
286 P1_7 = 1;
287 P1_6 = 0;
288 P1_5 = 1;
289 P1_4 = 1;
290 if (!P1_3)
291 {
292 // 软件延时消除抖动
293 Delayms(10);
294 if (!P1_3)
295 {
296 smg(1,4);
297 }
298 // 确认按键已经按下
299 while(!P1_3);
300 }
301 if (!P1_2)
302 {
303 // 软件延时消除抖动
304 Delayms(10);
305 if (!P1_2)
306 {
307 smg(1,5);
308 }
309 // 确认按键已经按下
310 while(!P1_2);
311 }
312 if (!P1_1)
313 {
314 // 软件延时消除抖动
315 Delayms(10);
316 if (!P1_1)
317 {
318 smg(1,6);
319 }
320 // 确认按键已经按下
321 while(!P1_1);
322 }
323 if (!P1_0)
324 {
325 // 软件延时消除抖动
326 Delayms(10);
327 if (!P1_0)
328 {
329 ;
330 }
331 // 确认按键已经按下
332 while(!P1_0);
333 }
334 P1_7 = 1;
335 P1_6 = 1;
336 P1_5 = 0;
337 P1_4 = 1;
338 if (!P1_3)
339 {
340 // 软件延时消除抖动
341 Delayms(10);
342 if (!P1_3)
343 {
344 smg(1,7);
345 }
346 // 确认按键已经按下
347 while(!P1_3);
348 }
349 if (!P1_2)
350 {
351 // 软件延时消除抖动
352 Delayms(10);
353 if (!P1_2)
354 {
355 smg(1,8);
356 }
357 // 确认按键已经按下
358 while(!P1_2);
359 }
360 if (!P1_1)
361 {
362 // 软件延时消除抖动
363 Delayms(10);
364 if (!P1_1)
365 {
366 smg(1,9);
367 }
368 // 确认按键已经按下
369 while(!P1_1);
370 }
371 if (!P1_0)
372 {
373 // 软件延时消除抖动
374 Delayms(10);
375 if (!P1_0)
376 {
377 ;
378 }
379 // 确认按键已经按下
380 while(!P1_0);
381 }
382 P1_7 = 1;
383 P1_6 = 1;
384 P1_5 = 1;
385 P1_4 = 0;
386 if (!P1_3)
387 {
388 // 软件延时消除抖动
389 Delayms(10);
390 if (!P1_3)
391 {
392 smg(1,1);
393 }
394 // 确认按键已经按下
395 while(!P1_3);
396 }
397 if (!P1_2)
398 {
399 // 软件延时消除抖动
400 Delayms(10);
401 if (!P1_2)
402 {
403 smg(1,2);
404 }
405 // 确认按键已经按下
406 while(!P1_2);
407 }
408 if (!P1_1)
409 {
410 // 软件延时消除抖动
411 Delayms(10);
412 if (!P1_1)
413 {
414 smg(1,3);
415 }
416 // 确认按键已经按下
417 while(!P1_1);
418 }
419 if (!P1_0)
420 {
421 // 软件延时消除抖动
422 Delayms(10);
423 if (!P1_0)
424 {
425 ;
426 }
427 // 确认按键已经按下
428 while(!P1_0);
429 }
430 }