⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w77e58_ram.asm

📁 里面包括很多的驱动程序的
💻 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 + -