STM32的LED按键按下,LED灯1s间隔循环闪烁5次熄灭
时间: 2023-09-30 19:08:37 浏览: 130
以下是一个基本的实现,你可以根据自己的实际情况进行修改:
```c
#include "stm32f1xx_hal.h"
#define LED_Pin GPIO_PIN_13
#define LED_GPIO_Port GPIOC
#define KEY_Pin GPIO_PIN_0
#define KEY_GPIO_Port GPIOA
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOC_CLK_ENABLE(); // 启用 LED 灯引脚时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用按键引脚时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
int count = 0; // 计数器
while (1)
{
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) // 判断按键是否按下
{
HAL_Delay(10); // 延时去抖
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) // 再次判断按键是否按下
{
count = 0; // 计数器清零
while (count < 5)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // LED 灯翻转
HAL_Delay(1000); // 延时 1s
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // LED 灯翻转
HAL_Delay(1000); // 延时 1s
count++; // 计数器加 1
}
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); // 熄灭 LED 灯
}
}
}
}
```
以上代码在按下按键后,会等待 10ms 进行去抖处理,然后再判断一次按键是否按下。如果按键确实按下,则进行 LED 灯闪烁和计数,直到闪烁 5 次后将 LED 灯熄灭。如果按键没有按下,则程序会一直阻塞在等待按键按下的状态。
阅读全文