在REGX52.H头文件中,sfr的定义是这样的
OK,那么,sfr P2 = 0xA0;就表示P2指向了0xA0这个地址的寄存器
接下来,P2 = 0x00;表示给寄存器的8位都赋值0,将LED灯全部点亮
看起来似乎一切没问题,但是...
既然#define sfr char,那说明sfr本质是一个char
也就是说sfr P2 = 0xA0;等价于char P2 = 0xA0;
那么同一个变量P2,它是怎么做到在定义时赋值表示寄存器地址,在后续赋值又表示寄存器状态的呢?
如果我们模仿这种写法,能实现一样的效果吗?
实操:
- 我们用同样的方式定义一个宏mySfr,然后定义一个mySfr型变量S1并给定值0xAA.预期S1的地址为0xAA
- 然后用sfr也定义一个变量S2,同样给定值0xAA.预期S2的地址为0xAA
运行程序
可以发现,sfr类型的变量S2达到了预期.
而我们自定义mySfr类型的变量S1并没有达到预期.
结论:C51编译器对'sfr'这个关键字有特殊处理,以至于它能将定义变量时的赋值关联为其地址