我正在使用MPLABx和HI Tech PICC编译器。我的目标芯片是PIC16F876。通过查看pic16f876.h包含文件,看起来应该可以通过名称引用它来设置芯片的系统寄存器。
例如,在CCP1CON寄存器中,位0到3设置CCP和PWM模块的工作方式。通过查看pic16f876.h文件,看起来应该可以单独参考这4位,而无需更改CCP1CON寄存器其余部分的值。
但是,我试图以各种方式参考这4位,但没有成功。
我试过了;
CCP1CON.CCP1M=0xC0; this results in "error: struct/union required
CCP1CON:CCP1M=0xC0; this results in "error: undefined identifier "CCP1M"
但都失败了。我已阅读Hi Tech PICC编译器手册,但看不到如何执行此操作。
从pic16f876.h文件中,它看起来好像我应该能够通过名称引用系统寄存器中的这些子集,因为它们是在.h文件中定义的。 有谁知道如何做到这一点?
摘自pic16f876.h
// Register: CCP1CON
volatile unsigned char CCP1CON @ 0x017;
// bit and bitfield definitions
volatile bit CCP1Y @ ((unsigned)&CCP1CON*8)+4;
volatile bit CCP1X @ ((unsigned)&CCP1CON*8)+5;
volatile bit CCP1M0 @ ((unsigned)&CCP1CON*8)+0;
volatile bit CCP1M1 @ ((unsigned)&CCP1CON*8)+1;
volatile bit CCP1M2 @ ((unsigned)&CCP1CON*8)+2;
volatile bit CCP1M3 @ ((unsigned)&CCP1CON*8)+3;
#ifndef _LIB_BUILD
volatile union {
struct {
unsigned CCP1M : 4;
unsigned CCP1Y : 1;
unsigned CCP1X : 1;
};
struct {
unsigned CCP1M0 : 1;
unsigned CCP1M1 : 1;
unsigned CCP1M2 : 1;
unsigned CCP1M3 : 1;
};
} CCP1CONbits @ 0x017;
#endif
答案 0 :(得分:1)
您需要通过struct的实例访问位域成员。在这种情况下,即CCP1CONbits
。因为它是一个位域,所以你只需要在位域中定义有效位数,而不是代码中的全部8位。
所以:
CCP1CONbits.CCP1M = 0x0c;
应该相当于你想要做的事情。如果要一次设置所有八位,可以使用CCP1CON = 0xc0
。这会将CCP1M位设置为0x0c,将所有其他位设置为零。
您提供的标题也有单独的位符号,因此您也可以这样做:
CCP1M0 = 1;
CCP1M1 = 1;
CCP1M2 = 0;
CCP1M3 = 0;
虽然比特场方法更清晰。