#define SFR(name,addr) __sfr __no_init volatile unsigned char name @ addr;
该宏定义告诉编译器将指定的变量“name”链接到地址为“addr”的存储位置中去,__sfr表示将变量是保存在特殊功能寄存器SFR中,__no_init表示将变量保存在非初始化数据区(一个目标文件的数据区分为以初始化的和未初始化的),同时该变量是volatile属性的,即程序每次要用到它的时候都会重新从变量所在的物理地址中读取其值,而不是从缓冲寄存器中取,因为它是随时可变的。
#define SFRBIT(name, addr, bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0) \
__sfr __no_init volatile union \
{ \
unsigned char name; \
struct { \
unsigned char bit0 : 1; \
unsigned char bit1 : 1; \
unsigned char bit2 : 1; \
unsigned char bit3 : 1; \
unsigned char bit4 : 1; \
unsigned char bit5 : 1; \
unsigned char bit6 : 1; \
unsigned char bit7 : 1; \
}; \
} @ addr;
该宏定义告诉编译器将联合体链接到地址为“addr”的存储位置中,该联合体包含一个 unsigned char类型的变量name以及一个位段结构,该位段结构包含8个二进制位,因为该位段结构与变量name具有相同的首地址,所以对name或者位段结构进行操作,实际上是具有相同效果的。也就是说bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0其实就是name的8个位的别名,改变bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0,name也随着改变,改变name,那么bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0也会发生变化。