如何使用chracter数组

时间:2017-03-24 13:34:47

标签: c function embedded keil hal

大家好我正在使用Keil MicroVision IDE在STM32Fxx微处理器上编写嵌入式C代码。在我的项目中,我正在使用8片接力。我使用以下代码示例删除了每个继电器。

 #define DO9_Pin GPIO_PIN_14
 #define DO9_GPIO_Port GPIOC
 #define DO8_Pin GPIO_PIN_15
 #define DO8_GPIO_Port GPIOC
 #define DO7_Pin GPIO_PIN_1
 #define DO7_GPIO_Port GPIOA
 #define DO6_Pin GPIO_PIN_0
 #define DO6_GPIO_Port GPIOA
 #define DO5_Pin GPIO_PIN_7
 #define DO5_GPIO_Port GPIOB
 #define DO4_Pin GPIO_PIN_6
 #define DO4_GPIO_Port GPIOB
 #define DO3_Pin GPIO_PIN_5
 #define DO3_GPIO_Port GPIOB
 #define DO2_Pin GPIO_PIN_1
 #define DO2_GPIO_Port GPIOB
 #define DO1_Pin GPIO_PIN_4
 #define DO1_GPIO_Port GPIOA
 #define DO0_Pin GPIO_PIN_3
 #define DO0_GPIO_Port GPIOA`

之后我调整了继电器状态(" GPIO PIN STATUS"),并且具有众所周知的HAL功能。例如,在每个cylce中,我正在使用微控制器引脚设置我的9个继电器的状态,我正在使用此代码块`

  void prsSetResetRelays(unsigned char coilNo,char status){

    if(coilNo==0){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_SET);
       }else{
            HAL_GPIO_WritePin(DO0_GPIO_Port,DO0_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==1){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO1_GPIO_Port,DO1_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==2){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO2_GPIO_Port,DO2_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==3){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO3_GPIO_Port,DO3_Pin,GPIO_PIN_RESET);
        }
    }else if(coilNo==4){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO4_GPIO_Port,DO4_Pin,GPIO_PIN_RESET);
        }
    }else if(coilNo==5){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO5_GPIO_Port,DO5_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==6){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO6_GPIO_Port,DO6_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==7){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO7_GPIO_Port,DO7_Pin,GPIO_PIN_RESET);
        }
    }
    else if(coilNo==8){
        if(status=='s' || status=='S'){
            HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_SET);
        }else{
            HAL_GPIO_WritePin(DO8_GPIO_Port,DO8_Pin,GPIO_PIN_RESET);
        }
    }
      else if(coilNo==9){
          if(status=='s' || status=='S'){
              HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_SET);
          }else{
                HAL_GPIO_WritePin(DO9_GPIO_Port,DO9_Pin,GPIO_PIN_RESET);
         }
      }

    }

我的问题是这个。有没有办法让我这样做,以较短的形式减少此代码。我可以使用for循环,而不是所有语句。例如,我想编写一个代码:`

      for(int i=0;i<10;i++){
           if(status=='s' || status=='S'){
                  HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_SET);
           }else{
                HAL_GPIO_WritePin(DO[i]_GPIO_Port,DO[i]_Pin,GPIO_PIN_RESET);
         }
       }

有没有办法让我在c编程语言中使用这种表示法。提前谢谢。

1 个答案:

答案 0 :(得分:4)

您无法索引预处理器名称,不能。它们不是运行时变量,它们严格用于在编译器甚至看到代码之前进行文本替换。

正确的解决方案是将您的继电器阵列建模为数组:

static const struct {
  GPIO_TypeDef *port;
  uint16_t     pin;
} relays[] = {
 { GPIOC, GPIO_PIN_14 },
 { GPIOC, GPIO_PIN_15 },
 ... more here ...
};

然后你可以在数组中使用索引来获取端口/引脚数据,然后戳它:

void prsSetResetRelays(unsigned char coilNo, char status)
{
  if(coilNo >= sizeof relays / sizeof *relays)
    return;
  HAL_GPIO_WritePin(relays[coilNo].port, relays[coilNo].pin,
    (status == 's' || status == 'S') ? GPIO_PIN_SET : GPIO_PIN_RESET);
}