c语言编程单片机中的sbit,用sbit定义可位寻址的特殊功能寄存器时的地址转换-51单片机C编程...

80C51单片机C编程时中,用sbit定义可位寻址的特殊功能寄存器的位变量(感觉说是常量更确切)时,编译器会进行处理,把sbit 后面给的地址值 转换成 相应的可进行位寻址的特殊功能寄存器 bit位 的位地址。转换不了时uVision报错,编译不通过。

比如,在头文件reg51.h中,定义了 sfr P0 = 0x80,该地址标识的是51芯片的P0端口的8个引脚。(一个字节)。

同时reg51.h中还定义了 sfr SP = 0x81。

如果自己定义 sbit TEST1 = 0x81;实验时会发现:TEST1实际表示的是0x80标识的8bits中的第二个bit位,表示成0x80.1。

按照一般的理解:TEST1应该是地址0x81对应的8bit的第一个bit位(0x81.0),但是事实不是这样的;

如果定义 sbit TEST4 = 0x84,表示的是0x80.4;

sbit TEST7 = 0x87,表示的是0x80.7。

但是当末尾大于7后,比如 sbit TEST8 = 0x88,表示的是0x88.0, 而不是0x81.0;

sbit TEST9 = 0x89;表示的是0x88.1; 依次类推到0x8f表示0x88.7。

开始是用实验板上的LED来检查,后来在uVision里面软调试,看Parallel Port0。看Memory是没用的,特殊功能寄存器的地址和内存空间地址是两个东西;后来看Symbols,终于把sbit定义的控制位的实际地址看清楚,但是没想明白,为甚么是这样,规律是怎样的。

查了一下资料,原来特殊功能寄存器中不是所有字节都可进行位寻址,支持位寻址字节地址的是:

0x80,0x88,0x90, 0x98, 0xA0, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8共16个,这些地址不连是续,能被8整除, 即字节地址是以8或0为尾数的。

6f3126567358b7653b17eba52bc7d642.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值