矩阵键盘编程原理
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键盘,每个按键代表一个数字,显示在屏幕上。