4x4矩阵键盘扫描法程序设计
键盘扫描的一般步骤:
(1)判断键盘上有无键按下。
将列线(Y0--Y3)全部输出为0,此时读行线(X0--X3)的状态,如果行线全为1,则表示没有任何键按下;如果行线不全为0,则表示有键按下。
进而继续执行下面的步骤。
(2)按键软件去抖动。
当判断按键按下之后,程序中延时10ms左右的时间,再次判断一下键盘的状态。
如果仍然处于按键按下的状态,即行线不全为1,则可以肯定有按键按下。
否则按按键抖动来处理。
(3)扫描按键的位置。
先令列线Y0为低电平0,其余三根列线均为高电平1,此时读取行线的状态。
如果行线均为高电平,则Y0这一列上没有按键按下,如果行线不全为高电平,则其中为低电平的行线与Y0相交的键被按下。
如果列Y0上没有键被按下,则可以按照同样的方法依次检测列Y1、Y2、Y3有没有键按下。
这样逐行扫描可以找到按键按下的位置。
(4)一次按键处理。
有时为了保证一次按键只进行一次按键处理,可以判断按键是否释放,如果按键释放则开始进行按键操作。
int keyscan()
{
unsigned char k,temp;
P1=0xf0;
k=P1;
if(k!=0xf0)
{
delay();
temp=P1;
if(k==temp)
{
k=0xfe;
d0
{
P1=k;
if(k!=P1)
{
switch(P1)
{
//第一行
case ox7e:{return 0;break;}
case oxbe:{return 1;break;}
case oxde:{return 2;break;}
case oxee:{return 3;break;}
//第二行
case ox7d:{return 4;break;}
case oxbd:{return 5;break;}
case oxdd:{return 6;break;}
case oxed:{return 7;break;}
//第三行
case ox7b:{return 8;break;}
case oxbb:{return 9;break;}
case oxdb:{return 10;break;}
case oxeb:{return 11;break;}
//第四行
case ox77:{return 12;break;}
case oxb7:{return 13;break;}
case oxd7:{return 14;break;}
case oxe7:{return 15;break;}
}
}
k=_crol_(k,1);//将k循环左移一位后赋给k }while(k!=0xef);
}
}
}。