使用Hi Tech PICC在PIC16F876中设置寄存器值

时间:2012-01-23 02:57:39

标签: pic mplab

我正在使用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

1 个答案:

答案 0 :(得分:1)

您需要通过struct的实例访问位域成员。在这种情况下,即CCP1CONbits。因为它是一个位域,所以你只需要在位域中定义有效位数,而不是代码中的全部8位。

所以:

CCP1CONbits.CCP1M = 0x0c;

应该相当于你想要做的事情。如果要一次设置所有八位,可以使用CCP1CON = 0xc0。这会将CCP1M位设置为0x0c,将所有其他位设置为零。

您提供的标题也有单独的位符号,因此您也可以这样做:

CCP1M0 = 1;
CCP1M1 = 1;
CCP1M2 = 0;
CCP1M3 = 0;

虽然比特场方法更清晰。