这次想要实现的功能是:
开局流水灯
k1:流水暂停/流水继续
k2:流水灯时开关灯,流水暂停时k2手动换色
(灯的顺序是从红色开始的 继续是接着之前的灯 开关是从红色开始)
继续上一次的cubeMX
打开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();//检测按键
}
效果展示(调了三倍速)
注:因为没用中断 用的延时 所以按键不够灵敏 下次改进