3)LARGE模式
LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外RAM的64KB空间了,存储器类型为xdata。
例如:
#pragma small //变量的存储模式为SMALL
char k1; //存储类型为data
int xdata m1; //存储类型xdata
#pragma compact //变量的存储模式为COMPACT
char k2;
int xdata m2;
int func1(int x1,int y1) large //函数的存储模式为LARGE
{
return(x1+y1);
}
int func2(int x2,int y2) //编译的存储模式隐含为SMALL,没有指明模式,隐含SMALL
{
return(x2-y2);
}
4、绝对地址的访问(这里才是重点中的重点啊~~~)
在C51中,可以通过变量的形势访问51单片机的存储器,也可以通过绝对地址来访问存储器。三种方法:
1)使用C51运行库中预定义宏(就是调用#include"absacc.h")
C51编译器提供了一组宏定义来对51单片机的code、data、pdata和xdata空间进行绝对寻址!
规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:
#define CBYTE((unsigned char volatile*)0x50000L) //CBYTE以字节形势对code区寻址
#define DBYTE((unsigned char volatile*)0x40000L) //data区
#define PBYTE((unsigned char volatile*)0x30000L) //pdata区
#define XBYTE((unsigned char volatile*)0x20000L) //xdata区
#define CWORD(unsigned int volatile*)0x50000L) //以字形式对code区寻址
#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 int uint;
void main()
{
uchar var1;
uint var2;
var1=XBYTE[0x0005]; //XBYTE[0x0005]访问片外RAM的0005字节单元
var2=XWORD[0x0002]; //XWORD[0x0002]访问片外RAM的0002字单元
.
.
.
while(1);
}
2)通过指针访问
采用指针的访问的方法,可以在C51程序中对任意指定的存储器单元进行访问。
typedef unsigned char uchar;
typedef unsigned int uint;
void func()
{
uchar data var1;
uchar pdata *dp1; //定义一个指向pdata区的指针dp1
uint xdata *dp2; //定义一个指向xdata区的指针dp2,为uint型
uchar data *dp3; //定义一个指向data区的指针dp3,为char型
dp1=0x30; //dp1指针赋值,指向pdata区的30H单元
dp2=0x1000; //dp2指针赋值(uint型),指向xdata区的1000H单元
*dp1=0xff; //将数据0xff送到片外RAM30H单元
*dp2=0x1234; //将数据0x1234(由于是uint型,你懂得~~~),送到片外RAM1000H单元
dp3=&var1; //dp3指针指向data区的var1变量
*dp3=0x20; //给变量var1赋值0x20
}
3)使用C51扩展关键字 _at_ (这个用的最多了~~~
)
总算完了,我真的要累死了~~~~擦擦擦擦啊
一般格式:
[存储类型] 数据类型说明 变量名 _at_ 地址常量;
其中,存储类型为data、bdata、idata、pdata、xdata等C51能识别的数据类型,如果省略,则会按照存储模式规定的默认存储类型确定变量的存储区域(
这里又用到上边的了);数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。
例如:
typedef unsigned char uchar;
typedef unsigned int uint;
data uchar x1 _at_ 0x40; //在data区中定义字节变量x1,地址为0x40H,这里是uchar
xdata uint x2 _at_ 0x2000; //在xdata区中定义字变量x2,它的地址为0x2000H,这里是uint
我感觉我真的不想再写了,累死了~~~擦
不过完工了,爽啊~~解脱