HAL库:轮询方式按键检测实现 抬起执行、按下执行、长按短按检测、延时执行

2024-08-26 23:20

本文主要是介绍HAL库:轮询方式按键检测实现 抬起执行、按下执行、长按短按检测、延时执行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

注意事项

初始化部分:

按键检测部分:


HAL库:轮询方式按键检测实现 抬起执行、按下执行、长按短按检测、延时执行

注意事项

  • 按下执行一般与长按短按配合使用
  • 抬起执行一般与延时执行配合使用

初始化部分:

这里的按键为低电平有效。所以是上拉输入

void KEY_Init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();//开启GPIOB时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;GPIO_InitStructure.Pin = GPIO_PIN_0;GPIO_InitStructure.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);//配置为上拉输入
}

按键检测部分:

一、函数功能

  1. 用于检测按键状态。
  2. 通过参数mode来确定检测模式,0 为按下执行,1 为抬起执行。
  3. 返回值为 0 表示无按键触发,1 为按键 1 触发。

二、变量说明

  1. KEY1_State:静态变量,用于记录按键状态,1 表示松开,0 表示按下。

三、主要逻辑

  1. 首先判断按键是否按下:
    • 如果KEY1_IN为 0(低电平有效,即按键按下)且KEY1_State为 1(当前为松开状态),则进入按下判断流程。
    • 进行消抖处理,延迟 10 毫秒后再次判断KEY1_IN是否为 0,如果是,则将KEY1_State置为 0,表示按键已按下。
    • 如果此时mode为 0(按下执行模式),则立即返回 1,表示按键 1 触发。
  2. 接着判断按键是否抬起:
    • 如果KEY1_IN为 1(高电平,即按键抬起)且KEY1_State为 0(当前为按下状态),则进入抬起判断流程。
    • 进行消抖处理,延迟 1000 毫秒后再次判断KEY1_IN是否为 1,如果是,则将KEY1_State置为 1,表示按键已抬起。
    • 如果此时mode为 1(抬起执行模式),则立即返回 1,表示按键 1 触发。
  3. 如果以上条件都不满足,则返回 0,表示无按键触发。
*函 数 名:按键检测*参    数:mode 模式:0为按下执行,1抬起执行*返 回 值:0 为无按键触发;1为按键1触发*注意事项:按键低电平有效*/uint8_t KEY_Scan(uint8_t mode)
{static uint8_t KEY1_State = 1;  //按键状态变量。1为松开,0为按下if(KEY1_IN == 0 && KEY1_State)//判断按下{HAL_Delay(10);      //消抖if(KEY1_IN == 0)    //确实按下{KEY1_State = 0; //定义状态为已经按下if(mode == 0)    //如果模式为 按下触发{return 1;   //立刻返回1}}}else if(KEY1_IN == 1 && (!KEY1_State))//判断抬起{HAL_Delay(1000);      //消抖if(KEY1_IN == 1)    //确实抬起{KEY1_State = 1; //定义状态为已经抬起if(mode == 1)    //如果模式为 抬起触发{return 1;   //立刻返回1}}}return 0;
}
  1. 如何实现在 按下执行 时的,长按短按检测:修改第一个if(判断按下)中的Delay延时长度就可以实现长按短按检测。
  2. 如何实现在 抬起执行 时的,延时执行:修改第二个if(判断抬起)中的Dela延时长度就可以实现延时执行。

这篇关于HAL库:轮询方式按键检测实现 抬起执行、按下执行、长按短按检测、延时执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109970

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel