一、基础知识
如图所示,当最下角跳帽的1、2连接时,对应的是矩阵键盘。
“高低行列”
对高4位赋值0,检测低4位哪一位是0,确定按键所在行;
对低4位赋值0,检测高4位哪一位是0,确定按键所在列;
根据所得行和列,确定按键所在位置。
二、获取键值编程方法
先列扫描,再行扫描
(本程序只实现获取键值,并未实现消抖、单次触发【实现长按功能】)
unsigned char vKBD_keyIO()
{
unsigned char key_name = 0;
//列扫描,高低行列
P3 = 0xf0 ,P4 = 0xff;
if(P44 = 0) key_name =4;
if(P42 = 0) key_name =8;
if(P35 = 0) key_name =12;
if(P34 = 0) key_name =16;
//再行扫描
P3 = 0x0f ,P4 = 0x00;
if(P30 = 0) key_name = key_name + 3;
if(P31 = 0) key_name = key_name + 2;
if(P32 = 0) key_name = key_name + 1;
if(P33 = 0) key_name = key_name + 0;
return key_name;
}
三、状态机法
#define key_no 0 //无按键按下状态,用于判断是否按下
#define key_up 1 //有按键按下状态,用于判断是否是抖动
#define key_down 0 //按键松开状态,用于判断是否松手
unsigned char vKBD_ReadState()
{
unsigned char key_state = 0;
unsigned char key_io = 0 ,key_return = 0;
key_io = vKBD_keyIO();
switch(key_return)
{
case key_no:
if(key_io) key_state = key_up;
break;
case key_up:
if(key_io)
{
key_state = key_down;
key_return = key_io;
}
else
key_state = key_no;
break;
case key_down:
if(key_io = 0) key_state = key_no;
break;
return key_return;
}
}
四、三行按键法
1.需要按“位”操作;
2.三行按键法获取键值:按键对应位为0
例如:S7按下,则P30、P44为0,所以P44 P42 P35 P34,P33 P32 P31 P30
= 0 1 1 1 ,1 1 1 0
3.三行按键键值判断:(高电平为按键按下)
if(Trg==0x81) //s7
{
}
if(Trg==0x88) //s4
{
}
unsigned char Trg; //全局变量
unsigned char Cont; //全局变量
void vBTN_Read_ThreeLine(void)
{
unsigned char ReadData = P3^0xff; //取反
Trg = ReadData & (ReadData^Cont); //&操作是为了清零,后面的异或操作是为了单次触发。
Cont = ReadData; //按键一直按下的电平状态
}