1、先弄懂矩阵键盘的原理
像独立按键一样,矩阵按键也是通过识别电位类型来判断是否按下。比如我们将P10-P17中第1-7引脚输出高电平,1表示。然后第8个口输出低电平,0表示。代码实现如下:
P1=0xFF;//先将所有的口输出设置为1
P1_7=0;//再将指定口输出设置为0
2、当开关S1按下时,第四个引脚和第八个引脚接通,即P13=P17=0。此时检查第四引脚的电位,如果电位为低电位(P13=0),就可以得到S1的键值1,代码实现如下:
注:此处的单片机为弱上拉,即低电平的影响大于高电平,所以原来的高电平1变为低电平0.
if(P1_7==0)
return 1;
3、这只是理想的状态,我们知道代码的运行是在一瞬之间完成的,但是我们按下按键的时候,按键接触的地方会产生震动,出现0,1反复横跳,为了消除震动产生的影响,我们可以对代码进行一些延时操作。代码实现如下:
if(P1_7==0) //判断开关S1是否按下
{
Delay(20); //延时20ms,消除开关完全按下前的一个震动影响
while(P1_7==0); //用while循环消耗开关按下的时间
Delay(20); //延时20ms,消除开关完全松开前的一个震动影响
return 1;
}
4、上面这样就实现了一个按键的键值读取操作了。同理我们可以依次设置第一到第四引脚输出为0;
然后依次判断第五到第八引脚的电位,通过这16次判断我们就可以获取每一个按键的键值。
我们可以将它封装成一个函数,实现代码如下:
unsigned char MatrixKey()
{
P1=0xFF;
P1_7=0;
if(P1_3==0){Delay(20);while(P1_7==0);Delay(20);return 1;}
if(P1_2==0){Delay(20);while(P1_6==0);Delay(20);return 2;}
if(P1_1==0){Delay(20);while(P1_5==0);Delay(20);return 3;}
if(P1_0==0){Delay(20);while(P1_4==0);Delay(20);return 4;}
P1=0xFF;
P1_6=0;
if(P1_3==0){Delay(20);while(P1_7==0);Delay(20);return 5;}
if(P1_2==0){Delay(20);while(P1_6==0);Delay(20);return 6;}
if(P1_1==0){Delay(20);while(P1_5==0);Delay(20);return 7;}
if(P1_0==0){Delay(20);while(P1_4==0);Delay(20);return 8;}
P1=0xFF;
P1_5=0;
if(P1_3==0){Delay(20);while(P1_7==0);Delay(20);return 9;}
if(P1_2==0){Delay(20);while(P1_6==0);Delay(20)return 10;}
if(P1_1==0){Delay(20);while(P1_5==0);Delay(20);return 11;}
if(P1_0==0){Delay(20);while(P1_4==0);Delay(20);return 12;}
P1=0xFF;
P1_4=0;
if(P1_3==0){Delay(20);while(P1_7==0);Delay(20);return 13;}
if(P1_2==0){Delay(20);while(P1_6==0);Delay(20);return 14;}
if(P1_1==0){Delay(20);while(P1_5==0);Delay(20);return 15;}
if(P1_0==0){Delay(20);while(P1_4==0);Delay(20);return 16;}
return 0;
}
以上只是一种获取矩阵键盘键值的方式,自己也可以调用switch,for来简化代码。