您的位置 首页 观点

4 x 4 矩阵键盘辨认实例剖析

在单片机应用系统中,键盘是人机对话不可缺少的组件之一。在按键比较少时,我们可以一个单片机IO口接一个按键,但当按键需要很多,IO资

单片机运用体系中,键盘是人机对话不行短少的组件之一。在按键比较少时,咱们能够一个单片机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;//保存第2次的读到的数 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; //显现键值高位
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/260109.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部