按键进阶使用:短按、长按、连续、双击、组合键实现

[复制链接]
30577|170
小小小Yy 发表于 2024-3-19 21:56 | 显示全部楼层
谢谢分享
acon 发表于 2024-3-22 17:30 | 显示全部楼层
学习学习!
guijial511 发表于 2024-3-23 10:31 来自手机 | 显示全部楼层
按键的检测方式有很多灵活的实现方式
bidinghong 发表于 2024-3-23 10:40 来自手机 | 显示全部楼层
谢谢分享学习学习
问天少年 发表于 2024-3-28 11:46 | 显示全部楼层
这个按键组合功能太棒了
菜鸟的第一步 发表于 2024-3-28 13:19 | 显示全部楼层
组合键一般来说是如何处理的呢 和单键的区别是什么
黑心单片机 发表于 2024-3-28 13:43 | 显示全部楼层
很考验逻辑处理啊
xuri_6 发表于 2024-3-31 18:44 | 显示全部楼层
学习学习
caigang13 发表于 2024-4-1 08:26 来自手机 | 显示全部楼层
这个主要靠检测按键得动作时间来实现
maqianqu 发表于 2024-4-7 07:52 | 显示全部楼层
通过合理的编程技巧,可以实现按键的进阶使用,如短按、长按、连续、双击和组合键等功能
weifeng90 发表于 2024-4-7 09:05 来自手机 | 显示全部楼层
回复看看,感谢分享。
youtome 发表于 2024-4-7 11:10 | 显示全部楼层
可以通过设置一个较短的延时去检测按键状态的变化。例如,如果检测到按键从释放状态变为按下状态,并且在设定的短时间内再次变为释放状态,那么就判定为一次短按操作。
tabmone 发表于 2024-4-7 13:23 | 显示全部楼层
当按键被按下并在一定时间内释放时,触发短按事件。可以通过计时器和状态机实现短按的检测。
updownq 发表于 2024-4-7 15:25 | 显示全部楼层
需要对按键进行 interruption 服务程序(ISR)处理,并使用一些状态机逻辑来区分不同的按键事件。
biechedan 发表于 2024-4-7 17:25 | 显示全部楼层
while (1)
{
    // 检测按键状态
    HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN);
    if (key_state == 0 && HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_SET)
    {
        // 按键按下
        key_press_time = HAL_GetTick();
        key_press_count++;
    }
    else if (key_state == 1 && HAL_GPIO_ReadPin(KEY_PORT, KEY_PIN) == GPIO_PIN_RESET)
    {
        // 按键释放
        key_release_time = HAL_GetTick();
        
        // 判断按键操作类型
        if (key_press_time != 0 && key_press_time - key_release_time < 50)
        {
            // 短按
            // 在这里添加短按功能代码
        }
        else if (key_press_time != 0 && key_press_time - key_release_time >= 50 && key_press_time - key_release_time <= 200)
        {
            // 长按
            // 在这里添加长按功能代码
        }
        else if (key_press_time != 0 && key_press_time - key_release_time > 200)
        {
            // 连续按
            // 在这里添加连续按功能代码
        }
        else if (key_press_count >= 2)
        {
            // 双击
            // 在这里添加双击功能代码
        }
        
        // 重置按键状态和计数器
        key_state = 0;
        key_press_count = 0;
    }
   
    // 等待按键按下
    key_state = 1;
}
cashrwood 发表于 2024-4-7 19:30 | 显示全部楼层
当按键被按下时,开始计时。
如果按键在预设的短时间内(例如500毫秒)被释放,则视为短按。
执行短按对应的操作。
sesefadou 发表于 2024-4-7 21:29 | 显示全部楼层
当按键被连续按下多次时,触发连续按事件。可以通过计时器和状态机实现连续按的检测。
uptown 发表于 2024-4-8 12:08 | 显示全部楼层
在程序中,可以通过检测按键状态的变化来判断是否发生了短按操作。例如,当按键从高电平变为低电平时,表示按键被按下;当按键从低电平变为高电平时,表示按键被松开。在按键被按下和松开之间,可以设置一个延时来消除抖动。
zerorobert 发表于 2024-4-8 14:04 | 显示全部楼层
只要检测到按键处于按下状态,就不断产生按键信号,直到按键被释放为止。
sdCAD 发表于 2024-4-8 16:00 | 显示全部楼层
当第一次按键被按下并释放后,开始计时。
如果在预设的时间窗口内(例如500毫秒)再次按下并释放按键,则视为双击。
执行双击对应的操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部