MCU讀取按鍵是否按下,往往需要進(jìn)行消抖,而消抖措施有很多種, 可以利用電容電路,可以用數(shù)電里學(xué)的觸發(fā)器電路, 這些可以說都是在硬件層面來消抖的。 但是有更簡單便宜的軟件消抖措施。
軟件消抖也分為延時(shí)重采樣和持續(xù)采樣兩種方式。
延時(shí)重采樣就是在采樣到按鍵被按下信號后,延時(shí)約10ms后,再次采樣,如果扔檢測到是按下,則就會判定為按鍵確實(shí)被按下“一次”。
持續(xù)采樣就是當(dāng)采樣到按鍵被按下信號后,在一段時(shí)間內(nèi)連續(xù)檢測,如果一直沒變,則判定為被按下一次。
一個(gè)4*4的矩陣鍵盤的原理就是,四行串聯(lián)在四位IO口,四列串聯(lián)在四位IO口
以上圖解釋,先將PD = 1111 1110 ,即將第一列置低,然后取PD的高四位,若檢測到高四位不是1111,比如是1101,說明第三行雖然一開始是置高的,但是被強(qiáng)制拉低了,所以說明S13鍵被按下了。
然后將PD循環(huán)左移,將第二列置低,以此類推。
這其中還要加上延時(shí)重采樣消抖,就可以進(jìn)行矩陣鍵盤的檢測了。
舉個(gè)栗子
1 #include 52.h>
2 #include
3
4 #define uint unsigned int
5 #define uchar unsigned char
6
7 uchar key = 0;
8 uchar table[]={
9 0x3f, 0x06, 0x5b, 0x4f,
10 0x66, 0x6d, 0x7d, 0x07,
11 0x7f, 0x6f, 0x77, 0x7c,
12 0x39, 0x5e, 0x79, 0x71
13 };
14
15 void init()
16 {
17 P1 = 0x00;
18 P0 = 0x00;
19 }
20
21 void delayms(uint xms)
22 {
23 uint i, j;
24 for(i = 0; i < xms; i++)
25 for(j = 0; j < 110; j++);
26 }
27
28 void keys()
29 {
30 uchar temp;
31 uint i;
32 for(i = 0; i < 4; i++){
33 P2 = _crol_(0xfe, i);
34 temp = P2;
35 temp &= 0xf0;
36 if(temp != 0xf0){
37 delayms(10);
38 temp = P2;
39 temp &= 0xf0;
40 if(temp != 0xf0){
41 switch(temp)
42 {
43 case 0xe0 : key = 0+4*i; break;
44 case 0xd0 : key = 1+4*i; break;
45 case 0xb0 : key = 2+4*i; break;
46 case 0x70 : key = 3+4*i; break;
47 }
48 while(temp != 0xf0){
49 temp = P2;
50 temp &= 0xf0;
51 }
52 }
53 }
54 }
55 }
56
57 void display(uchar key)
58 {
59 P1 = table[key];
60 }
61
62 void main()
63 {
64 init();
65 while(1){
66 keys();
67 display(key);
68 }
69 }
代碼實(shí)現(xiàn)功能是檢測4*4鍵盤,每個(gè)按鍵代表一個(gè)數(shù)字,顯示在屏幕上。
-
mcu
+關(guān)注
關(guān)注
146文章
16900瀏覽量
349950 -
信號
+關(guān)注
關(guān)注
11文章
2773瀏覽量
76543 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
1995瀏覽量
61013 -
矩陣鍵盤
+關(guān)注
關(guān)注
7文章
206瀏覽量
31412 -
電容電路
+關(guān)注
關(guān)注
1文章
11瀏覽量
3098
發(fā)布評論請先 登錄
相關(guān)推薦
評論