在
单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机I/O口接一个按键,但当按键需要很多,I/O资源又比较紧张时,使用矩阵式键盘无疑是最好的选择。
4 x 4
矩阵键盘是运用得最多的键盘形式,也是单片机入门必需掌握的一种键盘识别技术,下面我们就以实例来说明一下4 x 4矩阵键盘的识别方法。如下图所示,我们把按键接成矩阵的形式,这样用8个I/O口就可以对16个按键进行识别了,节省了I/O口资源。
我们的识别思路是这样的,初使化时我们先让P1口的低四位输出低电平,高四位输出高电平,即让P1口输出0xF0。扫描键盘的时候,我们读P1口,看P1是否还为0xF0,如果仍为0xF0,则表示没有按键按下;如果不0xF0,我们先等待10ms左右,再读P1口,再次确认是否为0xF0,这是为了防止是
抖动干扰造成错误识别,如果不是那就说明是真的有按键按下了,我们就可以读键码来识别到底是哪一个键按下了。
以0键为例,初使化时P1输出0xF0,当0键按下时,我们读高四位的状态应为1110,即P1为0xE0,然后让P1输出0x0F,读低四位产状态应为0111,即P1为0x07,让两次读数相与得0xE7。
现在我们在P2口和P3口分别接一个两共阳极的数码管,用来显示我们按下去的键的键值,P2口接的数据输出,P30与P31口接的位选。如0键按下显示00,1键按下显示01,15键按下显示15……,实现的仿真电路与程序如下:
#include
// 头文件
unsigned char num[]={ 0xc0,0xf9,0xa4,0xb0,0x99, //数码管共阳型 代码
0x92,0x82,0xf8,0x80,0x90
};
unsigned char Mykey=0; //保存当前的按键值
void delay_nms(unsigned int t) //12M 的晶振大概1MS的延时
{unsigned int i,j;
for(i=t;i>0;i--)
for(j=112;j>0;j--);
}
void GetKey(void) //扫描按键若得到按键值存放在 Mykey中
{
unsigned char X,Y,Z ;
P1=0xf0;
if(P1!=0xf0)
{
delay_nms(10);
P1=0xf0;
if(P1!=0xf0)
{
X=P1; //保存第一次的读到的数 0xe0
P1=0x0f;
Y=P1;//保存第二次的读到的数 0x07
Z=X|Y; //0xe7
P1=0xff ;
while(P1!=0XFF);//等放开按键
switch(Z)
{
case 0xe7: Mykey=1;break;
case 0xd7: Mykey=2;break;
case 0xb7: Mykey=3;break;
case 0x77: Mykey=4;break;
case 0xeb: Mykey=5;break;
case 0xdb: Mykey=6;break;
case 0xbb: Mykey=7;break;
case 0x7b: Mykey=8;break;
case 0xed: Mykey=9;break;
case 0xdd: Mykey=10;break;
case 0xbd: Mykey=11;break;
case 0x7d: Mykey=12;break;
case 0xee: Mykey=13;break;
case 0xde: Mykey=14;break;
case 0xbe: Mykey=15;break;
case 0x7e: Mykey=16;break;
default : Mykey=0; break;
}
}
}
}
//主函数
void main()
{
unsigned char m,n ;
delay_nms(1);
while(1) //不断循环
{
GetKey(); //扫描 键盘
m=Mykey/10; //取出键值的高位
n=Mykey; //取出键值的低位
P3=0X00 ;//数码管消隐
P2=num[m]; P3=0X01; //显示键值高位
P3=0X00 ; //数码管消隐
P2=num[n]; P3=0X02; //显示键值高位
}
}