stm32按下key1,使led灯依次亮灭(按第一次,第一二个灯亮,按第2次,第一二个灭,第三四个亮,按第三次,第三四个灭第五一个亮)的代码
时间: 2024-10-28 15:06:59 浏览: 7
在STM32微控制器上实现这样的功能,通常会使用GPIO端口控制LED灯,并配合中断或者按键扫描来完成灯的切换。这里是一个基本的示例代码,假设我们有五个LED连接到PA0~PA4,按键KEY1连接到PC0,我们使用Keil MDK编写的STM32Cube库:
```c
#include "stm32f1xx.h"
#include "stm32f1xx_gpio.h"
#define KEY_PIN PC0
#define LED_PINS {PA0, PA1, PA2, PA3, PA4}
// 初始化GPIO
void init_GPIO(void) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_OUTPUT);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_OUTPUT);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_OUTPUT);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_OUTPUT);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_OUTPUT);
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED_PINS[0];
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 其他LED初始化...
}
// 按键回调函数
void Key EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == KEY_PIN) {
static uint8_t led_index = 0;
for (uint8_t i = 0; i < sizeof(LED_PINS) / sizeof(LED_PINS[0]); ++i) {
GPIO_ToggleBits(GPIOA, LED_PINS[(led_index + i) % 5]);
}
led_index++;
if (led_index >= 5) {
led_index = 0; // 如果已经轮完一圈,从头开始
}
}
}
int main(void) {
// 初始化系统
HAL_Init();
SystemClock_Config();
// 初始化GPIO
init_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;
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1) {}
}
// EXTI中断服务函数
void EXTI0_IRQHandler(void) {
Key EXTI_Callback(KEY_PIN);
HAL_GPIO_EXTI_IRQHandler(KEY_PIN);
}
```
阅读全文