sbit与sfr关键字简析

单片机上的C与标准C规范略有不同,其中之一就是多了sfr和sbit两个关键字。
sfr用于将一个单片机的特殊功能寄存器(special function register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。例如
1
2
sfr P0 = 0x80;//P0口在该系列单片机的特殊功能寄存器中地址为0x80。
P0 = 0; //给P0口的8个引脚全部置低电平。

sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。例如

1
2
3
4
5
6
7
8
9
sbit P0_1 = 0x81;//定义P0.1口的地址。(1)
//上句也可以换成
sbit P0_1 = P0 ^ 1;//(2)
//或者
sbit P0_1 = 0X80 ^ 1;//(3)。语句(1)(2)(3)完全等价。
.
.
.
P0_1 = 1;//或P0_1=0; 操作P0.1口,给它置高电平或低电平。

STC该系列单片机的特殊功能寄存器布局如下:

图1 特殊功能寄存器名称和地址映像

看过图1这么多特殊功能寄存器之后可能会产生一些困扰,我们用sfr P0 = 0×80表示P0,用sfr SP = 0×81表示SP,这个没有歧义。有困扰的是:假如用sbit P0_1 = 0×81表示P0口的第一位,那么我想表示SP寄存器的第0位怎么办呢?如果也是定义成sbit SP_0 = 0×81那么明显会有二义性,编译器理解不了。其实这个问题是不存在的,从图1中可以看出,SFR又可以分为两个区域:可位寻址区和不可位寻址区。可位寻址区的寄存器地址能够被8整除,而不可位寻址区的寄存器地址不满足这一要求。因此例子中的sbit SP_0 = 0×81这种情况根本不会出现,也不允许出现。另一个值得注意的是下面语句:

1
2
sfr SP = 0x81; 
sbit P0_1 = 0x81;

它们虽然都引用了同一个地址0×81,但是对于编译器来说,这两者的含义完全不同,前者因为有sfr关键字,所以是字节地址。后者因为是sbit关键字,所以是位寻址,表示的是一个bit。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值