4 x 4 矩阵键盘识别实例分析 作者: 时间:2016-11-24 来源:网络 加入技术交流群 扫码加入和技术大咖面对面交流海量资料库查询 收藏 在单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机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; //显示键值高位}}
评论