Author: Manba Cople
专业:IOT
说明:记录和输出学习内容
前言
介绍写矩阵键盘的一种思路和具体实现代码
思路
以键盘的某个角作为坐标原点建立平面直角坐标系,如下图(图为我设计计算器的矩阵键盘),从而,矩阵键盘的思路就是,给x方向(水平方向)
赋值为1,y方向(竖直方向)赋值为0,不断扫描判断x方向是否有等于0的,若判断到某行为0就说明该行有按键按下,因为,当有按键按下时,
按键导通,y方向的0就给了x方向;
由于矩阵键盘是二维的,还需要判断按键的列号才能确定一个按键的位置,判断列,首先给x方向复制为0,y方向赋值为1,不断扫描,当有按键
按下时,x方向的0,就会导通给y方向,从而确定按键的(x,y)。
另外,关于矩阵键盘的扫描,可以在主程序中实现,也可以用利用定时器做。
具体代码
unsigned char keyvalue=0;
bit keyflag=0; //0无按键按下,1有按键按下
void MatrixKey()
{
unsigned char ky=0,kx=0,i,j;
if(keyflag==0) //没有按键按下执行扫描程序
{
P3=0x0f;
for(i=0;i<4;i++)
{
if((P3&(0x01<<i)) !=(0x01<<i)) //通过for+移位运算不断的判断是否有0值出现
ky=i+1;
}
P3=0xf0;
for(j=0;j<4;j++)
{
if((P3&(0x10<<j)) !=(0x10<<j))
kx=j+1;
}
}
if(kx==0) //排除没有按键按下就计算键值
{
keyflag=0;
}
else //有按键按下
{
keyvalue=kx+4*(ky-1); //计算键值
keyflag=1; //标志位置1
}
}
总结
利用坐标系的思想实现矩阵键盘思路较为清晰,另外,代码利用循环+移位运算降低了代码量。继续优化的话,在于按键消抖的问题。