stm32cube按键改变流水灯的效果
时间: 2023-10-09 11:06:48 浏览: 76
以下是基本的代码实现:
```c
#include "stm32f4xx_hal.h"
/* 定义按键GPIO的端口和引脚 */
#define BUTTON_GPIO_PORT GPIOA
#define BUTTON_GPIO_PIN GPIO_PIN_0
/* 定义LED灯GPIO的端口和引脚 */
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_PIN GPIO_PIN_0
/* 定义流水灯的模式,共3种 */
#define MODE1 1
#define MODE2 2
#define MODE3 3
/* 定义按键状态和流水灯模式 */
uint8_t button_status = 0; // 按键状态
uint8_t led_mode = MODE1; // 流水灯模式
/* 定义延时函数 */
void delay(uint32_t ms)
{
HAL_Delay(ms);
}
int main(void)
{
/* 初始化HAL库 */
HAL_Init();
/* 初始化GPIO */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/* 配置按键GPIO的输入模式 */
GPIO_InitStruct.Pin = BUTTON_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStruct);
/* 配置LED灯GPIO的输出模式 */
GPIO_InitStruct.Pin = LED_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
/* 循环执行按键和流水灯的控制 */
while (1)
{
/* 读取按键状态 */
button_status = HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_GPIO_PIN);
/* 根据按键状态改变流水灯模式 */
if (button_status == GPIO_PIN_RESET)
{
/* 切换流水灯模式 */
led_mode++;
if (led_mode > MODE3)
{
led_mode = MODE1;
}
/* 延时一段时间,避免按键抖动 */
delay(100);
}
/* 根据流水灯模式控制LED灯 */
switch (led_mode)
{
case MODE1:
/* 流水灯模式1:从左往右 */
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_SET);
delay(100);
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_RESET);
delay(100);
break;
case MODE2:
/* 流水灯模式2:从右往左 */
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_SET);
delay(100);
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_PIN, GPIO_PIN_RESET);
delay(100);
break;
case MODE3:
/* 流水灯模式3:交替闪烁 */
HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);
delay(100);
break;
default:
break;
}
}
}
```
以上代码实现了按键切换流水灯的模式,共实现了3种模式:从左往右、从右往左、交替闪烁。其中,延时函数可以使用HAL库提供的延时函数,也可以自己实现一个延时函数。
需要注意的是,如果按键接线存在抖动问题,需要在切换流水灯模式前添加一段延时,避免按键抖动导致流水灯模式频繁切换。