在单片机中按键长按短按双击长击的实现(循环消抖)

我们在单片机开发的时候,因为各种因素,一个按键肯定不能只有一个功能,所以,我们应该怎么判断它到底是什么功能呢?

这里我们需要想想一下按键按下的过程,我们按下按键,因为按键有弹性,所以会有一段时间的波动,这个时间大概是几十us,在这个过程中,当前IO口会有几次高低电频转换,我们都知道单片机开发的时候都是在判断IO口是高电频还是低电频来判断案件是否按下,这里这个过程就会导致按键多次促发,所以一般初学者都会给按键按键以后一段时间的延时再来判断按键是否按下,就像下面这段代码 

​
uint8_t Key_Scan(void)
{
    uint8_t key_flag = 0;

    if(!KEY1)
    {
        delay_us(20);
        if(!KEY1)
        {
            key_falg = 1;
        }
        while(!KEY1);
        delay_us(20);
    }

    return key_flag;
}

​

这个代码用延时来消除案件的抖动,但是按键如果是低电频就会一直促发,可是我们只需要按键处理一次,所以用一个while来等待按键释放,再延时等待释放过程中的抖动,但是这个代码会打断我们本身过程中的代码,会让我们的代码卡在这里不会执行后面的代码,所以我们就要用一种循环消抖的方法来消除抖动,并且用标志位来防止按键不会多次促发,如果标志位为1,我们就证明按键按下就不再读取按键或者是处理其他事件,首先我们用模块化的建一个.h文件

#ifndef _button_h_
#define _button_h_

#define KEY_DEBOUNCE_TIME 20

typedef struct{
    uint8_t Key_Flag : 1;
    uint16_t Key_Out;
} KeyState;

uint8_t Key_Output(uint8_t Key_Input, KeyState *keystate, uint8_t key_num_size);

#endif

​

​

​

我们用一个结构体来封装按键的标志位等各种需要封装的东西,然后我们定义一个函数

来进行按键的消抖操作,这里我们需要一个参数,这个参数传递当前io口的状态

下面我们开始编写函数内容

​#include "button.h"

uint8_t Key_output(uint8_t Key_Input, KeyState *keystate, uint8_t key_num_size)
{
    uint_t key_num = 0;

    if (Key_Input)
    {
        keystate->key_out = 0;
        keystate->Key_Flag = 0;
    } else if (!keystate->Key_Flag) {
        keystate->Key_Out++;
        if (keystate->Key_Out == KEY_DEBOUNCE_TIME) 
        {
            keystate->Key_Flag = 1;
            key_num = key_num_size;
        }
    }

    return key_num;
}

​

​

​

这里我们集中解释一下代码,首先我们判断一下案件是否按下,如果没有按下,我们就把标志位和计数位清零,否则就是按键按下,然后我们在判断一下标志位是否位1,如果为1就证明按键按下,就不用继续计数了,等待按键释放标志位重载为0,如果为0,就会对计数位进行累加,直到它加到循环次数足够,就会给标志位值1,然后赋键值给key_num,然后返回出去,然后再进来,key_num就会重载初值,不会再继续给案件赋值

那么循环消抖的内容就这么多,下次我们继续介绍长按的判断

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于 stm32 按键按双实现方法。 对于单片机按键处理,常见的方法是轮询法和断法。轮询法是在主循环不断读取按键状态,判断按键是否按下或者释放,并进行相应的处理;断法则是通过外部断或者定时器断来响应按键事件。 对于按、按和双事件的处理,一种常见的方法是使用状态机。状态机包括多种状态和转移条件,用于描述按键事件的不同状态和状态之间的转移过程。通过按键状态的变化,可以判断出按键事件的类型,并进行相应的处理。 具体实现方法可以参考以下步骤: 1. 读取按键状态,并判断按键是否按下或者释放。 2. 根据按键状态的变化,更新状态机的状态,并记录按键的按下时间和释放时间。 3. 根据状态机的状态,判断按键事件的类型,并进行相应的处理。例如,当状态机处于“按下”状态时,如果按键持续按下的时间超过一定阈值,则判断为按事件;如果按键持续按下的时间不足阈值,则判断为按事件;如果在一定时间内连续按下两次按键,则判断为双事件。 4. 根据按键事件的类型,执行相应的操作。例如,按事件可以用于开启或关闭某个功能;按事件可以用于切换不同的模式;双事件可以用于执行快速操作。 总之,实现按键按双需要结合具体的硬件平台和软件环境进行综合考虑,根据实际需求选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值