stm32按键处理长按按键,不调用中断的代码
时间: 2023-05-28 12:05:24 浏览: 104
以下是一个使用轮询方式实现长按按键处理的示例代码:
```c
#include "stm32f4xx.h"
#define BUTTON_PIN GPIO_PIN_0
#define BUTTON_PORT GPIOA
#define LONG_PRESS_DELAY 5000 // 5000毫秒为长按时间
uint32_t button_press_time; // 记录按键按下的时间
void init_button(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
}
int is_button_pressed(void)
{
return HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET;
}
int is_button_long_pressed(void)
{
return HAL_GetTick() - button_press_time >= LONG_PRESS_DELAY;
}
void handle_button_press(void)
{
// 处理按键按下事件
}
void handle_button_release(void)
{
// 处理按键释放事件
if (is_button_long_pressed()) {
// 处理长按事件
} else {
// 处理短按事件
}
}
int main(void)
{
HAL_Init();
init_button();
while (1) {
if (is_button_pressed()) {
button_press_time = HAL_GetTick(); // 记录按下时间
handle_button_press();
while (is_button_pressed()) {}
handle_button_release();
}
}
}
```
在主循环中,我们不断轮询按键是否按下,如果按下则记录按下时间,并处理按下事件。然后等待按键释放,处理释放事件,并判断按键是否长按。如果长按,则处理长按事件,否则处理短按事件。在此过程中,没有使用中断处理按键事件。
阅读全文