牛骨文教育服务平台(让学习变的简单)
博文笔记

Keil C51对C语言的关键词扩展之三: bdata

创建时间:2013-11-28 投稿人: 浏览次数:2430

使用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类型变量的某一比特位,毫无意义。


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。