STM32爱心流水灯代码
时间: 2023-10-05 18:04:35 浏览: 61
以下是一个基于STM32的爱心流水灯的代码,使用STM32CubeIDE编写:
```c
#include "main.h"
#include "stm32f1xx_hal.h"
/* 定义GPIO口 */
#define LED1_Pin GPIO_PIN_0
#define LED1_GPIO_Port GPIOB
#define LED2_Pin GPIO_PIN_1
#define LED2_GPIO_Port GPIOB
#define LED3_Pin GPIO_PIN_10
#define LED3_GPIO_Port GPIOB
#define LED4_Pin GPIO_PIN_11
#define LED4_GPIO_Port GPIOB
#define LED5_Pin GPIO_PIN_12
#define LED5_GPIO_Port GPIOB
#define LED6_Pin GPIO_PIN_13
#define LED6_GPIO_Port GPIOB
#define LED7_Pin GPIO_PIN_14
#define LED7_GPIO_Port GPIOB
#define LED8_Pin GPIO_PIN_15
#define LED8_GPIO_Port GPIOB
/* 定义爱心图案 */
uint16_t heart[16] = {0x003C, 0x7E7E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7E7E, 0x3C3C, 0x1818, 0x0C0C, 0x0606, 0x0303, 0x0303, 0x0606, 0x0C0C, 0x1818};
/* 定义流水灯的延时时间 */
uint32_t delay_time = 100;
/* 定义流水灯的状态 */
uint8_t light_status = 0;
/* 定义流水灯当前亮的灯的编号 */
uint8_t light_num = 0;
/* 定义流水灯当前亮的灯的亮度值 */
uint16_t light_value = 0x0000;
/* 定义函数 */
void set_led(uint16_t led_value); // 设置LED灯亮度
void delay(uint32_t time); // 延时函数
int main(void)
{
/* MCU初始化 */
HAL_Init();
/* 时钟初始化 */
SystemClock_Config();
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* 无限循环 */
while (1)
{
if(light_status == 0) // 灯暗状态
{
set_led(0x0000); // 关闭所有灯
delay(500); // 延时
light_status = 1; // 灯亮状态
}
else if(light_status == 1) // 灯亮状态
{
set_led(light_value); // 设置当前亮的灯的亮度
delay(delay_time); // 延时
light_value += 0x0001; // 亮度值加一
if(light_value >= 0x1000) // 亮度值达到最大值
{
light_value = 0x0000; // 重置亮度值
light_num++; // 当前亮的灯的编号加一
if(light_num >= 8) // 当前亮的灯的编号达到最大值
{
light_num = 0; // 重置当前亮的灯的编号
light_status = 0; // 重置灯的状态
}
}
}
}
}
/* 设置LED灯亮度 */
void set_led(uint16_t led_value)
{
uint8_t i;
for(i=0;i<16;i++) // 逐位设置所有灯的亮度
{
if(heart[i] & 0x8000) HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x4000) HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x2000) HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x1000) HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x0800) HAL_GPIO_WritePin(LED5_GPIO_Port, LED5_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED5_GPIO_Port, LED5_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x0400) HAL_GPIO_WritePin(LED6_GPIO_Port, LED6_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED6_GPIO_Port, LED6_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x0200) HAL_GPIO_WritePin(LED7_GPIO_Port, LED7_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED7_GPIO_Port, LED7_Pin, GPIO_PIN_RESET);
if(heart[i] & 0x0100) HAL_GPIO_WritePin(LED8_GPIO_Port, LED8_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(LED8_GPIO_Port, LED8_Pin, GPIO_PIN_RESET);
delay(1); // 延时
}
}
/* 延时函数 */
void delay(uint32_t time)
{
HAL_Delay(time);
}
```
该代码实现了一个爱心流水灯效果,使用了一个存储爱心图案的数组,通过逐位设置GPIO口的电平来控制LED灯的亮度。通过改变延时时间和亮度值的增量可以调节流水灯的速度和亮度。