在我们学习单片机的过程中,矩阵按键是必不可少的模块,接下来就让小编带你走进单片机矩阵按键吧!
一、矩阵按键的扫描
矩阵按键是由十六个按键组成,我们在判断矩阵按键的位置时,我们既用到了状态机,也使用了行列扫描法。话不多说,下面先让我们看看矩阵按键的构成吧!
在状态机中,我们设置了四个状态,即未按按键状态、按键按下状态、按键弹起转态、屏蔽状态;我们使用的行列扫描法,其实就是根据行与列的位置来确定唯一的矩阵按键位置。
二、设计实现
1.定义使用的全局变量:
#define kbd_io P3
#define state_0 0 //是否按下
#define state_1 1 //是否是抖动
#define state_2 2 //判断是否弹起
#define kbd_maskrow 0x0f //屏蔽不需要的IO
unsigned int key_num=16;
2.具体的实现函数:
void scankbd()
{
static char kbd_state = 0;//用来判断处于那个状态
unsigned char kbd_press;
char row;
switch(kbd_state){
case state_0: //是否按下
kbd_io=0x0f; P42=0; P44=0;
kbd_press =kbd_io;
if(kbd_press != kbd_maskrow)
kbd_state = state_1;
//break;
case state_1: //是否是抖动 kbd_io-P3
kbd_press =kbd_io;
if(kbd_press != kbd_maskrow)
{
if((kbd_io&0x08)==0) row=0; //P30列
if((kbd_io&0x04)==0) row=1; //P31列
if((kbd_io&0x02)==0) row=2; //P32列
if((kbd_io&0x01)==0) row=3; //P33列
kbd_io=0xf0; P42=1;P44=1;
if(P44==0) key_num=row; //p44行
if(P42==0) key_num=row+4; //p42行
if((kbd_io&0x20)==0) key_num=row+8; //P35行
if((kbd_io&0x10)==0) key_num=row+12; //p34行
kbd_state = state_2;
}
else
kbd_state = state_0;
break;
case state_2: //判断是否弹起
kbd_io=0x0f; P42=0; P44=0;
kbd_press =kbd_io;
if(kbd_press == 0x0f) kbd_state = state_0;
break;
default: //屏蔽不需要的IO
break;
}
}