sbit是用来给特殊寄存器某个位取一个名字。sfr就是特殊寄存器。
下图就是51单片机所有的特殊寄存器
每个寄存器的位我们都可以给它取一个名字,专业术语叫 标识符,通过这个标识符可以操作对应的数据。每个寄存器的位也都拥有一个地址,通过寄存器的地址也可以访问到对应的数据。
但是地址只能做右值,不能做左值。也就是
sbit led =0xA0^1//0xA0是P2这个寄存器的地址
是可以的
但
0xA0^1=0//这是错误的,编译会提示语法错误。
为了让我们更方便的操作寄存器中的位数据,引入了sbit
sbit常用的两种方法
//sbit led =0xA0^1; //A0是P2这个寄存器的地址
//sbit ledD2=P2^0; //P2寄存器的名字
0xA0^1是什么?
STC80C52是一个8位CPU,所以P2这个寄存器是8位的,而P2这个寄存器的地址是0xA0,这个寄存器的位地址是这样的,从第0位到第7位
第一位 第二位 第三位 .。。。 第七位
1010 0000 1010 0001 1010 0010 1010 0111
^是异或的意思
0xA0^1=
1010 0000
XOR 0001
1010 0001
这个1010 0001 正好就是寄存器A0的第1个位地址(从0开始数的),以此类推,0xA0^7的结果是1010 0111 ,也就是A0的第七个位地址。
每个寄存器都有一个名字,专业术语叫标识符,每个寄存器都有一个地址。
因为地址不能做左值只能做右值,所以我们用寄存器的标识符操作寄存器的数据。
寄存器的用法
P2=0xFF;
P1=0x55;
相关文章









