最近钻研了一下矩阵键盘,花了很久时间才搞明白是怎么回事,都怪自己太笨
那现在我们就来说说矩阵键盘的检测原理
1.4X4矩阵键盘图如下:
2.我采取的是逐行扫描法,依次给每行赋0,然后观察当有按键按下时哪一列的值为0,从而可以确定具体的按键
/* 函数名称:juzhenjianpan.c
函数实现功能:把键盘值显示到数码管上
说明:4X4矩阵键盘
作者;MARKPAIN
日期:2015.4.11
*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_num; //定义获取的键盘值
uint shi,ge;
uchar code table[]={ //共阴极数码管段选编码
0x3f,0x06,0x5b,0x4f,0x66, /*0,1,2,3,4*/
0x6d,0x7d,0x07,0x7f,0x6f /*5,6,7,8,9*/
};
/**********延时函数**********/
void delayms(uint z) //延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/**********显示函数**********/
void display(uchar num)
{
/*考虑到键盘值的范围为0——16*/
shi=num/10;
ge=num%10;
P2=0xff;
P0=table[shi];
P2=0xfd; //倒数第二位亮
delayms(1);
P2=0xff; //消影不可少
P0=table[ge];
P2=0xfe; //最低位亮
delayms(1);
}
/***********键盘扫描函数*********/
uchar keyscan(void)
{
uchar n,result=0; //扫描第一行
P1=0xfe; n=P1; n&=0xf0;
if(n!=0xf0)
{
delayms(10);
P1=0xfe; n=P1; n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):result=1;break;
case(0xd0):result=2;break;
case(0xb0):result=3;break;
case(0x70):result=4;break;
}
}
}
//扫描第二行
P1=0xfd; n=P1;n&=0xf0;
if(n!=0xf0)
{
delayms(10);
P1=0xfd; n=P1; n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):result=5;break;
case(0xd0):result=6;break;
case(0xb0):result=7;break;
case(0x70):result=8;break;
}
}
} //扫描第三行
P1=0xfb; n=P1; n&=0xf0;
if(n!=0xf0)
{
delayms(10);
P1=0xfb; n=P1;n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):result=9;break;
case(0xd0):result=10;break;
case(0xb0):result=11;break;
case(0x70):result=12;break;
}
}
}
//扫描第四行
P1=0xf7; n=P1; n&=0xf0;
if(n!=0xf0)
{
delayms(10);
P1=0xf7; n=P1; n&=0xf0;
if(n!=0xf0)
{
switch(n)
{
case(0xe0):result=13;break;
case(0xd0):result=14;break;
case(0xb0):result=15;break;
case(0x70):result=16;break;
}
}
}
return result;
}
/**********主函数**************/
void main()
{
while(1)
{
key_num=keyscan(); //键盘扫描
display(key_num); //显示获取的键盘值
}
}
总之,矩阵键盘只要自己认真地把整个过程想清楚,然后有了思路写代码也就变得比较简单,关键在于要把原理搞懂。
打包文件具体见
[单片机4X4矩阵键盘](http://download.csdn.net/my)