2012-01-23 34 views
0

我正在使用MPLABx和HI Tech PICC编译器。我的目标芯片是PIC16F876。通过查看pic16f876.h包含文件,似乎应该可以通过名称来引用它们来设置芯片的系统寄存器。使用Hi Tech PICC在PIC16F876中设置寄存器值

例如,在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

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

所以:

CCP1CONbits.CCP1M = 0x0c; 

应该是什么你正在尝试做的等价物。如果您想一次设置全部八位,则可以使用CCP1CON = 0xc0。这会将CCP1M位设置为0x0c,将所有其他位设置为零。

你给也有个别位符号,所以你可以这样做太头:

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

虽然位域的方法是清洁剂。

+0

谢谢!这是我错过的“位”。我无法在PICC手册中的任何地方找到它。我错过了什么吗?你是正确的,这是更清洁,这就是为什么我一直在努力实现它。到目前为止,我一直在做个别位分配。 – Michael

相关问题