单片机如何识别按键长按和短按?

1 post / 0 new
2303896998_680
2303896998_680的头像
单片机如何识别按键长按和短按?

单片机工程师在面试的过程中,经常会碰到一些相同的问题,笔者总结了十个提问率较高的问题,供大家参考。现在我们来分析单片机工程师常遇面试问题之二:单片机如何区别按键长按和短按?

“图(1)连接线路图"
图(1)连接线路图

首先,我们来看一下按键和单片机的线路连接图(图1),KEY1直接连接到单片机IO口,单片机IO口设置为上拉输入状态,注意如果IO口内部无上拉电阻,那么还需外部增加上拉电阻,这一点在设计单片机线路时需要特别注意,不然将会拖慢项目进度。我们先来分析一下单片机是如何识别按键按下的,如下图所示,当按键未按下时,单片机IO口和地不相连接,因为我们设置了内部上拉,所以现在读取该IO口状态为高电平,也就是逻辑1,当按键按下时,单片机IO和地相连接,那么此时读取该IO口状态为低电平,也就是逻辑0,按键按下和未按下的等效示意图如图(2)。所以当我们读取IO口状态为“1”时,代表按键未按下,当我们读取IO口状态为“0”时,代表按键按下。

“图(2)等效电路图"
图(2)等效电路图

在实际使用过程中,会因为按键的抖动而产生杂波,抖动波形请参考图(3),所以我们在识别按键状态的时候还需要做一些消除抖动的处理。硬件方面我们可以在按键上并联一个104的电容到地来消除部分杂波,如图(1)中的C22就是这个作用。软件方面也需要做一些消抖的算法,在抖动的这个过程中,读取IO状态是不确定的,我们要想办法把这这个抖动的过程给过滤掉。常用的一种算法是当连续检测到100ms IO口为低电平的时候(可以设定每10ms检测一次),就认为此时已经有按键按下,事实上这种算法是非常有效的。

“图(3)抖动波形"
图(3)抖动波形

参考程序:

//注:flag_10ms每10ms会被置1,这个动作一般用定时器来完成

if(flag_10ms)

{

flag_10ms = 0;

if(!KEY1)

{

count++;

if(count == 200) //长按超过2s

{

; //此处认为按键长按,可设置相关标志位

}

If(count >= 200)

{

count = 250;

}

}

else

{

if(count >= 10 && count <= 200)//按键时间在100ms至2s之间

{

; //此处认为按键为短按,可设置相关标志位

}

count = 0;

}

}

本文转载自:头条(版主: 单片机技术交流站)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理。