stm32f4一个按键控制8个流水灯变换
时间: 2023-10-22 16:09:51 浏览: 139
单个按键控制多种流水灯状态
可以使用GPIO模块来控制按键和流水灯。首先需要配置GPIO为输入模式,然后轮询读取按键状态,如果检测到按键按下,则让流水灯进行变换。
以下是一个简单的代码实现:
```c
#include "stm32f4xx.h"
#define LED_GPIO_PORT GPIOD
#define LED_GPIO_PIN_0 GPIO_Pin_12
#define LED_GPIO_PIN_1 GPIO_Pin_13
#define LED_GPIO_PIN_2 GPIO_Pin_14
#define LED_GPIO_PIN_3 GPIO_Pin_15
#define BUTTON_GPIO_PORT GPIOA
#define BUTTON_GPIO_PIN GPIO_Pin_0
void Delay(__IO uint32_t nCount);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
uint32_t led_state = 0;
// 初始化GPIO时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 配置LED引脚为输出模式
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN_0 | LED_GPIO_PIN_1 | LED_GPIO_PIN_2 | LED_GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
// 配置按键引脚为输入模式
GPIO_InitStructure.GPIO_Pin = BUTTON_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStructure);
while (1)
{
// 检测按键状态
if (GPIO_ReadInputDataBit(BUTTON_GPIO_PORT, BUTTON_GPIO_PIN) == Bit_SET)
{
// 按键按下,改变LED状态
led_state = (led_state + 1) % 8;
// 控制LED流水灯
switch (led_state)
{
case 0:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_0);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_1 | LED_GPIO_PIN_2 | LED_GPIO_PIN_3);
break;
case 1:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_1);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_2 | LED_GPIO_PIN_3);
break;
case 2:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_2);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_1 | LED_GPIO_PIN_3);
break;
case 3:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_3);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_1 | LED_GPIO_PIN_2);
break;
case 4:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_1);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_2 | LED_GPIO_PIN_3);
break;
case 5:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_2 | LED_GPIO_PIN_3);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_1);
break;
case 6:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_2);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_1 | LED_GPIO_PIN_3);
break;
case 7:
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN_1 | LED_GPIO_PIN_3);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN_0 | LED_GPIO_PIN_2);
break;
}
}
// 延时
Delay(1000000);
}
}
void Delay(__IO uint32_t nCount)
{
while (nCount--)
{
}
}
```
在这个代码中,我们使用了GPIO模块来控制LED流水灯和按键。首先,我们需要初始化GPIO时钟,并将LED引脚配置为输出模式,按键引脚配置为输入模式。在主循环中,我们轮询读取按键状态,如果检测到按键按下,则改变LED流水灯的状态。具体来说,我们通过一个变量来记录LED的状态,并使用switch语句来控制LED引脚的电平。最后,我们添加了一个简单的延时函数以减缓LED变换的速度。
需要注意的是,由于本代码使用的是轮询方式读取按键状态,因此需要添加适当的去抖动措施以避免误触发。另外,如需加入更多的功能,需要对代码进行相应的修改。
阅读全文