矩陣鍵盤編程原理


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鍵盤,每個按鍵代表一個數字,顯示在屏幕上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM