#ifdef __IAR_SYSTEMS_ICC__
#pragma language=extended //允许使用扩展关键字
#define SFR(name,addr) __sfr __no_init volatile unsigned char name @ addr;
#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;
#define DEFC(name, address) __no_init volatile unsigned char name @ address
__no_init 不初始化,@ address 指定具体存储位置,volatile 非易失性的。
一般用SFRBIT的话可以用自己自定义的名称,来分别代表一个byte中的某个位
比如
SFRBIT( P1, 0x90, P1_7, P1_6, P1_5, P1_4, P1_3, P1_2, P1_1, P1_0 );
SBIT(P1_7 , 0x97);
但一般编译器的相关chip的头文件中都定义了,开发人员无须再定义。
sfr就是给功能寄存器一个名字,以后可以用名字访问功能寄存器,因为对功能寄存器的访问是通过地址来访问的。
sbit也是这样。