本帖最后由 zl2168 于 2016-9-23 20:58 编辑
⒍ 位变量定义方式
80C51片内RAM有16字节128位的可寻址位(字节地址20H~2FH,位地址00H~7FH),还有11个特殊功能寄存器是可位寻址的,C51编译器扩充了关键词bit和sbit,用于定义这些可寻址位。位变量也需先定义,后使用。
⑴ 定义128位可寻址位的位变量
bit 位变量名
例如:
bit u,v; //定义位变量u,v 。
C51编译器将自动为其在位寻址区安排一个位地址(1bit)。
对于表4-5中已经按存储器类型bdata定位的字节,其每一可寻址位,可按如下方法定义:
unsigned char bdata flag; //定义字符型变量flag,存储器类型bdata
bit f0=flag^0; //定义位标识符f0,为flag第0位
bit f1=flag^1; //定义位标识符f1,为flag第1位
上述第一条语句先定义了一个字符型变量flag,存储器类型bdata,C51编译器将自动为其在片内RAM位寻址区(20H~2FH)安排一个字节(8bit),第2、3条语句则分别定义f0、f1为该字节第0、1位的位标识符。注意,“^”不是运算符,仅指明其位置,相当于汇编中的“.”。
⑵ 定义11个特殊功能寄存器可寻址位的位变量
80C51单片机11个可寻址位的特殊功能寄存器中,有6个SFR(PSW、TCON、SCON、IE、IP和P3),它们每一可寻址位有位定义名称,C51库函数reg51.h也已对其按MCS-51中取的位定义名称(必须大写)全部作了定义,并赋予了既定的位地址。只要在头文件中声明包含库函数reg51.h,就可按位定义名称直接引用。但是,还有5个SFR(ACC、B、P0、P1和P2),可寻址位没有专用的位定义名称,只有位编号,但这些位编号不符合ANSI C标识符要求,例如,ACC.0、P1.0等(C51标识符规定不可用小数点),应重新定义。其格式如下:
sbit 位变量名=位地址常数
其中,位地址常数必须是该位变量既定的真实位地址。例如:
sbit P10=0x90; //定义位标识符P10,位地址为90H(P1.0)
sbit P10= 0x90^0; //定义位标识符P10,为90H(P1口)第0位
sbit P10= P1^0; //定义位标识符P10,为P1口第0位
上述第1条语句是直接用P1.0的位地址,第2条语句是用P1口的字节地址加位编号,第3条语句是用P1口特殊功能寄存器名加位编号。
需要说明的是,若用户不按既定的位定义名称引用6个SFR中的可寻址位,另起位变量名,则也须对其重新定义。虽然C51允许用关键词sbit定义这些位变量,体现了C51编译功能的多样性和完整性,但编者还是建议读者不要去重新定义6个SFR中的可寻址位,而直接使用预处理命令,既省事又不易出错。
需要指出的是,使用sbit定义11个特殊功能寄存器可寻址位的位变量,因其具有不变的真实地址,属于全局变量,应放在主函数之前(参阅例4-6)。
需要注意的是,不要混淆bit与sbit的区别。bit用于普通位变量,而sbit位用于特殊功能寄存器中可位寻址的位变量(有既定位地址)。
以上摘自张志良编著 《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
书中电路和程序设计有详细说明,程序语句条条有注解。
|