stm32f103按键控制led灯亮延时
时间: 2025-03-05 11:10:13 浏览: 37
### STM32F103 按键控制 LED 灯亮并加入延时功能
在STM32F103单片机上实现按键控制LED灯亮灭的功能,可以通过配置GPIO端口来完成。具体来说,可以设置一个GPIO作为输入用于检测按键状态,另一个GPIO作为输出用于驱动LED。为了实现延时效果,通常会使用软件延时函数。
#### GPIO初始化
首先,在程序启动阶段需要对涉及的GPIO进行初始化操作[^1]:
对于按键连接的引脚(假设为PA0),应将其配置成浮空输入模式;而对于LED连接的引脚(比如PC13),则需设定为推挽输出方式。
```c
// 初始化按键对应的IO口 PA0
void Key_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 初始化LED对应的IO口 PC13
void Led_GPIO_Config(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
}
```
#### 实现按键扫描与LED响应逻辑
接下来编写主循环中的处理流程,这里包含了读取按键状态以及根据其变化切换LED的状态,并加入了简单的去抖动机制和必要的延时以观察到明显的灯光改变:
```c
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
SystemClock_Config();
Key_GPIO_Config(); // 配置按键使用的IO
Led_GPIO_Config(); // 配置LED使用的IO
uint8_t key_state_old=0,key_state_new=0;
while (1)
{
key_state_new = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
if(key_state_new != key_state_old && key_state_new==RESET){
HAL_Delay(50); // 去抖动延迟
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==key_state_new){
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换LED状态
HAL_Delay(500); // 加入适当的时间间隔让视觉上有明显的变化
}
key_state_old=key_state_new;
}else{
key_state_old=key_state_new;
}
HAL_Delay(10); // 减少CPU占用率
}
}
```
上述代码展示了如何利用STM32CubeMX生成的基础框架配合标准外设库APIs快速搭建起基于STM32F103系列MCU的应用场景——即通过外部按钮触发使能板载红色指示灯闪烁的效果。
阅读全文
相关推荐


















