关于对C51中特殊功能寄存器sfr的思考

时间:2024-03-30 16:45:52

在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'这个关键字有特殊处理,以至于它能将定义变量时的赋值关联为其地址