系列文章目录
文章目录
目录
前言
本文按键检测采用逻辑消抖法,后面有时间会更新状态机写法
一、工程创建
基础配置本文就不再次赘述,基础配置可以查看LED模块文章
查阅产品手册,按键用到的IO口为PB0、PB1、PB2、PA0,分别对应KEY1、KEY2、KEY3、KEY4,又注意到原理图上带有上拉电阻,所以在配置IO口输入模式时,既可以配置内部上拉也可以不进行配置
生成工程
二、代码编写
打开keil后,依旧是需要先修改debug等相关配置
1.按键扫描函数
此函数消抖主要靠三行逻辑判断,核心是通过轮询检测按键状态,再通过逻辑运算使得只有在按下和抬起时标志位的变成相应的值,其余时候为0
uint8_t key_temp,key_down,key_up,key_old;
void key_scan(void)
{
//对应按键按下,key_temp赋相应的值
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
{
key_temp = 1;
}
else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
{
key_temp = 2;
}
else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET)
{
key_temp = 3;
}
else if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET)
{
key_temp = 4;
}
else
{
key_temp = 0;
}
//三行逻辑消抖
key_down = key_temp & (key_temp ^ key_old);
key_up = ~key_temp & (key_temp ^ key_old);
key_old = key_temp;
}
2.按键的应用以及长按逻辑的实现
HAL_GetTick()这个函数可以获取系统当前的运行时间,其单位是ms,sysTick是系统滴答定时器,HAL库在初始化时,通过相应配置使得你用CubeMX生成工程时,sysTick的中断周期都是1ms,所以这个时间是ms为单位
长按的逻辑就是在按下时获取一次系统运行时间,在抬起时再获取一次,两次时间相减则为按键按下的时长,再执行相应逻辑,此工程仅用KEY1作为演示
uint32_t key_press_time[2] = {0,0};
void key_text(void)
{
key_scan();
//长按逻辑实现
//按键1按下
if(key_down == 1)
{
key_press_time[0] = HAL_GetTick();
}
switch(key_up)
{
case 1:
key_press_time[1] = HAL_GetTick();
//长按1s以上,LED1熄灭
if(key_press_time[1] - key_press_time[0] > 1000)
{
LED_Display(LED1_Pin,1);
}
//短按LED1点亮
else
{
LED_Display(LED1_Pin,0);
}
break;
}
}
3.现象
KEY