stm32。按键按下释放后,LED1--LED8依次点亮。再次按键按下释放后LED8---LED1依次熄灭的代码
时间: 2024-10-24 08:02:55 浏览: 31
在STM32微控制器上实现这样的功能,通常需要使用GPIO外设以及中断机制来检测按键输入,并配合定时器或延时函数控制LED的点亮和熄灭顺序。以下是一个简单的示例代码,假设我们使用的是Keypad矩阵来模拟8个按键,STM32F103系列并使用STM32CubeMX配置了GPIO和中断。
```c
#include "stm32f1xx_hal.h"
// LED宏定义
#define LEDn(n) GPIO_PIN_##n
#define ALL_LEDS (LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8)
// 按键矩阵宏定义
#define KEY_BUTTON(n) EXTI_LINE_##n
// 初始化GPIO
void led_init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = ALL_LEDS;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
// 中断处理函数
void button_isr(uint16_t line) {
static int led_index = 0;
if (led_index < 8) {
// 点亮当前LED
HAL_GPIO_WritePin(GPIOB, LEDn(led_index), GPIO_PIN_SET);
// 如果不是最后一个LED,增加索引并切换到下一个LED
if (led_index != 7) {
led_index++;
} else {
// 如果到了最后一个,重置索引并开始从最后一盏灯往回熄灭
led_index = 0;
}
} else {
// 如果已经熄灭到第一个LED,关闭所有LED
HAL_GPIO_WritePin(GPIOB, ALL_LEDS, GPIO_PIN_RESET);
}
// 更新中断触发条件
EXTI_ClearITPendingBit(KEY_BUTTON(line));
}
int main(void) {
led_init();
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 假设KEYBUTTON1对应EXTI线0
while (1) {
// 主循环中等待中断触发
// 实际项目中,可以替换为其他任务,这里为了简化示例省略
}
}
// EXTI中断服务例程
void EXTI0_IRQHandler() {
uint16_t line = EXTI_GetLine Rising沿状态(); // 根据实际按键矩阵修改
if (line == KEY_BUTTON(0)) { // 示例中假设第一行第一列是触发按键
button_isr(line);
}
// 其他按键对应的中断处理类似...
}
```
阅读全文