《单片机原理:7-6_补_3_2_3_C51语言的绝对地址访问KEIL1》由会员分享,可在线阅读,更多相关《单片机原理:7-6_补_3_2_3_C51语言的绝对地址访问KEIL1(7页珍藏版)》请在金锄头文库上搜索。
1、 第3章 C51语言编程基础语言编程基础13.2.3 C513.2.3 C51语言的绝对地址访问语言的绝对地址访问如何对如何对80518051片内片内RAMRAM、片外、片外RAMRAM及及I/OI/O空间进行访问,空间进行访问,C51C51提供提供两种两种常用常用的访问绝对地址的方法。的访问绝对地址的方法。1 1绝对宏绝对宏编译器提供了一组宏定义对编译器提供了一组宏定义对codecode、datadata、pdatapdata和和xdataxdata空间进行绝对空间进行绝对寻址。寻址。程序中用程序中用“#include#include ”来对来对absacc.habsacc.h中中声明的宏声
2、明的宏来访问绝来访问绝对地址,包括对地址,包括CBYTECBYTE、CWORDCWORD、DBYTEDBYTE、DWORDDWORD、XBYTEXBYTE、XWORDXWORD、PBYTEPBYTE、PWORDPWORD,具体使用参见,具体使用参见absacc.habsacc.h头文件。其中:头文件。其中:2CBYTECBYTE以字节形式对以字节形式对codecode区寻址;区寻址;CWORDCWORD以字形式对以字形式对codecode区寻址;区寻址;DBYTEDBYTE以字节形式对以字节形式对datadata区寻址;区寻址;DWORDDWORD以字形式对以字形式对datadata区寻址;区
3、寻址;XBYTEXBYTE以字节形式对以字节形式对xdataxdata区寻址;区寻址;XWORDXWORD以字形式对以字形式对xdataxdata区寻址;区寻址;PBYTEPBYTE以字节形式对以字节形式对pdatapdata区寻址;区寻址;PWORDPWORD以字形式对以字形式对pdatapdata区寻址。区寻址。【例例】片内片内RAMRAM、片外、片外RAMRAM及及I/OI/O定义的程序如下:定义的程序如下: (keil) (keil)#include#include #define #define PORTAPORTA XBYTE XBYTE0xFFC00xFFC0 / /将将PORT
4、APORTA定义为外部定义为外部I/OI/O口,口,地址为地址为0xFFC00xFFC0,长度,长度8 8位位#define #define NRAMNRAM DBYTE DBYTE0x500x50 / /将将NRAMNRAM定义为片内定义为片内RAMRAM,地址为地址为0x500x50,长度,长度8 8位位main( )main( ) PORTA=0x3d; PORTA=0x3d; /将数据将数据3DH3DH写入地址为写入地址为0xffc00xffc0的外部的外部I/OI/O端口端口PORTAPORTA中中 NRAM=0x01; NRAM=0x01; /将数据将数据01H01H写入片内写入片
5、内RAMRAM的的0x400x40单元单元 42 2 _at_ _at_ 关键字关键字关键字关键字 _at_ _at_ 可对指定的存储器空间的绝对地址访问,格式如下:可对指定的存储器空间的绝对地址访问,格式如下: 存储器类型存储器类型 数据类型说明符数据类型说明符 变量名变量名 _at_ _at_ 地址常数地址常数其中,存储器类型为其中,存储器类型为C51C51能识别的数据类型;数据类型为能识别的数据类型;数据类型为C51C51支持的数据支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用使用 _
6、at_ _at_ 定义的变量必须为定义的变量必须为全局变量全局变量。5【例例】使用关键字使用关键字 _at_ _at_ 实现绝对地址的访问,程序如下:实现绝对地址的访问,程序如下:void void main(voidmain(void) ) data unsigned char data unsigned char y1y1 _at_ 0x50_at_ 0x50; /; /在在datadata区定义字节变量区定义字节变量y1y1,地址为,地址为50H50H xdataxdata unsigned unsigned intint y2y2 _at_ 0x4000_at_ 0x4000;/;/在
7、在xdataxdata区定义字变量区定义字变量y2y2,地址为,地址为 / /4000H4000H y1=0xff;y1=0xff; y2=0x1234;y2=0x1234; while(1); while(1); 6【例例】将片外将片外RAM 2000HRAM 2000H开始的开始的连续连续2020字节清字节清0 0,程序如下:,程序如下:xdataxdata unsigned char buffer20 _at_ 0x2000; unsigned char buffer20 _at_ 0x2000;void void main(voidmain(void) ) unsigned char i;unsigned char i; for(ifor(i=0; i20; i+)=0; i20; i+) bufferibufferi=0=0 7