简化声明语句中的逻辑

时间:2015-08-27 04:33:31

标签: c pic

是否可以简化此声明?

如果我使用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功能,但它是一样的。

感谢。

3 个答案:

答案 0 :(得分:3)

一种解决方案是使用查找表将volt值转换为4位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;

答案 1 :(得分:0)

如果输出似乎从0到14计数并且不是'按顺序',建议将short int定义为输出当前状态的“图像”。然后定义一个表,该表在输出的每个条目中具有适当的位模式。 (在这种情况下可能需要11个条目)然后'image = table [volt]; LATGbits = image;'

答案 2 :(得分:0)

查看代码中的注释,似乎您想使用LED作为二进制显示(0 => OFF,OFF,OFF,OFF; 2 => OFF,OFF,ON,OFF;等)

查看代码,似乎led D01(LATGbits.LATG1)由ACTIVE-HIGH引脚控制(当引脚为“1”时LED指示灯亮)。其他LED由ACTIVE-LOW引脚控制(当引脚为“0”时,LED为ON)。因此,您必须取“伏”值并反转位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

做得很好