stm32按键中断分别控制多个led灯代码
时间: 2023-09-17 15:13:02 浏览: 440
以下是一个示例代码,演示了如何使用 STM32 的按键中断控制多个 LED 灯。
```
#include "stm32f10x.h"
// 定义 LED 灯的 GPIO 引脚
#define LED1_PIN GPIO_Pin_8
#define LED2_PIN GPIO_Pin_9
#define LED3_PIN GPIO_Pin_10
// 定义按键的 GPIO 引脚
#define KEY_PIN GPIO_Pin_0
// 定义按键状态变量
volatile uint8_t key_pressed = 0;
// 初始化 LED 灯和按键的 GPIO 引脚
void init_gpio(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 GPIOA 和 AFIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// 配置 LED1、LED2、LED3 为推挽输出模式
GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 KEY 为上拉输入模式,并启用中断
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 EXTI0 中断线和 NVIC 中断向量
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
NVIC_EnableIRQ(EXTI0_IRQn);
}
// 处理按键中断
void EXTI0_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
// 设置按键状态变量
key_pressed = 1;
}
}
int main(void) {
// 初始化 GPIO 引脚
init_gpio();
while (1) {
// 判断按键是否被按下
if (key_pressed) {
// 清除按键状态变量
key_pressed = 0;
// 切换 LED 灯的状态
GPIO_WriteBit(GPIOA, LED1_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, LED1_PIN)));
GPIO_WriteBit(GPIOA, LED2_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, LED2_PIN)));
GPIO_WriteBit(GPIOA, LED3_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, LED3_PIN)));
}
}
}
```
在上面的代码中,我们使用了 `init_gpio()` 函数来初始化 LED 灯和按键的 GPIO 引脚。在 `EXTI0_IRQHandler()` 函数中,我们检测到按键中断,并设置了一个按键状态变量 `key_pressed`。在主循环中,我们不断检测 `key_pressed` 变量的值,如果为真,则表示按键被按下,我们就切换 LED 灯的状态。
请注意,`EXTI0_IRQHandler()` 函数中的中断清除和中断标志位的检查都是必须的,否则会导致不可预知的行为。另外,如果需要同时检测多个按键,可以使用多个 EXTI 中断线和对应的中断处理函数来实现。
阅读全文