用STM32控制三个按键控制led流水灯,呼吸灯,跑马灯三种状态
时间: 2023-07-02 16:05:20 浏览: 931
好的,以下是一个简单的程序,用于控制三个按键控制 LED 流水灯、呼吸灯和跑马灯三种状态。该程序基于 STM32F4xx 系列微控制器,使用标准外设库进行编写。
```c
#include "stm32f4xx.h"
#define LED1_PIN GPIO_Pin_12
#define LED2_PIN GPIO_Pin_13
#define LED3_PIN GPIO_Pin_14
#define LED4_PIN GPIO_Pin_15
void delay_ms(uint32_t ms)
{
for (volatile uint32_t i = 0; i < ms * 4000; i++);
}
void led_on(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIO_SetBits(GPIOx, GPIO_Pin);
}
void led_off(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIO_ResetBits(GPIOx, GPIO_Pin);
}
void led_toggle(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIO_ToggleBits(GPIOx, GPIO_Pin);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// Enable clocks for GPIOA and GPIOD
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD, ENABLE);
// Configure LED pins as outputs
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
// Configure button pins as inputs
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStruct);
uint8_t mode = 0; // 0 = Flowing, 1 = Breathing, 2 = Running
while (1)
{
// Handle button presses
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
{
mode = 0;
}
else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0)
{
mode = 1;
}
else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0)
{
mode = 2;
}
// Execute LED mode
switch (mode)
{
case 0: // Flowing
led_on(GPIOD, LED1_PIN);
delay_ms(100);
led_off(GPIOD, LED1_PIN);
led_on(GPIOD, LED2_PIN);
delay_ms(100);
led_off(GPIOD, LED2_PIN);
led_on(GPIOD, LED3_PIN);
delay_ms(100);
led_off(GPIOD, LED3_PIN);
led_on(GPIOD, LED4_PIN);
delay_ms(100);
led_off(GPIOD, LED4_PIN);
break;
case 1: // Breathing
for (int i = 0; i < 300; i++)
{
led_on(GPIOD, LED1_PIN);
delay_ms(i / 3);
led_off(GPIOD, LED1_PIN);
delay_ms((300 - i) / 3);
}
break;
case 2: // Running
led_on(GPIOD, LED1_PIN);
delay_ms(100);
led_off(GPIOD, LED1_PIN);
led_on(GPIOD, LED2_PIN);
delay_ms(100);
led_off(GPIOD, LED2_PIN);
led_on(GPIOD, LED3_PIN);
delay_ms(100);
led_off(GPIOD, LED3_PIN);
led_on(GPIOD, LED4_PIN);
delay_ms(100);
led_off(GPIOD, LED4_PIN);
led_on(GPIOD, LED3_PIN);
delay_ms(100);
led_off(GPIOD, LED3_PIN);
led_on(GPIOD, LED2_PIN);
delay_ms(100);
led_off(GPIOD, LED2_PIN);
break;
default:
break;
}
}
}
```
在上面的代码中,我们首先定义了四个 LED 的引脚,以及一个用于延时的函数。然后,我们初始化了 GPIOA 和 GPIOD 的时钟,并将 LED 引脚配置为输出,将按键引脚配置为输入。最后,我们使用一个 `while` 循环来处理按键输入和 LED 输出。
在程序中,我们使用了一个 `mode` 变量来跟踪当前的 LED 模式。当按下不同的按键时,我们将 `mode` 设置为不同的值,以切换 LED 模式。在 `while` 循环中,我们使用 `switch` 语句来执行不同的 LED 模式。在每个模式下,我们都使用 `led_on`、`led_off` 和 `delay_ms` 函数控制 LED 的亮灭和延时。
请注意,这只是一个简单的示例代码,您可以根据自己的需要进行修改。
阅读全文