键盘分为编码键盘和非编码键盘。编码键盘上闭合键识别有专用编码器实现,并产生键编码号和键值。非编码键盘靠软件编程来识别,单片机中多为非编码键盘。
独立按键/矩阵按键
独立按键
独立按键式直接用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; 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; 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]; } }
|