本文主要是介绍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);//配置为上拉输入
}
按键检测部分:
一、函数功能
- 用于检测按键状态。
- 通过参数
mode
来确定检测模式,0 为按下执行,1 为抬起执行。 - 返回值为 0 表示无按键触发,1 为按键 1 触发。
二、变量说明
KEY1_State
:静态变量,用于记录按键状态,1 表示松开,0 表示按下。
三、主要逻辑
- 首先判断按键是否按下:
- 如果
KEY1_IN
为 0(低电平有效,即按键按下)且KEY1_State
为 1(当前为松开状态),则进入按下判断流程。 - 进行消抖处理,延迟 10 毫秒后再次判断
KEY1_IN
是否为 0,如果是,则将KEY1_State
置为 0,表示按键已按下。 - 如果此时
mode
为 0(按下执行模式),则立即返回 1,表示按键 1 触发。
- 如果
- 接着判断按键是否抬起:
- 如果
KEY1_IN
为 1(高电平,即按键抬起)且KEY1_State
为 0(当前为按下状态),则进入抬起判断流程。 - 进行消抖处理,延迟 1000 毫秒后再次判断
KEY1_IN
是否为 1,如果是,则将KEY1_State
置为 1,表示按键已抬起。 - 如果此时
mode
为 1(抬起执行模式),则立即返回 1,表示按键 1 触发。
- 如果
- 如果以上条件都不满足,则返回 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;
}
- 如何实现在 按下执行 时的,长按短按检测:修改第一个if(判断按下)中的Delay延时长度就可以实现长按短按检测。
- 如何实现在 抬起执行 时的,延时执行:修改第二个if(判断抬起)中的Dela延时长度就可以实现延时执行。
这篇关于HAL库:轮询方式按键检测实现 抬起执行、按下执行、长按短按检测、延时执行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!