STM32按键控制流水灯代码
时间: 2024-09-11 21:12:10 浏览: 133
STM32单片机上的按键控制流水灯是一个常见的入门项目,通常涉及到中断处理、寄存器操作以及GPIO配置。下面是一个简单的示例代码片段,假设我们有一个按键K0和一个8个LED的流水灯:
```c
#include "stm32f1xx.h" // 引入STM32的头文件
// 定义GPIO口和LED
GPIO_TypeDef* GPIOx = GPIOA; // GPIOA用于接LED
uint16_t LED_Pin[] = {PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7}; // LED对应的GPIO引脚
// 按键定义
#define KEY_PIN PA8
#define KEY_PORT GPIOA
#define KEY_BITMASK (1 << 0) // 计算按键对应位
void led_toggle(uint16_t led_num) {
GPIOx->ODR ^= (1 << led_num); // 切换LED状态
}
void setup() {
// 初始化GPIO
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_Init(GPIOx, &GPIO_InitStructure); // 设置GPIO模式和推挽输出
// 配置按键中断
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = KEY_PIN; // 配置按键线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 异常模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 开启中断
EXTI_Init(&EXTI_InitStructure);
// 开始中断服务函数
NVIC_EnableIRQ(EXTI0_IRQn);
}
void EXTI0_IRQHandler() {
if (GPIO_ReadBit(KEY_PORT, KEY_BITMASK)) { // 检测到按键按下
led_toggle(LED_Pin[0]); // 控制第一个LED亮起
GPIO_SetBits(KEY_PORT, KEY_BITMASK); // 禁止再次触发中断,直到按键释放
}
}
int main(void) {
setup();
while (1) {}
}
```
阅读全文