使用数组存储引脚位

时间:2015-12-30 21:46:30

标签: c microcontroller pic microchip

试着确保我在这里正确的轨道上。我试图将大量6位字节存储到一个阵列中,用PIC18F2550来控制并行设备。

我的阵列:

char pins[4] = {
        000000, //0
        000001, //1
        000010, //2
        000011, //3
        000100 //4
}

稍后在我的代码中,我希望能够输入诸如的命令 "设置3"它将引脚RB0-RB5分别设置为000011。

PSEUDO CODE:

if command="Set 3" then find pins[3]{
LATBbits.LATB0 = pins[3][0];
LATBbits.LATB1 = pins[3][1];
LATBbits.LATB2 = pins[3][2];
LATBbits.LATB3 = pins[3][3];
LATBbits.LATB4 = pins[3][4];
LATBbits.LATB5 = pins[3][5];
}

将给出:

{
 LATBbits.LATB0 = 0;
 LATBbits.LATB1 = 0;
 LATBbits.LATB2 = 0;
 LATBbits.LATB3 = 0;
 LATBbits.LATB4 = 1;
 LATBbits.LATB5 = 1;
}

这是创建此方法的合适方法吗?我是在正确的轨道上吗?您是否有更好的方法来创建一个有效的阵列来控制具有许多设置的6位并行设备?

谢谢大家!

1 个答案:

答案 0 :(得分:3)

出于多种原因,你走错了路。

错误的曲目#1 :在您的数组定义中,C编译器不会将000011之类的值解释为二进制。由于前导零,它会将其解释为八进制。所以000011是十进制的八进制9.所以你的数组包含零,一,八,九和六十四的值。

您可以编写类似0b000011的值来告诉编译器该值是二进制的。但这不是标准C,许多C编译器不支持。您必须检查您的编译器是否支持该约定。

错误的曲目#2 :您的目的是创建一个包含值0,1,2,3,4的数组。请注意,数组中每个成员的值等于索引那个成员。这个阵列毫无意义。只需直接使用索引值,而不是作为一个只返回原始索引值的数组的索引。

错误的曲目#3 :设置LATBbits.LATB0 = pins[3][0];时,您尝试引用一维数组,就像它是一个二维数组一样。你不能这样做。您不能对值使用额外的数组维度说明符来从该值中提取一点。 C语言并没有这样做。

错误的曲目#4 :仅仅因为LATBbits定义了位域,它并不意味着你不能直接设置LATBbits。换句话说,您不必单独设置位。您只需直接设置LATBbits即可立即设置所有位。

错误的曲目#5 :您写道LATB4和LATB5将设置为1.但这些并不是LATBbits中最不重要的位。 LATB0和LATB1是最低有效位,它们是在设置LATBBits = 0b000011时将设置的位。

正确的轨道:看看LATBbits的定义。我在网上找到了它,确保它与头文件中的定义相符。

//==============================================================================
//        LATB Bits

extern __at(0x0F8A) __sfr LATB;

typedef struct
  {
  unsigned LATB0                : 1;
  unsigned LATB1                : 1;
  unsigned LATB2                : 1;
  unsigned LATB3                : 1;
  unsigned LATB4                : 1;
  unsigned LATB5                : 1;
  unsigned LATB6                : 1;
  unsigned LATB7                : 1;
  } __LATBbits_t;

extern __at(0x0F8A) volatile __LATBbits_t LATBbits;

#define _LATB0                  0x01
#define _LATB1                  0x02
#define _LATB2                  0x04
#define _LATB3                  0x08
#define _LATB4                  0x10
#define _LATB5                  0x20
#define _LATB6                  0x40
#define _LATB7                  0x80

我非常确定您的整个示例伪代码可以简化为此。

if command="Set 3" then {
    LATB = 3;
}

不需要阵列,也不需要单独设置位。您可以设置LATBLATBbits(它们为同一个内存映射寄存器设置两个不同的名称)。设置LATB(或LATBbits)= 3将导致LATB0和LATB1置1,其他位清零。

如果LATB值与命令值不匹配,则使用数组查找LATB值可能很有用。例如,假设您确实希望在命令为3时设置LATB4和LATB5。在这种情况下,您应该使用_LATBx定义来定义这样的数组:

char pins[] = {
    0,                  // All bits clear
    (_LATB0),           // Bit 0 set
    (_LATB1),           // Bit 1 set
    (_LATB4 | _LATB5),  // Bit 4 and Bit 5 set
    (_LATB2)            // Bit 2 set
}

然后你可以像这样从数组中设置LATB。

LATB = pins[3];