这次想要实现的功能是:
开局流水灯
k1:流水暂停/流水继续
k2:流水灯时开关灯,流水暂停时k2手动换色
(灯的顺序是从红色开始的 继续是接着之前的灯 开关是从红色开始)

继续上一次的cubeMX

STM32之用野火的F429点彩虹(HAL库)-02_指针数组
打开pc13和pa1脚

程序部分:

用了枚举所以贴贴菜鸟教程

https://www.runoob.com/cprogramming/c-enum.html

typedef enum LED_STATE_t{
	LED_OFF,
	LED_FLOWE,
	LED_PAUSE,
}LED_STATE_t;
LED_STATE_t LED_State = LED_FLOWE; // * LED 流水开关
unsigned char flag = 0;
unsigned char key1_flag = 1;//key1标志位
//变量们

void Led_Close()
{
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);
}//关闭LED灯

void Led_Red()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);
}//红灯
void Led_Yellow()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_11,GPIO_PIN_RESET);
}//黄灯
void Led_Green()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);
}//绿灯
void Led_Cyan()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_RESET);
}//青灯
void Led_Blue()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);
}//蓝灯
void Led_Purple()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_12,GPIO_PIN_RESET);
}//紫灯
void Led_White()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_RESET);
}//白灯
//这里把之前的灯都放函数里了

void (*Choice[7])(void) = {Led_Red,Led_Yellow,Led_Green,Led_Cyan,Led_Blue,Led_Purple,Led_White};//把所有灯放入指针数组

void Led_River()
{
	(*Choice[flag])();

	if (LED_State == LED_FLOWE)
	{
		HAL_Delay(1000);//延时亮一下
		flag++;
		if(flag == 7)
			flag = 0;
	}
}//流水灯

void Scan_Keys()
{
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1)
	{
		HAL_Delay(5);
		if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1)
		{ // * 停止流水
			 
			if (LED_State == LED_PAUSE)
			{// * 流水则关闭
					LED_State = LED_FLOWE;
			}
			else if (LED_State == LED_FLOWE)
			{// * 开始流水
					LED_State = LED_PAUSE;
			}
			while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1);
		}
	}
	
	if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1)
	{
		HAL_Delay(5);
		if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1)
		{ 
			
			if (LED_State == LED_OFF)
			{ // * 打开LED
				LED_State = LED_FLOWE;
			}
			else if (LED_State == LED_PAUSE)
			{ // * 手动换色
				flag++;
				if(flag == 7)
					flag = 0;
			}
			else if (LED_State == LED_FLOWE)
			{ // * 关闭LED
				LED_State = LED_OFF;
				Led_Close();
				flag = 0;
			}
			
			while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1);
		}
	}
}//按键判断

然后是主函数部分(刚刚那些在主函数外边)

while (1)
  {
		
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		if (LED_State != LED_OFF)
		{
			Led_River();//流水灯
		}
		Scan_Keys();//检测按键
  }

效果展示(调了三倍速)

STM32之用野火的F429点彩虹(HAL库)-02_g++_02

注:因为没用中断 用的延时 所以按键不够灵敏 下次改进