试着确保我在这里正确的轨道上。我试图将大量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位并行设备?
谢谢大家!
答案 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;
}
不需要阵列,也不需要单独设置位。您可以设置LATB
或LATBbits
(它们为同一个内存映射寄存器设置两个不同的名称)。设置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];