硬件连接:P2:4*4矩阵键盘,行接低四位,列接高四位
扫描方法:线反转法
即先给P2赋值0x0f,当有按键按下后,P2的低四位必然有一位可检测到高电平,此时用if 可确定是哪一位,从而确定了被按下按键的行数
然后给P2赋值0xf0,同理,按键按下后,高四位中有一位可检测到高电平,于是便确定了列数。 行和列唯一确定了哪个按键被按下。
(用去抖延时,可避免因按键的微弱抖动造成检测误差, 什么?不知道何为去抖延时?百度吧少年···)
下面的demo稍显复杂,待日后有空补上个通俗点的
/*-----------------------------------------------------------------------
keyxy : 判定硬件编号
根据硬件连接而定
输入参数:xx :4位二进制;
-----------------------------------------------------------------------*/
uchar keyxy(uchar xx)
{
uchar ans;
switch(xx)
{
case 0x07:ans=3;break;
case 0x0b:ans=2;break;
case 0x0d:ans=1;break;
case 0x0e:ans=0;break;
}
return ans;
}
/*-----------------------------------------------------------------------
keyscan : 矩阵键盘扫描
返回值 :0-15 精确扫描,必须有键按下,且松开的时候返回
-----------------------------------------------------------------------*/
uchar keyscan()
{
uchar h, l;
P2=0x0f;
while(1)
{
while(P2==0x0f);
delay_nms(8);//去抖
if(P2!=0x0f)
{
h=keyxy(P2);
P2=0xf0;
l=keyxy(P2/16);
while(P2!=0xf0);//松手检测 /待调研/
return 4*h+l;
}
}
}
/*-----------------------------------------------------------------------
lzkeyscan : 矩阵键盘扫描
返回值 :0-15 懒惰扫描,每次按键抖动之后返回。(默认99)
-----------------------------------------------------------------------*/
uchar lzkeyscan()
{
uchar h, l, s = 99;
P2=0x0f;
if(P2!=0x0f)
{
delay_nms(8);//去抖
if(P2!=0x0f)
{
h=keyxy(P2);
P2=0xf0;
l=keyxy(P2/16);
s=4*h+l;
}
}
return s;
}