新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C51—運(yùn)算量(重點(diǎn):特殊功能寄存器變量、位變量

C51—運(yùn)算量(重點(diǎn):特殊功能寄存器變量、位變量

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

3)LARGE模式

LARGE模式稱為大編譯模式,在LARGE模式下,編譯時(shí)函數(shù)參數(shù)和變量被默認(rèn)在片外RAM的64KB空間了,存儲(chǔ)器類(lèi)型為xdata。

例如:

#pragma small //變量的存儲(chǔ)模式為SMALL

char k1; //存儲(chǔ)類(lèi)型為data

int xdata m1; //存儲(chǔ)類(lèi)型xdata

#pragma compact //變量的存儲(chǔ)模式為COMPACT

char k2;

int xdata m2;

int func1(int x1,int y1) large //函數(shù)的存儲(chǔ)模式為L(zhǎng)ARGE

{

return(x1+y1);

}

int func2(int x2,int y2) //編譯的存儲(chǔ)模式隱含為SMALL,沒(méi)有指明模式,隱含SMALL

{

return(x2-y2);

}

4、絕對(duì)地址的訪問(wèn)(這里才是重點(diǎn)中的重點(diǎn)啊~~~)

在C51中,可以通過(guò)變量的形勢(shì)訪問(wèn)51單片機(jī)的存儲(chǔ)器,也可以通過(guò)絕對(duì)地址來(lái)訪問(wèn)存儲(chǔ)器。三種方法:

1)使用C51運(yùn)行庫(kù)中預(yù)定義宏(就是調(diào)用#include"absacc.h")

C51編譯器提供了一組宏定義來(lái)對(duì)51單片機(jī)的code、data、pdata和xdata空間進(jìn)行絕對(duì)尋址!

規(guī)定只能以無(wú)符號(hào)數(shù)方式訪問(wèn),定義了8個(gè)宏定義,其函數(shù)原型如下:

#define CBYTE((unsigned char volatile*)0x50000L) //CBYTE以字節(jié)形勢(shì)對(duì)code區(qū)尋址

#define DBYTE((unsigned char volatile*)0x40000L)//data區(qū)

#define PBYTE((unsigned char volatile*)0x30000L) //pdata區(qū)

#define XBYTE((unsigned char volatile*)0x20000L) //xdata區(qū)

#define CWORD(unsigned int volatile*)0x50000L) //以字形式對(duì)code區(qū)尋址

#define DWORD(unsigned int volatile*)0x40000L)

#define PWORD(unsigned int volatile*)0x30000L)

#define XWORD(unsigned int volstile*)0x20000L)

例如:

#include"absacc.h"

#include"reg52.h"

typedef unsigned char uchar;

typedef unsigned intuint;

void main()

{

uchar var1;

uintvar2;

var1=XBYTE[0x0005]; //XBYTE[0x0005]訪問(wèn)片外RAM的0005字節(jié)單元

var2=XWORD[0x0002];//XWORD[0x0002]訪問(wèn)片外RAM的0002字單元

.

.

.

while(1);

}

2)通過(guò)指針訪問(wèn)

采用指針的訪問(wèn)的方法,可以在C51程序中對(duì)任意指定的存儲(chǔ)器單元進(jìn)行訪問(wèn)。

typedef unsigned char uchar;

typedef unsigned int uint;

void func()

{

uchar data var1;

uchar pdata *dp1; //定義一個(gè)指向pdata區(qū)的指針dp1

uint xdata *dp2; //定義一個(gè)指向xdata區(qū)的指針dp2,為uint型

uchar data*dp3; //定義一個(gè)指向data區(qū)的指針dp3,為char型

dp1=0x30; //dp1指針賦值,指向pdata區(qū)的30H單元

dp2=0x1000; //dp2指針賦值(uint型),指向xdata區(qū)的1000H單元

*dp1=0xff;//將數(shù)據(jù)0xff送到片外RAM30H單元

*dp2=0x1234; //將數(shù)據(jù)0x1234(由于是uint型,你懂得~~~),送到片外RAM1000H單元

dp3=&var1; //dp3指針指向data區(qū)的var1變量

*dp3=0x20;//給變量var1賦值0x20

}

3)使用C51擴(kuò)展關(guān)鍵字 _at_ (這個(gè)用的最多了~~~

總算完了,我真的要累死了~~~~擦擦擦擦啊

一般格式:

[存儲(chǔ)類(lèi)型] 數(shù)據(jù)類(lèi)型說(shuō)明 變量名 _at_ 地址常量;

其中,存儲(chǔ)類(lèi)型為data、bdata、idata、pdata、xdata等C51能識(shí)別的數(shù)據(jù)類(lèi)型,如果省略,則會(huì)按照存儲(chǔ)模式規(guī)定的默認(rèn)存儲(chǔ)類(lèi)型確定變量的存儲(chǔ)區(qū)域(這里又用到上邊的了);數(shù)據(jù)類(lèi)型為C51支持的數(shù)據(jù)類(lèi)型;地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);使用_at_定義的變量必須為全局變量。

例如:

typedef unsigned char uchar;

typedef unsigned int uint;

data uchar x1 _at_ 0x40; //在data區(qū)中定義字節(jié)變量x1,地址為0x40H,這里是uchar

xdata uint x2 _at_ 0x2000; //在xdata區(qū)中定義字變量x2,它的地址為0x2000H,這里是uint

我感覺(jué)我真的不想再寫(xiě)了,累死了~~~擦

不過(guò)完工了,爽啊~~解脫



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: C51運(yùn)算量特殊功能寄存器變量位變

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉