使用bdata定义的变量即可字寻址,也可比特位寻址。
Keil C51编译器把使用bdata定义的变量放置在8051内部RAM可位寻址区。
bdata定义的变量必须为全局变量,不能在任一函数内部定义bdata类型的变量。
bdata关键词使用方法:
int bdata x1; /* 定义可位寻址的整型变量*/
char bdata bary [4]; /* 定义可位寻址的数组*/
此时,x1,bary均可按比特位寻址。使用sbit关键词定义可操作其任一比特位的变量。
sbit mybit0 = x1 ^ 0; /* x1的比特0*/
sbit mybit15 = x1 ^ 15; /* x1的比特15 */
sbit Ary07 = bary[0] ^ 7; /* bary[0]的比特7*/
sbit Ary37 = bary[3] ^ 7; /* bary[3]的比特7 */
Keil C51编译器总是像对sfr16那样把可位寻址的变量视为little endian字节序,标准C类型如int ,long则以big endian方式存储。
调用其他源文件中定义的sbit变量,以如下方式声明:
extern bit mybit0;
extern bit mybit15;
extern bit Ary07;
extern bit Ary37;
操作bdata声明的对象,方式如下:
Ary37 = 0; /* 对bary[3]的比特7清零*/
bary[3] = 'a'; /* bary[3]直接赋值*/
x1 = -1; /* x1直接赋值 */
mybit15 = 1; /* 对x1的比特15置一*/
也可声明结构体和联合体的sbit变量,示例:
union lft
{
float mf;
long ml;
};
bdata struct bad/*注意 bdata*/
{
char m1;
union lft u;
} tcp;/*注意tcp位于位寻址区*/
sbit tcpf31 = tcp.u.ml ^ 31;
sbit tcpm10 = tcp.m1 ^ 0;
sbit tcpm17 = tcp.m1 ^ 7;
须要注意的是,使用sbit定义针对非bdata类型变量的某一比特位,毫无意义。