如何用keil设计代码完成功能

用STM32设计LED灯花色系统,要求完成以下内容:
1.使8个led灯以流水灯的形式进行闪烁(每个LED灯亮100ms后熄灭并使下一个LED灯点亮
2.通过key1改变led灯花型,要求至少设计3种花型(含要求1中花型)
3.通过key2强制复位当前花型为要求1中花型
4.每次按键切换花型后,通过串口助手每隔500ms输出当前花型内容

GPIO:在对应的引脚上设置为输出模式。
TIM3:设置定时器周期为100毫秒。
程序可以使用CubeMX和STM32的官方IDE来编写和上传。如果有问题需要手动修改的话,需要自行查阅相关硬件资料和库函数文档


#include "main.h"
#include "stdio.h"
#include "string.h"

// 定义LED显示模式
#define MODE_1 0x01  // 流水灯
#define MODE_2 0x02  // 花型2
#define MODE_3 0x03  // 花型3

// 定义LED引脚
#define LED_0_Pin GPIO_PIN_0
#define LED_1_Pin GPIO_PIN_1
#define LED_2_Pin GPIO_PIN_2
#define LED_3_Pin GPIO_PIN_3
#define LED_4_Pin GPIO_PIN_4
#define LED_5_Pin GPIO_PIN_5
#define LED_6_Pin GPIO_PIN_6
#define LED_7_Pin GPIO_PIN_7
#define LED_GPIO_Port GPIOB

// 定义按键引脚
#define KEY1_Pin GPIO_PIN_10
#define KEY1_GPIO_Port GPIOA
#define KEY2_Pin GPIO_PIN_3
#define KEY2_GPIO_Port GPIOB

// 定义花型状态和输出的花型名字
uint8_t mode = MODE_1;
char mode_name[10] = "MODE_1";

// 定义内部计数器
uint16_t timer_counter = 0;

// 定义串口输出
UART_HandleTypeDef huart2;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM3_Init(void);

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM3_Init();
  
  HAL_TIM_Base_Start_IT(&htim3);

  while (1)
  {
    // 监听按键1,改变LED灯花型
    if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)
    {
      HAL_Delay(50);

      if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET)
      {
        // 改变花型状态,重新设置输出名字
        mode++;
        if (mode >= 4)
        {
          mode = MODE_1;
        }

        switch (mode)
        {
        case MODE_1:
          strcpy(mode_name, "MODE_1");
          break;
        case MODE_2:
          strcpy(mode_name, "MODE_2");
          break;
        case MODE_3:
          strcpy(mode_name, "MODE_3");
          break;
        }
      }
    }

    // 监听按键2,强制复位花型
    if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)
    {
      HAL_Delay(50);

      if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)
      {
        mode = MODE_1;
        strcpy(mode_name, "MODE_1");
      }
    }
  }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM3)
  {
    timer_counter++;

    if (timer_counter >= 1)
    {
      timer_counter = 0;

      // 根据当前花型状态输出对应的LED显示模式
      switch (mode)
      {
      case MODE_1:
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_0_Pin);
        break;
      case MODE_2:
        // 花型2的实现
        break;
      case MODE_3:
        // 花型3的实现
        break;
      }
    }

    // 串口打印当前花型内容
    if (timer_counter % 500 == 0)
    {
      char output[50];
      sprintf(output, "Current mode: %s\n", mode_name);
      HAL_UART_Transmit(&huart2, (uint8_t *)output, strlen(output), 100);
    }
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 72;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 3;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 719;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 100;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_0_Pin | LED_1_Pin | LED_2_Pin | LED_3_Pin |
                                      LED_4_Pin | LED_5_Pin | LED_6_Pin | LED_7_Pin,
                    GPIO_PIN_RESET);

  /*Configure GPIO pins : BUTTON_1_Pin BUTTON_2_Pin */
  GPIO_InitStruct.Pin = KEY1_Pin | KEY2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : LED_0_Pin LED_1_Pin LED_2_Pin LED_3_Pin
                           LED_4_Pin LED_5_Pin LED_6_Pin LED_7_Pin */
  GPIO_InitStruct.Pin = LED_0_Pin | LED_1_Pin | LED_2_Pin | LED_3_Pin |
                         LED_4_Pin | LED_5_Pin | LED_6_Pin | LED_7_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
}

static void MX_USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
}

void Error_Handler(void)
{
}

在STM32F103C8T6单片机上运行,主要功能是控制8个LED灯,支持三种花型模式(流水灯、交替闪烁、呼吸灯),支持通过USART2串口接收命令控制LED灯和花型模式,支持通过外部中断PA0和PA1控制LED灯和切换花型模式:

#include "stm32f10x.h"
#include "stdio.h"

#define LED_NUM 8

GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

uint16_t led_state = 0; // 保存当前LED灯状态
uint16_t led_pattern = 0; // 保存当前LED花型
uint32_t last_pattern_change_time = 0; // 记录上一次花型改变时间
uint8_t pattern_count = 3; // 花型数量
char* patterns[] = {"流水灯", "交替闪烁", "呼吸灯"}; // 花型名称
uint8_t pattern_index = 0; // 当前花型索引

void GPIO_Configuration(void)
{
  // 使能GPIOC时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  // 配置PC0~PC7引脚为输出模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  // 使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  // 配置PA0和PA1引脚为输入模式(上拉输入)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void USART_Configuration(void)
{
  // 使能USART2时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  // 配置USART2引脚
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 配置USART2参数
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, &USART_InitStructure);

  // 使能USART2
  USART_Cmd(USART2, ENABLE);
}

void NVIC_Configuration(void)
{
  // 配置NVIC中断优先级组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  // 配置EXTI1中断
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  // 配置EXTI0中断
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  // 配置USART2中断
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void EXTI_Configuration(void)
{
  // 使能AFIO时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  // 配置PA0和PA1为外部中断模式下拉输入
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 配置EXTI0中断
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  // 配置EXTI1中断
  EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

int main(void)
{
  GPIO_Configuration();
  USART_Configuration();
  NVIC_Configuration();
  EXTI_Configuration();

  // 主循环
  while (1) {
    // 更新LED灯状态
    uint16_t led_value = 0;
    for (int i = 0; i < LED_NUM; i++) {
      if (led_state & (1 << i)) {
        led_value |= 1 << i;
      }
    }
    GPIO_Write(GPIOC, led_value);

    // 检测是否需要改变花型
    if (HAL_GetTick() - last_pattern_change_time > 5000) {
      pattern_index = (pattern_index + 1) % pattern_count;
      printf("当前花型:%s\n", patterns[pattern_index]);
      last_pattern_change_time = HAL_GetTick();
    }
  }
}

中花型?什么意思?

 STM32 的嵌入式系统题目。下面是方案:
1. 闪烁流水灯:
这里使用的是 STM32 的 HAL 库和定时器(TIM)模块实现的。我们需要配置 TIM 硬件定时器,使其每隔 100ms 产生中断并切换灯的状态。具体实现代码如下:

```c
#include "stm32f1xx_hal.h"

int main(void)
{
  /* 使能时钟 */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* 配置GPIO */
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* 配置TIMER */
  TIM_HandleTypeDef htim;
  TIM_OC_InitTypeDef sConfig;
  
  htim.Instance = TIM2;
  htim.Init.Prescaler = 7200-1; // 72MHz / 7200 = 10kHz
  htim.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim.Init.Period = 100-1; // 10kHz / 100 = 100Hz
  htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  HAL_TIM_Base_Init(&htim);
  HAL_TIM_Base_Start_IT(&htim);

  /* 进入循环 */
  while (1)
  {

  }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static uint8_t led_idx = 0;

    /* 关闭上一个灯 */
    HAL_GPIO_WritePin(GPIOA, 1 << ((led_idx + 7) % 8), GPIO_PIN_RESET);
    /* 点亮下一个灯 */
    HAL_GPIO_WritePin(GPIOA, 1 << led_idx, GPIO_PIN_SET);

    /* 选择下一个灯 */
    led_idx = (led_idx + 1) % 8;
}
  1. 切换 LED 花型:

当按下 KEY1 时,我们需要更改 LED 的流水灯模式(即更改灯的顺序点亮)。这里我们设置了三种模式,可以通过按下 KEY1 切换。代码实现如下:

/* 定义 LED 花型,0 表示关闭,1 表示点亮 */
uint8_t led_pattern[3][8] = {
    {1, 0, 0, 0, 0, 0, 0, 0}, // 原始流水灯模式
    {1, 1, 0, 0, 0, 0, 0, 1}, // 自定义模式 1
    {1, 1, 1, 0, 0, 0, 1, 1}, // 自定义模式 2
};
int pattern_idx = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* 来自 KEY1 的中断事件 */
    if (GPIO_Pin == GPIO_PIN_0)
    {
        /* 切换 LED 花型 */
        pattern_idx++;
        if (pattern_idx >= 3) {
            pattern_idx = 0;
        }

        /* 按钮按下并立即释放,有效防止抖动 */
        HAL_Delay(100);
        while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET);
    }
}
  1. 强制复位 LED 花型:

当按下 KEY2 时,我们需要强制重新设置 LED 的花型为原始的流水灯模式。代码实现如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    /* 来自 KEY2 的中断事件 */
    if (GPIO_Pin == GPIO_PIN_1)
    {
        /* 强制初始化 LED 花型为原始流水灯模式 */
        pattern_idx = 0;

        /* 按钮按下并立即释放,有效防止抖动 */
        HAL_Delay(100);
        while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET);
    }
}
4. 通过串口输出当前 LEd,花型内容,在主函数中开启串口通信,并在按下 KEY1 后将当前 LED 花型信息通过串口输出。这里借助了 HAL 库的 USART 库函数。代码实现如下:

UART_HandleTypeDef huart;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

int main(void)
{
  /* MCU 启动代码 */
  HAL_Init();
  SystemClock_Config();

  /* 使能时钟 */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* 配置 GPIO 和 TIMER */
  MX_GPIO_Init();
  MX_TIM2_Init();

  /* 配置串口 */
  MX_USART1_UART_Init();

  /* 进入循环 */
  while (1)
  {
    /* 每隔 500ms 输出 LED 花型信息 */
    HAL_Delay(500);

    char buf[128];
    snprintf(buf, sizeof(buf), "Current pattern: %d\r\n", pattern_idx);
    HAL_UART_Transmit(&huart, (uint8_t*) buf, strlen(buf), HAL_MAX_DELAY);
  }
}

void MX_USART1_UART_Init(void)
{
  huart.Instance = USART1;
  huart.Init.BaudRate = 9600;
  huart.Init.WordLength = UART_WORDLENGTH_8B;
  huart.Init.StopBits = UART_STOPBITS_1;
  huart.Init.Parity = UART_PARITY_NONE;
  huart.Init.Mode = UART_MODE_TX_RX;
  huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart) != HAL_OK)
  {
    /* 错误处理方式 */
    while (1);
  }
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(uartHandle->Instance==USART1)
  {
    /* 使能时钟 */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
  if(uartHandle->Instance==USART1)
  {
    /* 关闭时钟 */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
  }
}

这是一个简单实现 LED 灯闪烁和花型切换的系统。

简单点亮led流水灯c语言程序,keil软件用单片机控制8个LED流水灯来回点亮

#include "reg51.h"

main()

{

unsigned int i,j;

while(1)

{

P1=0xfe;               //点亮第一个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xfd;               //点亮第二个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xfb;               //点亮第三个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xf7;               //点亮第四个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xef;               //点亮第五个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xdf;               //点亮第六个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0xbf;               //点亮第七个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

P1=0x7f;              //点亮第八个LED

for(i=200;i>0;i--)

for(j=500;j>0;j--);

}

}

STM32 实现彩灯实现的几个重要步骤:选择合适的 STM32 型号、设计电路、编写代码,可以使用STM32CubeMX生成代码框架,再在其中编写自己的代码、将代码烧录到STM32芯片中。
具体实现的方法可以参考资料:
基于STM32单片机三色全彩RGB LED灯控制系统 原理图PCB程序设计:https://www.ngui.cc/zz/1872441.html

实现流水灯闪烁功能:使用定时器中断来控制LED灯的亮灭时间,每个LED灯亮100ms后熄灭并使下一个LED灯点亮。
实现按键改变花型功能:当按下key1时,根据当前花型的不同,切换到不同的花型。至少需要设计3种花型,包括要求1中的基本花型。
实现强制复位当前花型为基本花型功能:当按下key2时,将当前花型重置为基本花型。
实现串口输出当前花型内容功能:每隔500ms输出当前花型的名称或描述信息,可以使用串口助手或其他串口通信库来实现。

参考 https://blog.csdn.net/m0_47699870/article/details/116226342