- 6.5.7 绝对地址访问函数库
- define CBYTE((unsigned char volatile code*)0)
- define DBYTE((unsigned char volatile idata*)0)
- define PBYTE((unsigned char volatile pdata*)0)
- define XBYTE((unsigned char volatile xdata*)0)
- include<ABSACC.H>//头文件
- include<stdio.h>
- include<reg51.h>
- define CWORD((unsigned int volatile code*)0)
- define DWORD((unsigned int volatile idata*)0)
- define PWORD((unsigned int volatile pdata*)0)
- define XWORD((unsigned int volatile xdata*)0)
- include<ABSACC.H>//头文件
- include<stdio.h>
- include<reg51.h>
- define FVAR(object,addr)(((object volatile far)((addr)+0x10000L)))
- define FCVAR(object,addr)(((object const far)((addr)+0x810000L)))
- include<ABSACC.H>//头文件
- define IOVAL FVAR(long,0x04FFE)//访问HDATA存储空间的地址0x04FFE
- define FARRAY(object,base)(((object volatile far)((base)+0x10000L)))
- define FCARRAY(object,base)(((object const far)((base)+0x810000L)))
- include<ABSACC.H>//头文件
- define DPortRam FARRAY(int,0x24000)
6.5.7 绝对地址访问函数库
绝对地址访问函数库提供了一些宏定义的函数,用于对存储空间的访问。绝对地址访问库的函数包含在头文件ABSACC.H中,各个函数如表6.12所示。下面分别介绍各个函数。
1.BYTE型存储空间访问函数CBYTE、DBYTE、PBYTE和XBYTE
BYTE型存储空间访问函数CBYTE、DBYTE、PBYTE和XBYT的宏定义原型如下。
define CBYTE((unsigned char volatile code*)0)
define DBYTE((unsigned char volatile idata*)0)
define PBYTE((unsigned char volatile pdata*)0)
define XBYTE((unsigned char volatile xdata*)0)
BYTE型存储空间访问函数用于对8051单片机的存储空间进行绝对地址访问,可以进行字节寻址。其中,CBYTE用来寻址CODE区,DBYTE用来寻址IDATA区,PBYTE用来寻址PDATA区(可采用MOVX@R0指令),XBYTE用来寻址XDATA区(可采用MOVX@DPTR指令),程序示例如下。
include<ABSACC.H>//头文件
include<stdio.h>
include<reg51.h>
void main(void)//主函数
{
char ch;//声明变量
DBYTE[0x0040]=0x41;//对IDATA区赋值
PBYTE[0x0002]=0x42;//对PDATA区赋值
XBYTE[0x0002]=0x43;//对XDATA区赋值
ch=CBYTE[0x0002];//读取CODE区
printf(“ch=%bx\n”,ch);
ch=DBYTE[0x0040];//读取IDATA区
printf(“ch=%bx\n”,ch);
ch=PBYTE[0x0002];//读取PDATA区
printf(“ch=%bx\n”,ch);
ch=XBYTE[0x0002];//读取XDATA区
printf(“ch=%bx\n”,ch);
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
ch=5c
ch=41
ch=42
ch=43
在该程序中,首先声明并初始化位变量,接着对IDATA、PDATA和XDATA区赋值,最后分别读取CODE、IDATA、PDATA和XDATA区,并打印输出结果。
2.WORD型存储空间访问函数CWORD、DWORD、PWORD和XWORD
WORD型存储空间访问函数CWORD、DWORD、PWORD和XWORD的宏定义原型如下。
define CWORD((unsigned int volatile code*)0)
define DWORD((unsigned int volatile idata*)0)
define PWORD((unsigned int volatile pdata*)0)
define XWORD((unsigned int volatile xdata*)0)
WORD型存储空间访问函数可以访问8051的所有存储器空间,其功能与上一个宏相似,只是其定义的数据类型为unsigned int。使用该宏时,实际存储器地址应为2*sizeof(unsigned int),程序示例如下。
include<ABSACC.H>//头文件
include<stdio.h>
include<reg51.h>
void main(void)//主函数
{
int chl;//声明变量
DWORD[0x0040]=0x41;//对IDATA区赋值
PWORD[0x0002]=0x42;//对PDATA区赋值
XWORD[0x0002]=0x43;//对XDATA区赋值
chl=CWORD[0x0002];//读取CODE区
printf(“chl=%d\n”,chl);
chl=DWORD[0x0040];//读取IDATA区
printf(“chl=%d\n”,chl);
chl=PWORD[0x0002];//读取PDATA区
printf(“chl=%d\n”,chl);
chl=XWORD[0x0002];//读取XDATA区
printf(“chl=%d\n”,chl);
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
chl=5924
chl=65
chl=66
chl=67
在该程序中,首先声明并初始化位变量,接着对IDATA、PDATA和XDATA区赋值,然后分别读取CODE、IDATA、PDATA和XDATA区的数据并打印输出结果。
3.far存储区访问函数FVAR和FCVAR
far存储区访问函数FVAR和FCVAR的宏定义原型如下。
define FVAR(object,addr)(((object volatile far)((addr)+0x10000L)))
define FCVAR(object,addr)(((object const far)((addr)+0x810000L)))
far存储区访问函数用于访问far存储器区域。其中,FVAR用于访问far空间(存储类为HDATA),FCVAR用于访问const far空间(存储类为HCONST)。在访问时,绝对地址目标不能超过64KB的段边界,例如不能在地址0xFFEE访问一个long变量。程序示例如下。
include<ABSACC.H>//头文件
define IOVAL FVAR(long,0x04FFE)//访问HDATA存储空间的地址0x04FFE
void main(void)//主函数
{
int var;
var=IOVAL;//读
IOVAL=0x10;//写
var=FCVAR(int,0x12002);//从HCONST存储空间读地址0x24002
}
该程序可以在KeilµVision3编译环境中执行。程序中使用FVAR宏定义了IOVAL,接着在主函数中使用IOVAL来进行读写HDATA存储空间的地址0x04FFE。最后,通过FCVAR从HCONST存储空间读地址0x12002。
4.far存储区数组访问函数FARRAY和FCARRAY
far存储区数组访问函数FARRAY和FCARRAY的宏定义原型如下。
define FARRAY(object,base)(((object volatile far)((base)+0x10000L)))
define FCARRAY(object,base)(((object const far)((base)+0x810000L)))
far存储区数组访问函数用于访问far存储器区域的数组类型目标。其中,FARRAY用于访问far空间(存储类为HDATA),FCARRAY用于访问const far空间(存储类为HCONST)。绝对地址目标不能超过64KB的段边界,例如不能在起始地址为0xFFF9访问一个有20个元素的long数组。程序示例如下。
include<ABSACC.H>//头文件
define DPortRam FARRAY(int,0x24000)
void main(void)//主函数
{
int i;//声明变量
long l;
l=FARRAY(long,0x8000)[i];//使用FARRAY访问
FARRAY(long,0x8000)[10]=0x12345678;
DPortRam[i]=0x1234;
l=FCARRAY(long,0x81000)[5];//使用FCARRAY访问
}
该程序可以在KeilµVision3编译环境中执行。程序中分别使用FARRAY和FCRRAY函数读写存储区。