stm32f103r6按键流水灯
时间: 2025-06-01 12:06:14 浏览: 43
### 实现基于STM32F103R6的按键控制流水灯功能
以下是一个完整的实现方案,包括硬件配置和软件代码设计。通过按键控制LED流水灯的点亮与熄灭,使用STM32F103R6作为核心控制器。
#### 硬件设计
在Proteus中设计一个包含STM32F103R6最小系统板和8个LED灯的电路图。同时,添加一个按键(如K1),用于触发流水灯的运行或停止。确保GPIO引脚分配合理,例如:
- LED连接到PA0~PA7。
- 按键连接到PB0。
#### 软件设计
以下是基于STM32F103R6的按键控制流水灯示例代码:
```c
#include "stm32f10x.h"
// 定义LED端口
#define LED_PORT GPIOA
#define LED_PIN(x) (1 << (x))
// 定义按键端口
#define KEY_PORT GPIOB
#define KEY_PIN GPIO_Pin_0
// 初始化LED
void LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0~PA7为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大速度50MHz
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
// 初始化按键
void KEY_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置PB0为浮空输入模式
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}
// 主函数
int main(void) {
uint8_t led_index = 0; // 当前点亮的LED索引
// 初始化LED和按键
LED_Init();
KEY_Init();
while (1) {
// 检测按键是否按下
if (KEY_PORT->IDR & KEY_PIN) { // 按键未按下
// 停止流水灯效果
GPIO_ResetBits(LED_PORT, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
} else { // 按键按下
// 流水灯效果
GPIO_ResetBits(LED_PORT, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); // 先熄灭所有LED
GPIO_SetBits(LED_PORT, LED_PIN(led_index)); // 点亮当前LED
led_index++; // 移动到下一个LED
if (led_index > 7) {
led_index = 0; // 循环回到第一个LED
}
for (volatile int i = 0; i < 100000; i++); // 延时
}
}
}
```
#### 代码说明
1. **LED初始化**:将GPIOA的引脚PA0~PA7配置为推挽输出模式,最大速度设置为50MHz[^1]。
2. **按键初始化**:将GPIOB的引脚PB0配置为浮空输入模式,用于检测按键状态[^2]。
3. **主循环逻辑**:
- 如果按键未按下,则所有LED熄灭。
- 如果按键按下,则依次点亮LED,形成流水灯效果,并通过延时函数控制每盏灯的点亮时间[^3]。
#### 注意事项
- 在实际应用中,建议增加去抖处理以避免按键误触。
- 可根据需求调整LED的数量或流水灯的速度。
阅读全文
相关推荐


















