文章目录
前言
矩阵键盘是通过行列扫描检测,相当于坐标确定按键按下的位置。
矩阵键盘相对独立按键来说,占用I/O口较少,4X4键盘共16个位置,占用了8(4+4)个I/O口。独立按键8个I/O口对应8个按键。
使用情况:
当按键使用量少时,使用独立按键,操作更加方便。
当按键使用量较多时,建议使用矩阵键盘,节省I/O。
一、矩阵键盘的原理
图片来源:百度
如图所示,共占用了8条线路(8个I/O口),垂直方向连接按键的4条线路分别为L1、L2、L3、L4;水平方向连接按键的4条线路分别为H1、H2、H3、H4。
将其想象为坐标,L为x方向,H为y方向。当S1按下时,坐标为(1,1);当S8按下时,坐标为(4,2)。
按照上面的理解,矩阵键盘在没有按下的状态为高电平,即为'1',当有按键按下时,状态为'0'。
矩阵键盘按照行列式方法进行扫描,如按列扫描就是先检测x=1的一列上是否有为0的按键,再扫描x=2的一列上是否有为0的按键,x=3的一列上是否有为0的按键,x=4的一列上是否有为0的按键。但是,检测到只是检测到,矩阵键盘的使用需要在检测到之后执行相应的代码。如:若(2,3)按键按下,输出(2,3)。
二、使用步骤
1.准备
矩阵键盘的使用中会存在逻辑运算,何为逻辑运算?就是与或非等运算。
接下来通过实例进行讲解逻辑运算:
设P0=XXXX XXXX(X为未知状态,不知道为0还是为1)
(1)或运算(符号: '|')
P0|0x0f
XXXX XXXX
0000 1111
---------
XXXX 1111
通过或运算,可将P0的后4为置1;
(2)与运算(符号: '&')
P0&0x0f
XXXX XXXX
0000 1111
---------
0000 XXXX
通过或运算,可将P0的前4为置0;
(3)非运算(符号: '~')设P0=0101 0101
P0=~P0
0101 0101
---------
1010 1010
通过非运算,可将P0的0变为1,1变为0;
2.代码
代码如下(示例):
unsigned char temp;//定义temp变量
P44=0;P42=1;P3=0X7F;//0111 1111 扫描第一列(行)
temp=P3; //0111 1111
temp=temp&0X0F;//0111 1111 & 0000 1111 == 0000 1111
//通过逻辑运算将temp的高4位置0
if(temp!=0X0F) /检测到有按键按下
{ //
Delayms(5); //矩阵键盘消抖
temp=P3; ///重新赋值
temp=temp&0X0F; //
if(temp!=0X0F) //再次判断
{
temp=P3;
switch(temp)//当temp的低4位中有按键按下时,0111 1111 的低4位就会改变
{ //通过这种方法检测按键
case 0X7E: num=1;break;
case 0X7D: num=2;break;
case 0X7B: num=3;break;
case 0X77: num=4;break;
}
while(temp!=0x0f) //当按键没有松手时,重新赋值,再次检测
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=0;P3=0XBF;//1011 1111 //后面是顺序扫描剩余列,方法相同,数值稍有改变
temp=P3; //0111 1110
temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
if(temp!=0X0F)
{
Delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XBE: num=5;break;
case 0XBD: num=6;break;
case 0XBB: num=7;break;
case 0XB7: num=8;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XDF;//1101 1111
temp=P3; //0111 1110
temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
if(temp!=0X0F)
{
Delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XDE: num=9;break;
case 0XDD: num=10;break;
case 0XDB: num=11;break;
case 0XD7: num=12;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XEF;//1110 1111
temp=P3; //0111 1110
temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
if(temp!=0X0F)
{
Delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XEE: num=13;break;
case 0XED: num=14;break;
case 0XEB: num=15;break;
case 0XE7: num=16;break;
}
while(temp!=0x0f)
{
temp=P3;
temp=temp&0X0F;
}
}
}
总结
这就是矩阵键盘的使用及原理,在使用矩阵键盘时,要注意矩阵键盘和独立按键的短接线接在哪个位置。
还有就是,并非所有情况都适用矩阵键盘,矩阵键盘节省I/O口,但是相应的增加了代码量,占用了大量内存。在不需要节省I/O口或内存有限时,应使用独立按键。
——————————————————————————————————————
本文纯原创,如有侵权请联系删除,如有错误,敬请批评指正,谢谢大家。