C语言处理按键的 单击(短按),长按,双击,多击 处理

【一】:按键的模型
(1)单击按键: 按键按下到释放的一个过程,t1 如果大于 50ms.
在这里插入图片描述
(2)双击按键:如果两个脉冲之间相差时间t2 < 200ms 认为是 双按键
否则 判定为两次不相干的按键行为。
<同样可以判定连续多次按键,但是一般没什么意义>
在这里插入图片描述
(3)长按键:如果按下时间t3 >=500ms 判定为长按键
在这里插入图片描述
【二】主函数的处理
按键的处理函数: void APP_KEY_Task(void) 。 需要每5ms 调用一次
该函数需要判断上次状态last,以及当前的状态now。

读取IO获取now状态
  • 15
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 C 语言中,实现按键单击双击按可以通过轮询检测按键状态和计时器来实现。具体的实现步骤如下: 1. 定义按键状态枚举值: ```c typedef enum { KEY_IDLE, // 按键空闲状态 KEY_DOWN, // 按键按下状态 KEY_UP, // 按键松开状态 KEY_LONG, // 按状态 KEY_DOUBLE, // 双击状态 } key_state_t; ``` 2. 定义按键结构体: ```c typedef struct { key_state_t state; // 当前按键状态 uint32_t time; // 当前按键计时器值 uint8_t click_count; // 点击次数 } key_t; ``` 3. 实现按键扫描函数,该函数会返回按键状态: ```c key_state_t scan_key() { static key_t key = {KEY_IDLE, 0, 0}; key_state_t state = KEY_IDLE; uint8_t key_value = get_key_value(); // 获取按键值 switch (key.state) { case KEY_IDLE: if (key_value == 0) { key.state = KEY_DOWN; key.time = get_tick_count(); } break; case KEY_DOWN: if (key_value == 0) { uint32_t elapsed_time = get_tick_count() - key.time; if (elapsed_time >= LONG_PRESS_TIME) { key.state = KEY_LONG; state = KEY_LONG; } } else { key.state = KEY_UP; key.time = get_tick_count(); } break; case KEY_UP: if (key_value == 0) { uint32_t elapsed_time = get_tick_count() - key.time; if (elapsed_time <= DOUBLE_PRESS_TIME) { key.click_count++; if (key.click_count == 2) { key.state = KEY_DOUBLE; state = KEY_DOUBLE; } else { key.state = KEY_DOWN; key.time = get_tick_count(); } } else { key.state = KEY_DOWN; key.time = get_tick_count(); } } else { key.state = KEY_IDLE; key.click_count = 0; } break; case KEY_LONG: if (key_value == 1) { key.state = KEY_IDLE; } break; case KEY_DOUBLE: if (key_value == 1) { key.state = KEY_IDLE; } break; } return state; } ``` 4. 在主程序中轮询检测按键状态: ```c while (1) { key_state_t state = scan_key(); switch (state) { case KEY_DOWN: // 处理按键单击事件 break; case KEY_LONG: // 处理按键按事件 break; case KEY_DOUBLE: // 处理按键双击事件 break; } } ``` 其中,`get_key_value()` 函数用于获取当前按键状态(按下或松开),`get_tick_count()` 函数用于获取当前的计时器值。`LONG_PRESS_TIME` 和 `DOUBLE_PRESS_TIME` 分别表示按时间和双击时间的阈值,可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值