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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值