矩阵键盘检测之行列扫描法:
对矩阵键盘按1至16的顺序进行编号,通过下面的扫描程序得到返回数值即可确定是哪个键被按下。
矩阵键盘检测原理:
1、查询是否有键按下。
2、键的抖动处理。
3、查询按下键所在行和列位置,得到键值。
先行后列扫描法
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define temp P2 //定义按键I/O口
uchar keyscan()
{
uchar num;
temp=0xf0;
if(temp!=0xf0) //检测是否有键按下
{
delay_ms(5); //延时消抖
if(temp!=0xf0) //再次检测是否有键按下
{
temp=0xf0; //对应IO口拉高,以便检测
switch(temp) //先确定行
{
case 0x70: num=1; break; //第一行
case 0xb0: num=5; break; //第二行
case 0xd0: num=9; break; //第三行
case 0xe0: num=13; break; //第四行
}
temp=0x0f; //对应IO口拉高,以便检测
switch(temp) //再确定列
{
case 0x07: num=num+0; break; //第一列
case 0x0b: num=num+1; break; //第二列
case 0x0d: num=num+2; break; //第三列
case 0x0e: num=num+3; break; //第四列
}
}
}
return num; //结合行列扫描的值得出按键对应的数值,并返回
}
先列后行扫描法
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define temp P2
uchar keyscan()
{
uchar num;
temp=0x0f;
if(temp!=0x0f)
{
delay_ms(5);
if(temp!=0x0f)
{
temp=0x0f; //先确定列
switch(temp)
{
case 0x07: num=1; break;
case 0x0b: num=2; break;
case 0x0d: num=3; break;
case 0x0e: num=4; break;
}
temp=0xf0; //再确定行
switch(temp)
{
case 0x70: num=num+0; break;
case 0xb0: num=num+4; break;
case 0xd0: num=num+8; break;
case 0xe0: num=num+12; break;
}
}
}
return num;
}
注:这里的行列是相对的,看你自己的接线是怎样的,请自己动手体会,希望能对大家有所帮助!