一.简介
4x4矩阵按键是单片机外部设备中所使用的排布类似于矩阵的按键组。显然矩阵按键的使用要比独立按键要复杂一些,编程也要复杂一些,但可以单片机IO资源。4x4矩阵按键即分为4组列线,4组行线,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
二.硬件连接图
51单片机的P1口用作按键I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位;把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。如图:
三.控制程序
1.矩阵按键程序扫描步骤
- 检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。
- 去除按键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。
- 若有键被按下,应识别出是哪一个键闭合。方法是先获取矩阵按键的列状态,即P1的低四位状态,对应为0111,1011,1101,1110;再获取行状态,即P1的高四位状态。
- 最后,将由此得到闭合键的行值和列值组成8位数,可通过对应的编码表将闭合键的行值和列值转换成所定义的键值。
2.扫描程序
void key() //按键程序
{
static uchar key_new = 0, key_l;
key_can = 20; //按键值还原
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
key_l = (P1 | 0xf0); //矩阵键盘的列状态
P1 = key_l; //扫描矩阵键盘的行状态
switch(P1)
{
case 0xee: key_can = 1; break; //得到按键值
case 0xde: key_can = 4; break; //得到按键值
case 0xbe: key_can = 7; break; //得到按键值
case 0x7e: key_can = 10; break; //得到按键值
case 0xed: key_can = 2; break; //得到按键值
case 0xdd: key_can = 5; break; //得到按键值
case 0xbd: key_can = 8; break; //得到按键值
case 0x7d: key_can = 0; break; //得到按键值
case 0xeb: key_can = 3; break; //得到按键值
case 0xdb: key_can = 6; break; //得到按键值
case 0xbb: key_can = 9; break; //得到按键值
case 0x7b: key_can = 11; break; //得到按键值
case 0xe7: key_can = 15; break; //得到按键值
case 0xd7: key_can = 14; break; //得到按键值
case 0xb7: key_can = 13; break; //得到按键值
case 0x77: key_can = 12; break; //得到按键值
}
}
}
else
{
key_new = 1;
}
}
一.简介
4x4矩阵按键是单片机外部设备中所使用的排布类似于矩阵的按键组。显然矩阵按键的使用要比独立按键要复杂一些,编程也要复杂一些,但可以单片机IO资源。4x4矩阵按键即分为4组列线,4组行线,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
二.硬件连接图
51单片机的P1口用作按键I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位;把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。如图:
三.控制程序
1.矩阵按键程序扫描步骤
- 检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。
- 去除按键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。
- 若有键被按下,应识别出是哪一个键闭合。方法是先获取矩阵按键的列状态,即P1的低四位状态,对应为0111,1011,1101,1110;再获取行状态,即P1的高四位状态。
- 最后,将由此得到闭合键的行值和列值组成8位数,可通过对应的编码表将闭合键的行值和列值转换成所定义的键值。
2.扫描程序
void key() //按键程序
{
static uchar key_new = 0, key_l;
key_can = 20; //按键值还原
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
key_l = (P1 | 0xf0); //矩阵键盘的列状态
P1 = key_l; //扫描矩阵键盘的行状态
switch(P1)
{
case 0xee: key_can = 1; break; //得到按键值
case 0xde: key_can = 4; break; //得到按键值
case 0xbe: key_can = 7; break; //得到按键值
case 0x7e: key_can = 10; break; //得到按键值
case 0xed: key_can = 2; break; //得到按键值
case 0xdd: key_can = 5; break; //得到按键值
case 0xbd: key_can = 8; break; //得到按键值
case 0x7d: key_can = 0; break; //得到按键值
case 0xeb: key_can = 3; break; //得到按键值
case 0xdb: key_can = 6; break; //得到按键值
case 0xbb: key_can = 9; break; //得到按键值
case 0x7b: key_can = 11; break; //得到按键值
case 0xe7: key_can = 15; break; //得到按键值
case 0xd7: key_can = 14; break; //得到按键值
case 0xb7: key_can = 13; break; //得到按键值
case 0x77: key_can = 12; break; //得到按键值
}
}
}
else
{
key_new = 1;
}
}
举报