最近在设计一个项目,需要用到一组流水灯做工作指示。但是,在设计程序的时候,发现控制LED的IO口是不同组的,而且控制LED的亮灭很是复杂,没办法用循环语句做循环操作。如下图所示。
delay_ms(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11,GPIO_PIN_RESET);
delay_ms(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_9, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11,GPIO_PIN_SET);
delay_ms(500);
如果不能用循环语句作循操作,而用一般的表达式一句一句按顺序写出来,那么写完整个循环,都不知道要用到多少行代码,想想都觉得怕。
我在想,能不能用数组的方式,把表达式都写在数组里面,然后循环操作数组,从而简化代码。如下图所示。
u8 *ledondisplay[]={LED1(1),LED2(1),LED3(1),LED4(1),LED5(1),LED6(1),LED7(1),LED8(1),LED9(1),LED10(1)};
u8 *ledoffdisplay[]={LED1(0),LED2(0),LED3(0),LED4(0),LED5(0),LED6(0),LED7(0),LED8(0),LED9(0),LED10(0)};
for(i=1;i<11;i++)
{
LedOnDisplay[i];
delay_ms(20);
}
for(i=11;i>0;i--)
{
LedOffDisplay[i];
delay_ms(20);
}
但是,操作起来后,发现结果是错误的。
最后,又折腾了几种方法,发现只有一个方法是可行的,就是用switch语句进行操作。如下图所示。
void LedOnDisplay(u8 i)
{
switch(i)
{
case 1: LED1(1);
break;
case 2: LED2(1);
break;
case 3: LED3(1);
break;
case 4: LED4(1);
break;
case 5: LED5(1);
break;
case 6: LED6(1);
break;
case 7: LED7(1);
break;
case 8: LED8(1);
break;
case 9: LED9(1);
break;
case 10: LED10(1);
break;
default : break;
}
}
void LedOffDisplay(u8 i)
{
switch(i)
{
case 1: LED1(0);
break;
case 2: LED2(0);
break;
case 3: LED3(0);
break;
case 4: LED4(0);
break;
case 5: LED5(0);
break;
case 6: LED6(0);
break;
case 7: LED7(0);
break;
case 8: LED8(0);
break;
case 9: LED9(0);
break;
case 10: LED10(0);
break;
default : break;
}
}
for(i=1;i<11;i++)
{
LedOnDisplay(i);
delay_ms(20);
}
for(i=11;i>0;i--)
{
LedOffDisplay(i);
delay_ms(20);
}