打印
[经验分享]

c51中 sbit和位寻址 用法

[复制链接]
567|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vivilyly|  楼主 | 2024-6-17 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
c51中的位寻址区是020H~02FH (BYTE)地址,共16字节
位寻址方式:直接位地址、位变量并在定义时给定地址(汇编或sbit)、特殊功能寄存器(sfr)或位寻址区的字节变量可用变量名+位号
sbit 用于定义固定地址的位变量,
与bit不同的地方是bit定义的一般不指定固定地址(但不是不能),由编译器分配
对于特殊功能寄存器(应在使用前由sfr关键字定义,如sfr P0=0x80)可以用 sbit  P0_4= P0^4  (这里的^号不是与或符号)
对于定义时定义在位寻址区的变量 如 char bdata a;   也可以用sbit 定义来引用它的特定位,如 sbit  bit_a1=a^1
但普通位寻址区的位变量在其它源文件中要使用时的声明形式是 extern  bit  bit_a1(与下文所述的sfr的位不同);因为没有extern sbit的说法
(可参阅keil C51 的help文件里Cx51 User's Guide——》Language Extensions——》Language Extensions——》bdata文件)
而sfr用sbit定义的位在其它文件中的引用则不同,需要在所有使用的文件中都用sbit进行定义,这个没有地方明确指出,但是可以
在keilC 自带的头文件中得到证明,如“at89x51.h”文件中  对P1_0使用sbit定义而不是声明,而这个头文件将会被包含进同一工程的若干个源文件中,编译时也会多次调入;另外个人曾经测试过对sfr使用和bdata变量在相同的源文件中定义,再在同一头文件中声明,得到的结果是bdata变量编译正常,而sfr提示UNSOLVED 提示。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

1452

帖子

0

粉丝