写了个测试引脚电平的函数,发现特别麻烦
我的办法又笨,代码又冗长。有没有办法简化一下?
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);
}
大概看了下,以下代码可以试下,应该满足你的要求
switch(Pin)
{
case 0:
Pin_value=(P0>>=Pin_num);
Pin_value&=0x01;
break;
case 1:
Pin_value=(P1>>=Pin_num);
Pin_value&=0x01;
break;
以下省略...
} 好的,试下! case GPIO_P0:
result = (P0 & GPIOPinx) ? Bit_SET : Bit_RESET;
break;
类似这样?
返回值 result Bit_SET 为高电平,Bit_RESET 为低电平
本帖最后由 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等函数的实现是正确的,并且它们的使用在这个上下文中是恰当的。上述代码实现了与原始代码相同的功能,但显著减少了代码行数。
实测不行,编译通不过 你可以直接打印那个寄存器的, 比如说P0 的u8 或者P1 的u8 然后你就知道对应的每一位了
页:
[1]