📄 w77e58_ram.asm
字号:
//////////////////////////////////////////////////////////////////
// winbond w77e58扩展RAM以及双数据指针的编程方法演示。 //
// -- xiaoqi //
// ----------------------------------------------------------- //
// 片内有1K的扩展RAM,并且有两个数据指针,dptr/dptr1,但是在实际 //
// 操作中,dptr1并不明显地出现,采用另外一个指针选择器DPS进行选 //
// DPS=0选择dptr,DPS=1选择dptr1,选择了dptr1以后表面上所用的符号 //
// 依然是dptr, 并没有dptr1这个指针出现,所以要知道当前所用的究 //
// 竟是哪一个,就必须查询DPS. //
// 外部ram扩展部分将与内部扩展ram重叠了前面的第一K空间,但可以 //
// 通过设定DME0(PMR.0)进行内外选择,所以RAM不会被浪费。当DME0 //
// =1时,内部扩展RAM被打开,在内部扩展RAM空间范围内操作时,外部 //
// 总线P0/P2上不会出现选址和数据信号;当DME0 =0时,内部扩展RAM //
// 被关闭,所有与xdata操作有关的指令都建立在外部扩展ram上。 //
//--------------------------------------------------------------//
// 在较大批量的数据传递的时候,还是用汇编比较爽 //
// PMR不支持位寻址操作,只能用数据对PMR进行与或操作 //
// 头文件选用在winbond目录下的头文件W77C32.H //
//////////////////////////////////////////////////////////////////
#include
#include
#define uchar unsigned char
// 搞了半天,还是编一段汇编来得爽快
extern void xdatamov(uchar xdata *ptr1,uchar xdata *ptr2,uchar len);
uchar xdata nxTemp[128]; // 服从系统分配地址
uchar xdata nxTemp1[128] _at_ 0x300; // 自定义数据地址
void main()
{
register uchar i; // 必须是unsigned..,否则无限循环
PMR |= 1; // 片内SDRAM打开
for(i=0;i<128;i++) // 赋初值
{
nxTemp[i] = i+128;
}
xdatamov(nxTemp1,nxTemp,128); // 使用双数据指针进行数据传递汇编代码
_nop_(); // 软件仿真时察看数据传递结果
while(1);
}
asm文件:
#include"77e58.inc"
?PR?_xdatamov?DATAMOV SEGMENT CODE
?DT?_xdatamov?DATAMOV SEGMENT DATA OVERLAYABLE
PUBLIC _xdatamov
RSEG ?DT?_xdatamov?DATAMOV
?_xdatamov?BYTE:
ptr1?040: DS 2
ptr2?041: DS 2
; C语言调用格式:
; void xdatamov(uchar xdata *ptr1,uchar xdata *ptr2,uchar len)
RSEG ?PR?_xdatamov?DATAMOV
_xdatamov:
USING 0
; R3 = len
MOV DPH1,R6 ;ptr2
MOV DPL1,R7
MOV DPH,R4 ;ptr1
MOV DPL,R5
CLR A
MOV R7,A
?C0001:
MOV A,R7
CLR C
SUBB A,R3
JNC ?C0004
MOV DPS,#0 ; dps = 0指向dptr
MOVX A,@DPTR ; 读取数据
INC DPTR
INC DPS ; dps = 1指向dptr1
MOVX @DPTR,A ; 实际上它就是dptr1
INC DPTR
INC R7
SJMP ?C0001
?C0004:
RET
; END OF _xdatamov
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -