14.2.2 线反转法及C51程序设计
线反转法是通过两次端口电平的反转操作来检测按键输入,然后分别调用不同的按键处理子程序。这里以4×4矩阵式键盘为例进行介绍。
在使用线反转法时,矩阵式键盘的电路结构如图14.5所示,其中应将矩阵式键盘的行线和列线通过上拉电阻接正电源。
1.线反转法的流程
线反转法的流程图,如图14.6所示。利用线反转法的具体操作步骤如下。
图 14.5 线反转法原理图
图 14.6 线反转法的流程图
(1)将行线作为输出线,列线作为输入线。置输出线全部为“0”,此时列线中呈低电平“0”的为按键所在的列,如果全部都不是“0”,则没有按键按下。
(2)延时10ms左右的时间,然后将第一步反过来,即将列线作为输出线,行线作为输入线。置输出线全部为“0”,此时行线中呈低电平“0”的为按键所在的列。至此,便确定了按键的位置(X,Y)。这样,既实现了延时去抖动,又可以得到键值。
(3)按键程序处理。根据按键的键值,执行相应的程序处理子程序。有的时候,为了保证一次按键只执行一次程序处理,可以判断按键是否释放,如果按键释放则再次开始按键反转检测操作。
线反转法从本质上来说也是一种扫描法。在实际使用过程中,扫描法需要逐列扫描查询,根据键的位置不同,每次查询的次数不一样。如果按下的键位于最后一列时,则要经过多次扫描查询才能获得该按键的位置。而采用线反转法,无论被按的按键处于第一列还是最后一列,都只需要经过两步便可以获得此按键的位置。因此,线反转法更加方便。
2.线反转法C51程序设计
这里假定8051单片机P1端口外接矩阵式键盘,矩阵式键盘的列线(Y0~Y3)接单片机P1.0~P1.3,而行线(X0~X3)接P1.4~P1.7。在C51语言中,采用线反转法的键盘子程序示例如下。
int KeyScan(void)
{
int key;//定义键值
P1=0x0F;//列线输入
delay();//延时,用于去抖动
temp=P1;//读P1端口
temp=temp&0x0F;//获取列值
temp=~(temp|0xF0);
if(temp==1)//根据列值,为key赋值
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;
P1=0xF0;//反转,行线输入
delay();//延时,用于去抖动
temp=P1;//读P1端口
temp=temp&0xF0;//获取行号
temp=~((temp>>4)|0xF0);
if(temp==1)//根据行号,为key赋值
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
return key;//返回按键键值
}
在该程序中,首先置P1列线为输入,然后读端口P1并获取列号。接着,置P1行线为输入,然后读端口P1并获取行号。最后返回按键的键值。
在程序中可以循环调用该子程序来检测按键的输入,进而根据返回的键值来执行相应的程序处理。在按键处理子程序中,同样应该尽可能占用少的CPU运行时间,以满足实时准确响应按键请求的目的。