lastkey=KBTable[i+1];
return KBTable[i+1];
}
b.线反转法:线反转法也是识别闭合键的一种常用方法, 该法比行扫描速度快, 但在硬件上要求行线与列线外接上拉电阻。先将行线作为输出线, 列线作为输入线, 行线输出
全“0”信号, 读入列线的值, 那么在闭合键所在的列线上的值必为0;然后从列线输出全“0”信号,再读取行线的输入值,闭合键所在的行线值必为 0。这样,当一个键被按下时, 必定
可读到一对唯一的行列值。再由这一对行列值可以求出闭合键所在的位置。
//一次键盘扫描(线反转法,中断扫描计数去抖)*********************************************************
uchar code KBTable[] = {'1','2','3','F','4','5','6','E','7','8','9','C','0','A','B','D'};
//key_index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
uchar key_scan(void) //返回 '0','1','2'...'E','F',0xff
{ uchar key_index,temp=0;
CTL=0x88; //CH输入,CL输出 10001000
PC=PC & 0xf0; //将低四位置0
if(PC!=0xF0) //判断按键是否按下 如果按钮按下 会拉低CH其中的一个端口
{
temp=PC; //读PC口
temp=temp&0xf0; //屏蔽低四位
temp=~((temp>>4)|0xf0); // 高四位取反值 ~(1111****)
if(temp==1) // pC.4 被拉低 1110 第一行
key_index=0;
else if(temp==2) // PC.5 被拉低 1101 第二行
key_index=4;
else if(temp==4) // PC.6 被拉低 1011 第三行
key_index=8;
else if(temp==8) // PC.7 被拉低 0111 第四行
key_index=12;
else //没有键按下
return 0xff;
CTL=0x81; //CL输入,CH输出 10000001
PC=PC & 0xf0; //CH输出0000 初始: 00001111 若有键按下,根据低4位哪一位被拉低确定第二维坐标
temp=PC; //读PC口
temp=temp&0x0f;
temp=~(temp|0xf0); // 低四位取反值 ~(1111****)
if(temp==1) //PC.0 被拉低 1110 第一列
key_index+=0;
else if(temp==2) //PC.1 被拉低 1101 第二列
key_index+=1;
else if(temp==4) //PC.2 被拉低 1011 第三列
key_index+=2;
else if(temp==8) //PC.3 被拉低 0111 第四列
key_index+=3;
else //没有键按下
return 0xff;
return KBTable[key_index];
}
else return 0xff;
}
c.消抖方法:
(1)硬件消抖法:就是在键盘中附加去抖动电路,从根上消除抖动产生的可能性。右图所示电路实际上是由R-S触发器构成的单脉冲电路。当按钮开关按下时Q端输出低电
平,当开关松开时Q端恢复高电平,即输出一个负脉冲,以此消除抖动。
(2)软件消抖法:键按下的时间与操作者的按键动作有关,约为十分之几到几秒不等。而键抖动时间与按键的机械特性有关,一般为5~10ms不等。软件消抖法即是采用延时
(一般延时10~20ms)的方法,以避开按键的抖动,即在按键已稳定地闭合或断开时才读出其状态。
(3)定时中断扫描计数消抖法:把扫描函数放在定时中断里调用,扫描有键值则保存至kast_key并计数(key_count++),下次中断时再扫描,键值与上次相同则计数累加,若
键值不同则计数从1开始,……,直到相同的键值被计数>=6,则认为该键按下。