0

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

1 回答 1

1

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

所以:

CCP1CONbits.CCP1M = 0x0c;

应该等同于您正在尝试做的事情。如果您想一次设置所有八位,您可以使用CCP1CON = 0xc0. 这会将 CCP1M 位设置为 0x0c,将所有其他位设置为零。

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

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

尽管位域方法更清洁。

于 2012-01-23T05:37:51.503 回答