Keil C51對C語言的關鍵詞擴展之三: bdata

使用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類型變量的某一比特位,毫無意義。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章