简化声明语句中的 if 逻辑
simplify if logic in declaration statement
是否可以简化此语句?
如果我使用case语句和while循环也是一样的
// Led Binary
if (volt == 0 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 2 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 3 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 4 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 5 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 6 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 7 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 8 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 On
}
else if (volt == 9 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 On
}
else if (volt == 10 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
从上面的代码可以看出,当达到某个电压时,LED 将亮起或熄灭。该代码也有许多关于 LED 输出的声明。有些LED我也声明使用Bitwise函数,但它是一样的。
谢谢。
一种解决方案是使用查找table将volt
值转换为四位LED值,然后使用按位运算符设置每个LED输出
static const int ledTable[16] = { 14, 14, 12, 13, 10, 11, 8, 9, 6, 7, 11, 14, 14, 14, 14, 14 };
int value = ledTable[volt];
LATGbits.LATG1 = value & 1;
LATGbits.LATG0 = (value >> 1) & 1;
LATGbits.LATG13 = (value >> 2) & 1;
LATGbits.LATG14 = (value >> 3) & 1;
您还可以通过数学方式确定 LED 值,例如
int value = volt ^ 14;
鉴于输出似乎从 0...14 开始计数而不是 'in order',建议定义一个 short int 作为输出当前状态的 'image'。然后定义一个 table ,它在每个输出条目中都有适当的位模式。 (在这种情况下可能需要 11 个条目)然后 'image = table[volt]; LATGbits = image;'
您可以减少可读性成本的代码量。
if (volt == 8 || volt == 9) {
LATGbits.LATG13 = 1;
LATGbits.LATG14 = 0;
} else {
LATGbits.LATG14 = 1;
if (volt < 4) // 0,2,3
LATGbits.LATG13 = 1;
else //4,5,6,7,10
LATGbits.LATG13 = 0;
}
if (volt % 2 == 1 || volt == 10) // 3,5,7,9,10
LATGbits.LATG1 = 1;
else // 0,2,4,6,8
LATGbits.LATG1 = 2;
if (volt == 2 || volt == 3 || volt == 6 || volt == 7)
LATGbits.LATG0 = 0;
else //0,4,5,8,9,10
LATGbits.LATG0 = 1;
查看代码中的注释,您似乎想将 LED 用作二进制显示(0 => 关、关、关、关;2 => 关、关、开、关;等)
查看代码,似乎 LED D01 (LATGbits.LATG1) 由 ACTIVE-HIGH 引脚控制(引脚为“1”时 LED 亮起)。其他 LED 由 ACTIVE-LOW 引脚控制(引脚为“0”时 LED 亮起)。因此,您必须采用 "volt" 值并将位 3,2 和 1 取反,并保持位 0 不变。
LATGbits.LATG1 = value & 1; //D01
LATGbits.LATG0 = ~(value >> 1) & 1; //D02
LATGbits.LATG13 = ~(value >> 2) & 1; //D03
LATGbits.LATG14 = ~(value >> 3) & 1; //D04
希望我了解您的需求。
P.S.: 只是一点样式说明:位从 0 开始编号,因此如果您相应地对 LED 编号将很有帮助:D00、D01、D02、D03
祝你工作愉快
是否可以简化此语句?
如果我使用case语句和while循环也是一样的
// Led Binary
if (volt == 0 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 2 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 3 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 4 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 5 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 6 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 7 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 0 ; //DO2 On
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
else if (volt == 8 )
{
LATGbits.LATG1 = 0 ; //DO1 OFF
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 On
}
else if (volt == 9 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 1 ; //DO3 OFF
LATGbits.LATG14 = 0 ; //DO4 On
}
else if (volt == 10 )
{
LATGbits.LATG1 = 1 ; //DO1 On
LATGbits.LATG0 = 1 ; //DO2 OFF
LATGbits.LATG13 = 0 ; //DO3 On
LATGbits.LATG14 = 1 ; //DO4 OFF
}
从上面的代码可以看出,当达到某个电压时,LED 将亮起或熄灭。该代码也有许多关于 LED 输出的声明。有些LED我也声明使用Bitwise函数,但它是一样的。
谢谢。
一种解决方案是使用查找table将volt
值转换为四位LED值,然后使用按位运算符设置每个LED输出
static const int ledTable[16] = { 14, 14, 12, 13, 10, 11, 8, 9, 6, 7, 11, 14, 14, 14, 14, 14 };
int value = ledTable[volt];
LATGbits.LATG1 = value & 1;
LATGbits.LATG0 = (value >> 1) & 1;
LATGbits.LATG13 = (value >> 2) & 1;
LATGbits.LATG14 = (value >> 3) & 1;
您还可以通过数学方式确定 LED 值,例如
int value = volt ^ 14;
鉴于输出似乎从 0...14 开始计数而不是 'in order',建议定义一个 short int 作为输出当前状态的 'image'。然后定义一个 table ,它在每个输出条目中都有适当的位模式。 (在这种情况下可能需要 11 个条目)然后 'image = table[volt]; LATGbits = image;'
您可以减少可读性成本的代码量。
if (volt == 8 || volt == 9) {
LATGbits.LATG13 = 1;
LATGbits.LATG14 = 0;
} else {
LATGbits.LATG14 = 1;
if (volt < 4) // 0,2,3
LATGbits.LATG13 = 1;
else //4,5,6,7,10
LATGbits.LATG13 = 0;
}
if (volt % 2 == 1 || volt == 10) // 3,5,7,9,10
LATGbits.LATG1 = 1;
else // 0,2,4,6,8
LATGbits.LATG1 = 2;
if (volt == 2 || volt == 3 || volt == 6 || volt == 7)
LATGbits.LATG0 = 0;
else //0,4,5,8,9,10
LATGbits.LATG0 = 1;
查看代码中的注释,您似乎想将 LED 用作二进制显示(0 => 关、关、关、关;2 => 关、关、开、关;等)
查看代码,似乎 LED D01 (LATGbits.LATG1) 由 ACTIVE-HIGH 引脚控制(引脚为“1”时 LED 亮起)。其他 LED 由 ACTIVE-LOW 引脚控制(引脚为“0”时 LED 亮起)。因此,您必须采用 "volt" 值并将位 3,2 和 1 取反,并保持位 0 不变。
LATGbits.LATG1 = value & 1; //D01
LATGbits.LATG0 = ~(value >> 1) & 1; //D02
LATGbits.LATG13 = ~(value >> 2) & 1; //D03
LATGbits.LATG14 = ~(value >> 3) & 1; //D04
希望我了解您的需求。
P.S.: 只是一点样式说明:位从 0 开始编号,因此如果您相应地对 LED 编号将很有帮助:D00、D01、D02、D03
祝你工作愉快