MCU讀取按鍵是否按下,往往需要進行消抖,而消抖措施有很多種, 可以利用電容電路,可以用數電里學的觸發器電路, 這些可以說都是在硬件層面來消抖的。但是有更簡單便宜的軟件消抖措施。
軟件消抖也分為延時重采樣和持續采樣兩種方式。
延時重采樣就是在采樣到按鍵被按下信號后,延時約10ms后,再次采樣,如果扔檢測到是按下,則就會判定為按鍵確實被按下“一次”。
持續采樣就是當采樣到按鍵被按下信號后,在一段時間內連續檢測,如果一直沒變,則判定為被按下一次。
一個4*4的矩陣鍵盤的原理就是,四行串聯在四位IO口,四列串聯在四位IO口
以上圖解釋,先將PD = 1111 1110 ,即將第一列置低,然后取PD的高四位,若檢測到高四位不是1111,比如是1101,說明第三行雖然一開始是置高的,但是被強制拉低了,所以說明S13鍵被按下了。
然后將PD循環左移,將第二列置低,以此類推。
這其中還要加上延時重采樣消抖,就可以進行矩陣鍵盤的檢測了。
舉個栗子
1 #include <reg52.h> 2 #include <intrins.h> 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 }
代碼實現功能是檢測4*4鍵盤,每個按鍵代表一個數字,顯示在屏幕上。