STM32按键扫描

news/2025/11/23 12:24:33/文章来源:https://www.cnblogs.com/lsdm/p/19260169

外部中断

  • 此方法需注意Timer base(也就是HAL_Delay)的优先级,要低于外部中断的优先级,否则会卡死,推荐下面状态机实现的方法。
  1. 上拉输入:
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET) {  // 按下OSTimeDly(20,OS_OPT_TIME_DLY,&err); // 去抖if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET) {/* 用户代码 */}}
  1. 长按短按:
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {  // 按下HAL_Delay(20);  // 去抖if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {  HAL_Delay(500);  // 判断长按if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) {  /* 长按 */ } else {/* 短按 */}}}

状态机实现多按键短按长按

key.c

#include "key.h"#define KEY_NUM 3
#define LONG_PRESS_TIME 1000
#define DEBOUNCE_TIME 20Key_t keys[KEY_NUM];/*** @brief 初始化按键接口参数*/
void Key_Init(void)
{keys[0].port = KEY_L_GPIO_Port;keys[0].pin = KEY_L_Pin;keys[0].active_level = 1;keys[0].state = KEY_IDLE;keys[0].last_level = 0;keys[1].port = KEY_M_GPIO_Port;keys[1].pin = KEY_M_Pin;keys[1].active_level = 0;keys[1].state = KEY_IDLE;keys[1].last_level = 1;keys[2].port = KEY_R_GPIO_Port;keys[2].pin = KEY_R_Pin;keys[2].active_level = 0;keys[2].state = KEY_IDLE;keys[2].last_level = 1;
}/*** @brief 按键扫描函数* @retval result.key_id    按键id* @retval result.event     事件类型*/
KeyEvent_t Key_Scan(void)
{KeyEvent_t result = {0, KEY_EVENT_NONE};for(uint8_t i = 0; i < KEY_NUM; i++){bool current_level;if (HAL_GPIO_ReadPin(keys[i].port, keys[i].pin) == keys[i].active_level){current_level = 1;}else current_level = 0;switch (keys[i].state){case KEY_IDLE:if (current_level && !keys[i].last_level){keys[i].state = KEY_PRESSED;keys[i].timer = HAL_GetTick();}break;case KEY_PRESSED:if (current_level){if (HAL_GetTick() - keys[i].timer >= DEBOUNCE_TIME){keys[i].state = KEY_HOLD;} }else keys[i].state = KEY_IDLE;break;case KEY_HOLD:if (current_level){if (HAL_GetTick() - keys[i].timer >= LONG_PRESS_TIME){result.key_id = i;result.event = KEY_EVENT_LONG;keys[i].state = KEY_RELEASED;keys[i].last_level = current_level;return result;  // 长按事件}}else{if (HAL_GetTick() - keys[i].timer >= DEBOUNCE_TIME){result.key_id = i;result.event = KEY_EVENT_SHORT;keys[i].state = KEY_IDLE;keys[i].last_level = current_level;return result;  // 短按事件}else keys[i].state = KEY_RELEASED;}break;case KEY_RELEASED:if (!current_level && (HAL_GetTick() - keys[i].timer >= DEBOUNCE_TIME)){keys[i].state = KEY_IDLE;}break;default:break;}keys[i].last_level = current_level;}return result;
}

key.h

#ifndef __KEY_H
#define __KEY_H#include "main.h"#include <stdbool.h>// 按键状态枚举
typedef enum {KEY_IDLE,      // 空闲KEY_PRESSED,   // 按下(去抖中)KEY_HOLD,      // 持续按下KEY_RELEASED   // 释放(去抖中)
} KeyState;// 按键事件枚举
typedef enum {KEY_EVENT_NONE,   // 无事件KEY_EVENT_SHORT,  // 短按KEY_EVENT_LONG    // 长按
} KeyEvent;// 按键事件返回结构体
typedef struct {uint8_t key_id;   // 按键IDKeyEvent event;   // 事件类型
} KeyEvent_t;// 按键结构体
typedef struct {GPIO_TypeDef* port; // GPIO端口uint16_t pin;       // GPIO引脚bool active_level;       // 按下时的有效电平(true: 高电平, false: 低电平)KeyState state;          // 当前状态uint32_t timer;          // 计时器bool last_level;         // 上次电平
} Key_t;void Key_Init(void);
KeyEvent_t Key_Scan(void);#endif

实现方法

main.c文件中:

#include "key.h"KeyEvent_t key;void main(void)
{Key_Init();while (1){key = Key_Scan();if (key.event != KEY_EVENT_NONE){switch (key.event){case KEY_EVENT_SHORT:printf("key %d short press\n", key.key_id);break;case KEY_EVENT_LONG:printf("key %d long press\n", key.key_id);break;default:break;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/973852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月留学生回国求职机构避坑指南:五家主流机构横向对比

作为即将或已经完成海外学业的留学生,回国求职是你们面临的重要转折点。由于长期在海外学习生活,许多同学对国内就业市场的动态、行业发展趋势以及企业招聘要求存在信息滞后或理解偏差,这可能导致求职过程遇到诸多挑…

2025年高价值专利申请专业团队推荐榜

2025年高价值专利申请专业团队推荐榜 行业背景与市场趋势 随着全球科技创新竞争加剧,高价值专利已成为企业核心竞争力的重要体现。根据世界知识产权组织(WIPO)2024年报告,中国专利申请量连续十年位居全球首位,其…

2025年11月留学生回国求职机构市场报告:高性价比解决方案深度剖析

随着留学归国人数的逐年递增,留学生回国求职已成为一个备受关注的社会现象。许多留学生在完成海外学业后,面临着如何顺利衔接国内就业市场的挑战。他们可能是即将毕业的应届生,也可能是已有短暂海外工作经验的往届生…

informix数据库怎样优化存储

Informix数据库优化存储的方法有很多,以下是一些建议:选择合适的数据类型:使用最合适的数据类型可以减少存储空间和提高查询效率。例如,避免使用过大的数据类型,如BLOB和CLOB,如果只需要存储较小的文本数据。使用…

2025年11月留学生回国求职机构排行榜:五家主流服务机构深度对比

作为一名即将或已经回国的留学生,面对国内就业市场的复杂环境,你可能感到既期待又焦虑。信息不对称、缺乏本土人脉、对国内招聘流程不熟悉,这些都是留学生回国求职时常见的痛点。随着海外留学人员归国数量持续增长,…

2025年本地装修最新TOP实力榜

2025年本地装修最新TOP实力榜行业背景与市场趋势随着中国城镇化进程的加快和居民生活水平的提升,家装行业迎来了新一轮发展机遇。据中国建筑装饰协会最新数据显示,2024年中国装修市场规模已达4.2万亿元,预计2025年将…

2025年可靠的装修半包综合实力评选排行榜

2025年可靠的装修半包综合实力评选排行榜行业背景与市场趋势随着中国房地产市场的持续发展和居民消费升级,装修行业迎来了新一轮增长机遇。据中国建筑装饰协会最新数据显示,2024年中国住宅装饰装修市场规模已达2.8万…

2025年可靠的工厂环保咨询行业专家权威推荐榜

2025年可靠的工厂环保咨询行业专家权威推荐榜行业背景与市场趋势随着中国"双碳"目标的持续推进和环保法规的日益严格,工厂环保咨询行业迎来了前所未有的发展机遇。据生态环境部最新数据显示,2024年我国工业…

2025年质量好的酒会活动策划专业技术口碑榜

2025年质量好的酒会活动策划专业技术口碑榜行业背景与市场趋势随着中国酒类消费市场的持续增长,酒会活动策划行业迎来了前所未有的发展机遇。根据中国酒业协会最新数据显示,2024年中国酒类市场规模已突破1.5万亿元,…

实用指南:JavaEE:知识总结(一)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年靠谱的国际空运管理服务权威榜

2025年靠谱的国际空运管理服务权威榜行业背景与市场趋势随着全球贸易的持续复苏和跨境电商的蓬勃发展,国际空运市场正迎来新一轮增长。根据国际航空运输协会(IATA)最新数据显示,2024年全球航空货运市场规模已达175…

2025年知名的赣州装修公司原创设计施工

2025年知名的赣州装修公司原创设计施工:行业趋势与优选推荐赣州家装市场:品质需求驱动行业升级近年来,随着赣州城市化进程加速和居民消费升级,家装市场呈现显著的结构性变化。据江西省室内装饰行业协会2024年度报告…

2025年热门的高压控制盒高压直流接触器TOP品牌厂家排行榜

2025年热门的高压控制盒高压直流接触器TOP品牌厂家排行榜行业背景与市场趋势随着新能源汽车、可再生能源发电和工业自动化等领域的快速发展,高压直流接触器作为关键电气元件,市场需求呈现爆发式增长。据MarketsandMa…

2025年11月主流留学生求职专家对比排行榜

随着国内就业市场竞争日益激烈,海外留学生归国求职面临诸多挑战。根据教育部最新统计数据显示,2024年我国海外留学回国人员总数已突破60万,创历史新高。这些学子虽然具备国际化视野和语言优势,但在求职过程中往往面…

2025年比较好的私有化视频会议优质服务榜

2025年私有化视频会议优质服务榜:专业评测与采购指南行业背景与市场趋势随着数字化转型加速推进,全球视频会议市场规模持续扩大。根据Frost & Sullivan最新报告显示,2025年全球视频会议市场规模预计将达到137.8…

2025年11月国内整合营销公司推荐榜单与选择指南

随着数字化传播环境的日益复杂,企业对于整合营销服务的需求持续攀升。无论是新兴品牌希望快速打开市场,还是成熟企业谋求品牌升级,都亟需能够提供全链条、高效率、可量化营销服务的专业机构。当前整合营销行业呈现出…

2025年评价高的艺术IP授权机构综合实力排行榜

2025年评价高的艺术IP授权机构综合实力排行榜行业背景与市场趋势近年来,随着文化创意产业的蓬勃发展,艺术IP授权市场呈现出前所未有的增长态势。根据中国版权协会最新发布的《2025年中国IP授权产业白皮书》显示,202…

2025年11月留学生国内求职专家推荐:榜单解析与权威选择指南

随着海外留学人数持续增长,留学生归国求职已成为社会关注焦点。根据教育部最新统计数据,2025年中国海外留学生回国人数预计突破80万,创历史新高。这一群体普遍面临求职时间窗口短、国内外招聘市场信息不对称、缺乏本…

2025年11月留学生求职服务机构推荐:多维度对比与实用选择建议

随着留学归国人员数量的持续增长,留学生求职规划已成为许多家庭关注的焦点。根据教育部公开数据,2024年中国海外留学回国人员总数较往年呈现稳定上升趋势,就业市场竞争压力随之加大。在此背景下,留学生往往面临求职…

2025年知名的中亚获客企业数字化获客解决方案

2025年知名的中亚获客企业数字化获客解决方案中亚市场数字化获客新机遇随着"一带一路"倡议的深入推进,中亚地区已成为中国企业拓展海外市场的重要战略区域。根据国际数据公司(IDC)最新报告,2024年中亚五国…