0%

独立键盘与矩阵键盘

键盘分为编码键盘和非编码键盘。编码键盘上闭合键识别有专用编码器实现,并产生键编码号和键值。非编码键盘靠软件编程来识别,单片机中多为非编码键盘。

独立按键/矩阵按键

独立按键

独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。

独立按键查询时,每个端口默认输出高电平,若按键按下,该端口与GND接通,变为低电平,则我们检测哪一个端口为低电平即可确定哪一个按键被按下。

矩阵按键

若按键较多,则独立按键方式需要大量I/O口,这这是我们可以用矩阵键盘方式实现。
矩阵键盘有四条I/O口做行线,四条I/O口做列线,每个按键都在行列交点上,如下图

矩阵键盘检测时,常用行列扫描法:
首先我们向控制列线的低四位输入低电压,向控制行线的高四位输高电平。当有按键被按下,该部分电路被导通,低电平通过按键进入高四位,对应的高四位中的I/O口值不再为1。因此我们检测P1端口值,若高四位不全为1,则说明有按键被按下,通过找出哪一个值不为1,可以确定哪一行的按键被按下。接着,再反过来,向高四位输入低电平,低四位输入高电平,检测出被按下的按键在哪一列,就可以得出被按下的按键的坐标。

按键消抖

通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动.

稳点时间的长短是由操作人员决定的,正常按下一般都在100ms左右,抖动时长由机械结构决定,一般在10ms左右。为了确保按键检测准确,我们应该在按键稳定时检测,所以我们需要消抖。
通常消抖有两种方式,硬件消抖和软件消抖。
硬件消抖通过在案件两端并联电容的方式稳定电路

软件消抖有很多种方式,我这里用最简单的两次停顿来实现。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<reg52.h>#define key P1
typedef unsigned int uint;
typedef unsigned char uchar;

sbit lsa=P2^2;sbit lsb=P2^3;sbit lsc=P2^4;
uint num;
uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uint line,row;
void delay(uint i){ while(i--);}

void mtrkey(){
char a=0;
key=0xf0; //高四位为1,低四位为0
if(key!=0xf0){
delay(1000); //第一次停顿,消除前沿抖动
if(key!=0xf0){
key=0Xf0;
switch(key)
{ //找到按键的行
case(0X70): line=0;break;
case(0Xb0): line=1;break;
case(0Xd0): line=2;break;
case(0Xe0): line=3;break;
}
key=0x0f; //高四位为0,低四位为1
switch(key)
{ //找到按键的列
case(0X07): row=0;break;
case(0X0b): row=1;break;
case(0X0d): row=2;break;
case(0X0e): row=3;break;
}
while((key!=0x0f)) //第二次停顿,消除后沿抖动
{
delay(1000);
key=0x0f;
a++;
}
}
}
}
void main(){
lsa=0;lsb=0;lsc=0;
P0=smgduan[0];
while(1){
mtrkey();
num=line*4+row;
P0=smgduan[num];
}
}