需要设计一组流水灯做工作指示,开始想用数组,结果失败了,

最近在设计一个项目,需要用到一组流水灯做工作指示。但是,在设计程序的时候,发现控制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); 
           }


原文链接:,转发请注明来源!