////////////////////////////////////////////////////////////////// // 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