原标题:STM32单片机按键消抖和FPGA按键消抖大全
写在前面:
按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常我们采用软件延时的方法就可以解决抖动问题。
1、单片机中按键消抖程序
1.1 单片机中,比如STM32中,一般的方法(最简单的方法)
软件消抖程序:
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)==1)
{
delay_ms(20);//延时20ms再去检测按键值
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14)==0)// 相当于下降沿
{
KEY1 = 1; //表示KEY1被按下
}
}
1.2 比较全面的按键消抖程序及按键状态检测程序
第一步:初始化全局时间戳的定时器,一般采用SysTick定时器来产生,每ms一次tick即可。
第二步:初始化按键对应的IO,复用为边沿触发的外部中断。
第三步:在外部中断函数中添加按键事件处理函数。
代码部分:
typedefstruct _Key_t
{
u32 last_time;
enum
{
May_Press,
Release,
}private_state;
enum
{
No_Press,
Short_Press,
Long_Press,
}state;
}Key_t;
#defineIs_ShortPress_Threshold 1500
简单定义一个按键状态的结构体,用于管理每个按键的状态。顺便再定义一个长短按的识别阈值,用于区分按键的长短按。
if(key_state.private_state==Release)
{
if(KEY==0)
{
key_state.private_state=May_Press;
k