solomon_wh2024 发表于 2024-3-19 10:31:42

写了个测试引脚电平的函数,发现特别麻烦

我的办法又笨,代码又冗长。
有没有办法简化一下?

void ShowPinLevel()
{
                S32 value1, value2;
                U8 Pin, Pin_num;
                U8 Pin_value;
       
                value1 = ReadPara();
                value2 = ReadPara();

        PrintString("\r\n探测引\xfd脚电平 ");
       
        if(value1 < 0 || value1 > 7 || value2 < 0 || value2 > 7)
        {
                PrintString("\r\n参数\xfd错误!");
        }
       
        Pin = (U8)value1;
        Pin_num = (U8)value2;
       
        printf_com1("%d.%d: ", (S32)Pin, (S32)Pin_num);
       
        switch(Pin)
        {
                case 0:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P00;
                                        break;
                                case 1:
                                        Pin_value = P01;
                                        break;
                                case 2:
                                        Pin_value = P02;
                                        break;
                                case 3:
                                        Pin_value = P03;
                                        break;
                                case 4:
                                        Pin_value = P04;
                                        break;
                                case 5:
                                        Pin_value = P05;
                                        break;
                                case 6:
                                        Pin_value = P06;
                                        break;
                                case 7:
                                        Pin_value = P07;
                                        break;
                        }
                        break;
                case 1:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P10;
                                        break;
                                case 1:
                                        Pin_value = P11;
                                        break;
                                case 2:
                                        Pin_value = P12;
                                        break;
                                case 3:
                                        Pin_value = P13;
                                        break;
                                case 4:
                                        Pin_value = P14;
                                        break;
                                case 5:
                                        Pin_value = P15;
                                        break;
                                case 6:
                                        Pin_value = P16;
                                        break;
                                case 7:
                                        Pin_value = P17;
                                        break;
                        }                       
                        break;
                case 2:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P20;
                                        break;
                                case 1:
                                        Pin_value = P21;
                                        break;
                                case 2:
                                        Pin_value = P22;
                                        break;
                                case 3:
                                        Pin_value = P23;
                                        break;
                                case 4:
                                        Pin_value = P24;
                                        break;
                                case 5:
                                        Pin_value = P25;
                                        break;
                                case 6:
                                        Pin_value = P26;
                                        break;
                                case 7:
                                        Pin_value = P27;
                                        break;
                        }                       
                        break;
                case 3:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P30;
                                        break;
                                case 1:
                                        Pin_value = P31;
                                        break;
                                case 2:
                                        Pin_value = P32;
                                        break;
                                case 3:
                                        Pin_value = P33;
                                        break;
                                case 4:
                                        Pin_value = P34;
                                        break;
                                case 5:
                                        Pin_value = P35;
                                        break;
                                case 6:
                                        Pin_value = P36;
                                        break;
                                case 7:
                                        Pin_value = P37;
                                        break;
                        }                       
                        break;
                case 4:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P40;
                                        break;
                                case 1:
                                        Pin_value = P41;
                                        break;
                                case 2:
                                        Pin_value = P42;
                                        break;
                                case 3:
                                        Pin_value = P43;
                                        break;
                                case 4:
                                        Pin_value = P44;
                                        break;
                                case 5:
                                        Pin_value = P45;
                                        break;
                                case 6:
                                        Pin_value = P46;
                                        break;
                                case 7:
                                        Pin_value = P47;
                                        break;
                        }                       
                        break;
                case 5:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P50;
                                        break;
                                case 1:
                                        Pin_value = P51;
                                        break;
                                case 2:
                                        Pin_value = P52;
                                        break;
                                case 3:
                                        Pin_value = P53;
                                        break;
                                case 4:
                                        Pin_value = P54;
                                        break;
                                case 5:
                                        Pin_value = P55;
                                        break;
                                case 6:
                                        Pin_value = P56;
                                        break;
                                case 7:
                                        Pin_value = P57;
                                        break;
                        }                       
                        break;
                case 6:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P60;
                                        break;
                                case 1:
                                        Pin_value = P61;
                                        break;
                                case 2:
                                        Pin_value = P62;
                                        break;
                                case 3:
                                        Pin_value = P63;
                                        break;
                                case 4:
                                        Pin_value = P64;
                                        break;
                                case 5:
                                        Pin_value = P65;
                                        break;
                                case 6:
                                        Pin_value = P66;
                                        break;
                                case 7:
                                        Pin_value = P67;
                                        break;
                        }                       
                        break;
                case 7:
                        switch(Pin_num)
                        {
                                case 0:
                                        Pin_value = P70;
                                        break;
                                case 1:
                                        Pin_value = P71;
                                        break;
                                case 2:
                                        Pin_value = P72;
                                        break;
                                case 3:
                                        Pin_value = P73;
                                        break;
                                case 4:
                                        Pin_value = P74;
                                        break;
                                case 5:
                                        Pin_value = P75;
                                        break;
                                case 6:
                                        Pin_value = P76;
                                        break;
                                case 7:
                                        Pin_value = P77;
                                        break;
                        }                       
                        break;
        }
        printf_com1("%d", Pin_value);
}

chen 发表于 2024-3-19 13:36:30

大概看了下,以下代码可以试下,应该满足你的要求
switch(Pin)
{
    case 0:
      Pin_value=(P0>>=Pin_num);
      Pin_value&=0x01;
      break;
    case 1:
      Pin_value=(P1>>=Pin_num);
      Pin_value&=0x01;
      break;
    以下省略...
}

solomon_wh2024 发表于 2024-3-19 14:18:24

好的,试下!

_奶咖君_ 发表于 2024-3-19 15:48:00

case GPIO_P0:
      result = (P0 & GPIOPinx) ? Bit_SET : Bit_RESET;
      break;
类似这样?
返回值 result Bit_SET 为高电平,Bit_RESET 为低电平

youyou 发表于 2024-3-19 16:37:46

本帖最后由 youyou 于 2024-3-19 16:40 编辑


上述代码的功能是读取特定引脚的电平状态。它首先读取两个参数,分别对应引脚的端口号和引脚号,然后根据这两个参数的值从相应的端口读取特定引脚的电平状态,并打印出来。代码的核心逻辑是使用嵌套的switch语句来找到正确的引脚并读取其值。

为了优化代码并减少其长度,我们可以使用一个二维数组来存储引脚值。这将允许我们用简单的索引访问,从而消除了深层嵌套的switch语句。下面是一个简化后的版本的代码示例:

void ShowPinLevel() {
    S32 value1, value2;
    U8 pin, pin_num;
    U8 pin_value;
    U8 pins = {{P00, P01, P02, P03, P04, P05, P06, P07},
                      {P10, P11, P12, P13, P14, P15, P16, P17},
                      /* continue filling in for all pins */
                     };

    value1 = ReadPara();
    value2 = ReadPara();

    PrintString("\r\n探测引脚电平 ");
   
    if(value1 < 0 || value1 > 7 || value2 < 0 || value2 > 7) {
      PrintString("\r\n参数错误!");
      return;
    }
   
    pin = (U8)value1;
    pin_num = (U8)value2;
    pin_value = pins;
    printf_com1("%d.%d: %d", (S32)pin, (S32)pin_num, pin_value);
}
注意:在这个优化版本中,我假设P00, P01, ..., P77已经定义为合适的值。这个代码段还假设ReadPara,PrintString和printf_com1等函数的实现是正确的,并且它们的使用在这个上下文中是恰当的。上述代码实现了与原始代码相同的功能,但显著减少了代码行数。

solomon_wh2024 发表于 2024-3-21 10:42:13

实测不行,编译通不过

嵌入式之路 发表于 2024-3-21 11:19:57

你可以直接打印那个寄存器的, 比如说P0 的u8 或者P1 的u8 然后你就知道对应的每一位了
页: [1]
查看完整版本: 写了个测试引脚电平的函数,发现特别麻烦