设置单片机片内存储器存储区首地址为30H、片外存储器存储区首地址3000H,存取数据字节个数16个,将片内存储区内容设置为01H-10H共16个字节 ,读取片内首地址为30H单元内容,将该内容传送到片外数据存储器存储区中保存,将保存在片外数据区数据依次取出送P1。
//方式1、汇编
ORG 0000H
IADDR EQU 30H
XADDR EQU 3000H
COUNT EQU 10H
MAIN:
MOV R0,#IADDR
MOV R2,#COUNT
INIT: MOV A,#01H
LOOP1:MOV @R0,A
INC A
INC R0
DJNZ R2,LOOP1
DXMOV:MOV R0,#IADDR
MOV DPTR,#XADDR
MOV R2,#COUNT
LOOP2:MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LOOP2
END
//方式2、指针
#include<reg51.h>
#include<stdio.h>
#define len 16
unsigned char idata *iAddr=0x30;
unsigned char xdata *xAddr=0x3000;
void main (void)
{
int i;
for(i=0;i<len;i++)
iAddr[i]=i+1;
for(i=0;i<len;i++)
xAddr[i]=iAddr[i];
}
//方式3、_at_绝对地址
#include<reg51.h> //51单片机头文件
#include<stdio.h>
#define len 16
unsigned char idata iAddr[len] _at_ 0x30 ;
unsigned char xdata xAddr[len] _at_ 0x3000;
void main (void)
{
int i;
for(i=0;i<len;i++)
iAddr[i]=i+1;
for(i=0;i<len;i++)
xAddr[i]=iAddr[i];
}
//方式四、宏定义
#include <reg51.h>
#include <absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define lenth 16
void main()
{
int i;
uint d_addr=0x3000,s_addr=0x30;
for(i=0;i<lenth;i++)
DBYTE[s_addr+i]=i+1;
for(i=0;i<lenth;i++){
XBYTE[d_addr+i]=DBYTE [s_addr+i];
}
}