SFR

#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 volatile unsigned char   fuck @ 0x5000;
可以写作:   DEFC(fuck,   0x5000  )


__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也是这样。

你可能感兴趣的:(OSAL)