新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机按键去抖

单片机按键去抖

作者: 时间:2016-11-13 来源:网络 收藏
我们首先要清楚为什么要按键去抖。先看先按键按下的波形图

本文引用地址://m.amcfsurvey.com/article/201611/316104.htm

通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在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;

}




关键词:单片机按键去

评论


技术专区

关闭