咱们首先要清楚为什么要按键去抖。先看先按键按下的波形图

经过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时分就会在0~5ms内呈现颤动,相当于在不停地按下按键而就不是只按了一次了。安稳闭合时刻大约是10ms,松手颤动的时刻和按下颤动的时刻差不多。
去抖的办法有硬件去抖和软件去抖
咱们常用献身CPU的时刻来软件去抖,便是按下按键后延时5~10ms时刻后再来查看是否有按键按下,松手检测也相同。
硬件去抖的办法如图所示

独立按键的去抖办法很简单,便是在按下和松手后分别加一小段延时再来判别。
例:
sbit key=P1^1;
……………………
…………………..
if(!key) //如果有按键按下
{
delay(10); //延时一小段时刻
if(!key) //真有按键按下
{
。。。。。。。。// 履行按键按下后的操作
}
while(!key); // 松手检测,要是没有松手的话就一向履行while循环
}
原理便是这样,去抖的办法许多。
按键的松手检测首要依据键盘扫描的方法来决议,今日写了一个矩阵键盘扫描的程序,然后加了松手检测。成果没到达料想的要求。后来才发现是检测方法错了。
程序是这样的
uchar keyscan()
{
static uchar H,L,temp;
P1=0Xf0;
L=P1&0xf0;
if(L!=0xf0)
{
delay(18);
if(L!=0xf0)
{
L=P1&0xf0;
P1=L|0x0f; //P1口从头赋值了
H=P1&0X0F;
}
}
/*
P1=0XF0;
L=P1&0XF0;
while(L1!=0XF0) //松手检测
{
L=P1&0XF0;
}
*/
temp=H+L;
switch(temp)
{
case 0xee:key=1;get1=!get1;break;
case 0xed:key=2;get1=!get1;break;
case 0xeb:key=3;get1=!get1;break;
case 0xe7:key=4;get1=!get1;break;
case 0xde:key=5;get1=!get1;break;
case 0xdd:key=6;get1=!get1;break;
case 0xdb:key=7;get1=!get1;break;
case 0xd7:key=8;get1=!get1;break;
case 0xbe:key=9;get1=!get1;break;
case 0xbd:key=0;get1=!get1;break;
case 0xbb:key=0xee;get1=!get1;break;
}
return key;
}

