sbit是什么意思?

sbit 直接定位微控制器端口位。
说白了,就是寻找特定的引脚。

我上周刚处理过一个,使用sbit定义特别方便。
例如,sbitled=P1 ^1 ;则 LED 对应 P1 .1
注意sbit的三种写法,不要搞混了。
0xD2 、PSW^2 、0xD0^2 都可以。

不能直接使用P1 .0,编译器不会识别它。
必须是sbitP1 _0=P1 ^0;这会起作用。

如果地址值错误,肯定会有问题。
最好给个意思起个名字,自己理解一下就可以了。

sbit是什么啊?

你说的很详细。
当我第一次开始摆弄 5 1 时,我完全感到困惑。
后来我渐渐明白了其中的道理。

记得那一年,大概是2 008 年,我在北京,接手了一个使用STC8 9 C5 2 的旧项目。
当时我看着数据表和那些寄存器地址,头晕目眩。
如果您只想控制 LED 或读取按钮,则必须弄清楚这些寄存器的位置以及哪个位的作用。

你提到的sbit是一个非常实用的东西。
当时我们写代码想直接操作某个特定的位,比如P1 .0引脚,直接写P1 ^0 = 1 是错误的;或者P1 ^0 = 0;,编译器会报错。
需要知道P1 .0的哪一位对应5 1 单片机内部的哪个寄存器。

所以,我们使用sbit来定义它。
例如,我知道P1 .0是P1 寄存器的位0,P1 寄存器的地址是0x9 0(这个地址应该从数据手册或技术规范中检查)。
我刚刚在代码中写道:
c 位 P1 _0 = 0x9 0; // 直接指定地址值,编译器就会知道你正在处理地址0x9 0的值。

或者,有时为了清楚起见,或者您想使用更直观的名称:
C sbit LED = P1 ^0; // 这里,P1 是SFR,0是要操作的位的偏移量。
编译器会自动计算地址。
注意,这里的写法P1 ^0是编译器可以理解的常规写法,但严格来说,SFR名称后面通常是地址值。
正如你所说,sbit OV = PSW^2 ;是相似的。
PSW是一个特殊功能寄存器,OV位相对于第2 个PSW寄存器有一个偏移量。

sbit LED = 0x9 0^0; // 或者直接用P1 的地址0x9 0,然后^0,也是地址0x9 0的位。

你看,定义 sbit 意味着给编译器一个“提示”,并说:“嘿,我有一个名为 P1 _0 的变量。
你将它与地址 0x9 0(或 PSW^0)关联起来。
当我将来操作 P1 _0 时,你就会知道将该位移动到地址 0x9 0。

这个东西,用多了就习惯了。
我刚开始写代码的时候,定义了很多sbit变量,比如sbit LED1 = 0x9 0; sbit LED2 = 0x9 0^1 ; sbit按钮=0x8 7 ;因此,如果使用 LED1 = 1 ;稍后你会发现第一个 LED 亮了。
这比直接计算寄存器地址方便得多,也不易出错。

你提到的三个我都用过。
首先输入sbit变量名=地址值;最明显的。
第二类sbit变量名=SFR名^位偏移量;这有点抽象,但更通用,只要知道 SFR 名称和位偏移量即可。
第三类sbit变量名=SFR地址值^位偏移量;与其他类型相同。

后来我用了Keil UVision。
该编译器具有良好的 sbit 支持。
只要定义正确,编译通过,烧录到单片机中,就可以实现具体位的操作。

哦,顺便说一句,你说 sbit P1 _0 = P1 ^0;虽然编译器能理解这句话,但严格来说,P1 本身就代表一个地址(比如0x9 0),P1 ^0指的是地址0x9 0的字节中的第0位。
所以sbit P1 _0 = P1 ^0;位 P1 _0 = 0x9 0^0;等于。
sbit 写为 P1 _0 = P1 ;或位 P1 _0 = 0x9 0;每个人都在谈论 SFR 地址可能更符合理解。
不过习惯这样写的人很多,如果能克服这个就好了。

总的来说,sbit是一个方便的工具,它允许您通过符号名称来操作微控制器内部的特定位,而不必一直记住地址和计数位。
我依靠对这些 sbit 定义的重复测试来了解硬件。

你问得很仔细,说明你对底层的东西很感兴趣。
继续研究!如果有什么不明白的可以回来问我。