矩阵键盘
作者:互联网
1、 矩阵键盘的一般电路
图 1 矩阵键盘电路
如图 1
矩阵键盘电路所示,4*4矩阵键盘有4行4列按键,单片机4个I/O口接矩阵键盘的行线,另外4个I/O口接矩阵键盘的列线,通过对行线列线的操作完成按键的识别和操作。
2、 矩阵键盘的原理
矩阵键盘按键识别的流程一般是这样的:
(1)置第1行为低电平(0),其余行为高电平,读取列线数据,列线有低电平表示此行有按键按下。
(2)置第2行为低电平(0),其余行为高电平,读取列线数据,列线有低电平表示此行有按键按下。
(N-1)根据行线列线的电平不同可以识别是否有按键按下,哪一个按键按下,获取按键号。
(N) 根据按键号跳转至对应的按键处理程序。
3、 一个矩阵键盘程序的例子
图
2为按键处理的主流程,思路是依次拉低按键的各个行,再读取列线的数据,假如列线有低电平,则认为此行有按键按下,标记此行有按键按下并存入行值。
读取列线数据的思路则是这样,依次读取第1-4列,假如读取此列时为低电平,则标记并存入列值。
下面是部分代码:
//(1)按键识别程序
void key() //按键扫描
{
unsigned char key_value_temp; //临时按键值,默认1111 1111(二进制)
key_value=0xff;
//键值
key_value_temp=0xff; //键值临时变量
//矩阵键盘程序流程
//依次拉低第1234行,读入列线数据
Pin_r_1=0; Pin_r_2=1;Pin_r_3=1;Pin_r_4=1; //拉低第1行。
//Pin_r_1第1行行线,Pin_r_2第2行行线,其余类似
key_value_temp=read_column();//读列数据
if (key_value_temp != 0xff)
//表示第一行有按键按下
{key_value=key_value_temp & 0x1f;
//获取按键号,例如0001
1101表示第1行第2列的按键按下
}
Pin_r_1=1; Pin_r_2=0;Pin_r_3=1;Pin_r_4=1; //拉低第2行
key_value_temp=read_column();//读列数据
if (key_value_temp != 0xff)
//表示第2行有按键按下
{key_value=key_value_temp &
0x2f;
}
Pin_r_1=1; Pin_r_2=1;Pin_r_3=0;Pin_r_4=1; //拉低第3行
key_value_temp=read_column();//读列数据
if (key_value_temp != 0xff)
//表示第3行有按键按下
{key_value=key_value_temp &
0x3f;
}
Pin_r_1=1; Pin_r_2=1;Pin_r_3=1;Pin_r_4=0; //拉低第4行
key_value_temp=read_column();//读列数据
if (key_value_temp != 0xff)
//表示第4行有按键按下
{key_value=key_value_temp &
0x4f;
}
}
//(2)读取列线数据
unsigned char read_column() //读矩阵键盘的列
{unsigned char key_column;
key_column=0xff;
if(Pin_c_1==0 ) key_column=key_column & 0xfe;
//1110
表示第1列按键按下。 key_column的低4位表示按键号,高4位常为1111
if(Pin_c_2==0 ) key_column=key_column & 0xfd;
//1101
表示第2列按键按下。
if(Pin_c_3==0 ) key_column=key_column & 0xfb;
//1011
表示第3列按键按下。
if(Pin_c_4==0 ) key_column=key_column & 0xf7;
//0111
表示第4列按键按下。
return key_column;
}
以上程序对应的键值表如下:
最后在程序中处理键值跳转至相应的操作即可。
有一个4*4矩阵键盘的proteus仿真例子实现了如下功能:
1、利用行扫描法读取4x4矩阵键盘键值;
2、LCD1602上显示按下的按键值。
先说矩阵键盘,因为我写的组合键代码是在矩阵键盘的基础上写的,当然在独立按键上写组合键更简单一些。所以当你矩阵键盘的组合键会写的时候,你在独立按键上的组合键也就会写了。
矩阵键盘的检测和独立按键有很大的区别,但是究其本质还是一样的。
先看一下矩阵键盘的原理图:
矩阵键盘原理图
由于矩阵键盘中每一个按键的两个接线口都是接在IO口上的,所以我们就必须在软件里面控制单片机在每个独立按键的两端加上不同的电平。
【注】:独立按键很简单,直接在一端接地就行了。
从上面的原理图中可以看出 P1 口的高四位控制 行,第四位控制 列;所以我们就可以写 P1 = 0X0F 或者写 P1 = 0XF0,这样就实现了在每一个独立按键两端加上不同的电平。
代码编写流程和独立按键一样,第一步要先检测到按键按下,根据上面的原理图,矩阵键盘检测按键是否按下只要给 P1 口赋值 0X0F,然后检测 P1 口的值是否还是 0X0F即可。
之后就要消除抖动,消除抖动的方法还是一样,延时一段时间即可,如图:
单片机矩阵键盘消除抖动
之后就判断具体是哪个按键按下就行了。
【注】矩阵键盘复杂就是复杂在这里。
判断到底是哪个按键按下的思路有两种:
1、逐行扫描
逐行扫描就是说先扫描第一行中的哪个按键按下了,如果没有再扫描第二行,看一下是不是第二行里的某个按键按下了,如果还没有找到按下的那个按键,那么就继续扫描第三行、第四行,知道找出哪个按键被按下了。这个代码实现比较简单,而且这种扫描方法不怎么常用,效率不高,所以这里我就不写了。
2、行列扫描
行列扫描就是说先扫描所有的行,确定是哪一行的按键被按下了,之后再扫描所有的列,找出哪一列有按键被按下了,这样只要扫描两次就可以确定出到底是哪个按键被按下了。
具体代码实现如下:
1、行扫描:
单片机矩阵键盘行扫描
2、列扫描:
单片机矩阵键盘列扫描
最后别忘了按键的松开检测:
单片机矩阵键盘按键松开检测
这样矩阵键盘的编写就说完了,下面说组合键,写第七篇的时候我给它起名字叫复合按键,现在觉得不太好,要不就叫组合键吧。
组合键就是说当按住一个按键的同时再按另一个按键的时候,会有不同的效果。比如:Ctrl+C是复制、Shift+数字键可以敲出特殊字符等等。
代码编写思路就是:当按住第一个按键的时候,只要这个按键不松开就一直检测能够和它组合的按键,根据按键的不同组合实现不同的效果。
代码如下:
单片机矩阵键盘组合键
大家对照代码仔细看一下就明白了。
标签:Pin,矩阵,键盘,按下,key,按键 来源: https://www.cnblogs.com/zhugeanran/p/16342205.html