这个一般是经验值,可这样判断:连续两次击键间隔时间超过500ms,则视为单击,否则视为双击按键。去抖动时间一般使用30ms。如果按键质量不太好,时间可以加倍。可以选择几组参数
然后实践一下看看手感。
unsigned char i;
while(!P3.2);//按键名堂自己定义,高/低电平有效你没说,权当低电平有效
delay(50);//按键去抖动50毫秒
if(!P3.2)while(!P3.2);//等待按键释放
else return;//按键抖动返回
for(i = 20;i0;i--)//等待按键再次按下,最多等待200毫秒
{
delay(10);//延时10毫秒
if(!P3.2)
{
delay(50);;//按键去抖动50毫秒
if(!p3.2)......//去处理按键双击事件
}
}
//等待超时,判定仅有1次按键动作,结束按键检测
过滤抖动的问题
第一次发生接触时,设置一个flag表明上次所有btn状态,然后定时器启动。然后在main
loop进行检测,一直检查刚才那个按下的btn,如果发现到定时器将要到时刻都还在接触状态,那么应该是长按,重置定时器。如果出现了一定间隔的断开,那么等待直到定时器中断发生时,检查flag中btn状态和现在btn状态,则可以发现是否双click---
假设有键按下时 key = 0 。
if(key == 0) { //发现按下按键
Delay(10) //延时约10ms
if(key == 0) { //确认第一次按下
while(!key); //等待释放
//-------------------以上是常规的按键判别步骤
Delay(100) //多延时一会,约100ms
if(key == 0) {//确认第二次按下
//执行双击程序
}
else {
//执行单击程序
}
}
}
一般地,我们的键盘检测都有一个按键码存储字节,一般情况下,只要检测到有效按键,那么这个存储字节的按键码就有效,也就是单击。何为双击呢?双击就是在监测到该按键后在该按键要有作用(这个作用就是单击)之前又检测到该按键,然后就当作了双击。那怎么实现这一判断呢?我们只要加一个软计数器,当检测到有效按键后,该计数器开始向下计数,如果计数器自然减到了0那么就是单击生效;如果在该计数器值没有减到0之前又检测到该按键,那么就是双击立马有效同时计数器归零。这个计数器肯定是ms级的,也就是要在定时器里工作,只要它不为0,那么定时器中断服务就对它减1操作,因此计数器本身同时就是一个开关量,而触发它的是检测到有效按键。
配置定时器,比如固定1ms进一次中断,然后计数就可以啦,大概原理就是这个有不明白的再追问吧
单片机按键单击双击的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:单片机按键单击双击