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

📄 up51s011.asm

📁 X5045读写演示程序 先用字节写入: 写入11H到地址55H (字节写入) 读取55H
💻 ASM
字号:
;/*******************************************************************************
;*                                                                              *
;*    File       : uP51s011.asm                                                 *
;*    Date       : 2004-9-5                                                     *
;*    Version    : 1.0                                                          *
;*                                                                              *
;*    Author     : kevin           kevin@dz51.com                               *
;*    Company    : Http://www.dz51.com                                          *
;*                                                                              *
;********************************************************************************
;*    Descriptoon:                                                              *
;*    Descriptoon:                                                              *
;*                 X5045读写演示程序(J3短路2-3脚)                               *
;*                                                                              *
;*            程序运行首先把字节0x11H到x5045地址55H (字节写入),然后读出地址55H *
;*    的数据送给P0口,可以看到P0口8个发光管对应的数据。                         *
;*  (LD8---LD1分别对应0B00010001,0x11H)                                       *
;*                                                                              *
;*   然后进行页写入0X22H/0X33H/0X44H到X5045的地址0X1F0/1/2H,然后读出送P0口     *
;*                                                                              *
;* 注意:由于读写X5045的I/O口和编程芯片的I/O口是复用的,所以实验本程序的时候不  *
;* 要读器件,否则只能下次上电程序读写X5045才能够正常!!!                      *

;********************************************************************************
NAME    up51s011

CODE_SEG        SEGMENT CODE
;DATA_SEG       SEGMENT DATA
STACK_SEG       SEGMENT IDATA

CS      BIT     P1.2
SI      BIT     P1.4
SCK     BIT     P1.3
SO      BIT     P1.5


WREN_INST       EQU     06H             ; 写入使能指令(WREN)
WRDI_INST       EQU     04H             ; 写入禁止指令(WRDI)
WRSR_INST       EQU     01H             ; 写入状态寄存器指令(WRSR)
RDSR_INST       EQU     05H             ; 读取状态寄存器指令(RDSR)
WRITE_INST      EQU     02H             ; 写入存储器指令(WRITE)
READ_INST       EQU     03H             ; 读取存储器指令(READ)

BYTE_ADDR       EQU     55H             ; 字节模式写入地址
BYTE_DATA       EQU     11H             ; 字节模式写入数据
PAGE_ADDR       EQU     1F0H            ; 页写入模式地址
PAGE_DATA1      EQU     22H             ; 页模式写入第一个示
PAGE_DATA2      EQU     33H             ; 页模式写入第二个示
PAGE_DATA3      EQU     44H             ; 页模式写入第雀鍪据

STATUS_REG      EQU     00H             ; 要写入到状态寄存器的值

MAX_POLL        EQU     99H             ; 最大查询次数


        RSEG    STACK_SEG
STACK:          DS      20

;******************************************************************************************
;*      CODE
;******************************************************************************************
        CSEG    AT      0000H           ; 复位向量
        LJMP    MAIN

                                                

        RSEG    CODE_SEG
MAIN:
        MOV     SP,#(STACK-1)           ; 初始化栈指针
        CLR     EA                      ;

        SETB	SO		                ; 初始化I/O口
        CLR	SI
        CLR	SCK
        SETB	CS
        MOV ACC,#0XF0
	MOV P0,ACC
	LCALL DELAY 

        MOV ACC,#0X0F
	MOV P0,ACC
	LCALL DELAY 

        LCALL   WREN_CMD                ; 使能写入
        LCALL   WRSR_CMD                ; 写入00H到状态寄存器
        LCALL   WREN_CMD                ; 使能写入
        LCALL   BYTE_WRITE              ; 写入11H到地址55H (字节写入)
	LCALL   BYTE_READ               ; 读取地址55H处的数据(字节读取)
	MOV P0,ACC    ;将读取的数据送P0口
	LCALL DELAY 
        LCALL   WREN_CMD                ; 使能写入
        LCALL   PAGE_WRITE              ; 页写入22H/33H/44H到地址1F0/1F1/1F2H
        LCALL   SEQU_READ               ; 连续读取地址1F0/1F1/1F2H
        LCALL   RST_WDOG                ; 清除看门狗
	LCALL	WRDI_CMD		; 写入禁止指令

	MOV P0,ACC    ;将读取的数据送P0口
	CALL DELAY

	MOV R0,#55    ;将读取的数据送P0口

	MOV P0,R0
	LCALL DELAY 

        SETB	CS
MAIN_LP:
        SJMP    MAIN_LP
;******************************************************************************************
;* WREN_CMD: 写入使能指令
;* 传入参数: 无
;* 返回值: 无
;******************************************************************************************
WREN_CMD:
        CLR     SCK
        CLR     CS
        MOV     A, #WREN_INST
        LCALL   OUTBYT                  ; 传送写入使能指令
        CLR     SCK
        SETB    CS
        RET

;******************************************************************************************
;* WRDI_CMD: 写入禁止指令
;* 传入参数: 无
;* 返回值: 无
;******************************************************************************************
WRDI_CMD:
        CLR     SCK
        CLR     CS
        MOV     A,#WRDI_INST
        LCALL   OUTBYT                  ; 传送写入禁止指令
        CLR     SCK
        SETB    CS
        RET

;******************************************************************************************
;* WRSR_CMD: 写入数据到状态寄存器
;* 传入参数: 无
;* 返回值: 无
;******************************************************************************************
WRSR_CMD:
        CLR     SCK
        CLR     CS
        MOV     A,#WRSR_INST
        LCALL   OUTBYT                  ; 传送状态寄存器写入指令
        MOV     A,#STATUS_REG
        LCALL   OUTBYT                  ; 传送要写入的数据
        CLR     SCK
                                                           

        SETB    CS
        LCALL   WIP_POLL                ; 检测写入进度
        RET
;******************************************************************************************
;* RDSR_CMD: 读取状态寄存器
;* 传入参数: 无
;* 返回值: A --- 状态寄存器值
;******************************************************************************************
RDSR_CMD:
        CLR     SCK
        CLR     CS
        MOV     A, #RDSR_INST
        LCALL   OUTBYT                  ; 传送状态寄存器读取指令
        LCALL   INBYT                   ; 读取状态寄存器
        CLR     SCK
        SETB    CS
        RET
;******************************************************************************************
;* BYTE_WRITE: 单一字节写入
;* 传入参数: 无
;* 返回值: 无

;******************************************************************************************
BYTE_WRITE:
        MOV     DPTR,#BYTE_ADDR         ; 设置要写入的地址
        CLR     SCK
        CLR     CS
        MOV     A,#WRITE_INST
        MOV     B,DPH
        MOV     C,B.0
        MOV     ACC.3,C
        LCALL   OUTBYT                  ; 传送写指令和地址最高位
        MOV     A,DPL
        LCALL   OUTBYT                  ; 传送地址低字节
        MOV     A,#BYTE_DATA
        CALL    OUTBYT                  ; 传送要写入的字节数据   
	CLR     SCK
        SETB    CS
        LCALL   WIP_POLL                ; 检测写入进度
        RET

;******************************************************************************************
;* BYTE_READ: 单一字节读取
;* 传入参数: 无
;* 返回值: A --- 读取的字节

;******************************************************************************************
BYTE_READ:
        MOV     DPTR,#BYTE_ADDR         ; 设置要读取的地址
        CLR     SCK
        CLR     CS
        MOV     A,#READ_INST
        MOV     B,DPH
        MOV     C,B.0
        MOV     ACC.3,C
        LCALL   OUTBYT                  ; 传送读取指令和地址最高位
        MOV     A,      DPL
        LCALL   OUTBYT                  ; 传送地址低字节
        LCALL   INBYT                   ; 读取字节
        CLR     SCK

        SETB    CS
        RET
;******************************************************************************************
;* PAGE_WRITE: 页写入
;* 传入参数: 无
;* 返回值: 无

;******************************************************************************************
PAGE_WRITE:
        MOV     DPTR,#PAGE_ADDR         ; 设置第一个字节的地址
        CLR     SCK
        CLR     CS
        MOV     A,#WRITE_INST
        MOV     B,DPH
        MOV     C,B.0
        MOV     ACC.3,C
        LCALL   OUTBYT                  ; 传送写入指令和地址最高位
        MOV     A,DPL
        LCALL   OUTBYT                  ; 传送地址低字节
        MOV     A,#PAGE_DATA1
        LCALL   OUTBYT                  ; 传送第一个字节数据
	MOV     A,#PAGE_DATA2
        LCALL   OUTBYT                  ; 传送第二个字节数据
        MOV     A,#PAGE_DATA3
        LCALL   OUTBYT                  ; 传送第三个字节数据
        CLR     SCK
        SETB    CS
        LCALL   WIP_POLL                ; 检测写入进度
        RET

;******************************************************************************************
;* SEQU_READ: 连续读取3个字节
;* 传入参数: 无
;* 返回值: A --- 最后一次读取的字节
;******************************************************************************************
SEQU_READ:
        MOV     DPTR,#PAGE_ADDR         ; 设置第一个字节的地址
        CLR     SCK                     ;
        CLR     CS                      ;
        MOV     A,#READ_INST
        MOV     B,DPH
        MOV     C,B.0
        MOV     ACC.3,C
        LCALL   OUTBYT                  ; 传送读取指令和地址最高位
        MOV     A,DPL
        LCALL   OUTBYT                  ; 传送地址低字节
        LCALL   INBYT                   ; 读取第一个字节
        LCALL   INBYT                   ; 读取第二个字节
        LCALL   INBYT                   ; 读取第三个字节       
	CLR     SCK
        SETB    CS
        RET

;******************************************************************************************
;* RST_WDOG: 复位看门狗定时器
;* 传入参数: 无
;* 返回值: 无
;******************************************************************************************
RST_WDOG:
        CLR     CS   
        NOP
        NOP                                                        
        SETB    CS               
        RET

;******************************************************************************************
;* WIP_POLL: 写入进度查询
;* 传入参数: 无
;* 返回值: 无
;******************************************************************************************
WIP_POLL:
        MOV     R1, #MAX_POLL           ; 设置最大的查询次数
WIP_POLL1:
        LCALL   RDSR_CMD                ; 读取状态寄存器
        JNB     ACC.0,WIP_POLL2         ; 如果WIP位为'0', 则写入周期完成, 返回
        DJNZ    R1,WIP_POLL1            ; 如果WIP位为'1'并且未达到最大查询次? 则继续查询

WIP_POLL2:
        RET

;******************************************************************************************
;* OUTBYT: 传送字节示莸紼EPROM, 高位在前
;* 传入参数: A --- 要传送的字节
;* 返回值: 无
;******************************************************************************************
OUTBYT:
        MOV     R0,#08                  ; 设置数据位数
OUTBYT1:
        CLR     SCK                     ;
        RLC     A                       ;
        MOV     SI,C                    ; 传送一个位到SI
        NOP
        SETB    SCK                     ;
        DJNZ    R0,OUTBYT1              ; 判断是否传完
        CLR     SI                      ;
        RET

;******************************************************************************************
;* INBYT: 从EEPROM接收数据 高位在前
;* 传入参数: 无
;* 返回值: A --- 接收到的字节
;******************************************************************************************
INBYT:
	MOV     R0,#08                  ; 设置数据位数
INBYT1:
	SETB    SCK                     ;
	NOP
	CLR     SCK                     ;
	NOP
	MOV     C,SO                    ; 接收一个位保存到C
	RLC     A                       ;
	DJNZ    R0,INBYT1               ; 判断是否接收完
	RET
;******************************************************************************************
;* DELAY: 延时程序
;* 传入参数: 无
;* 返回值:  无
;******************************************************************************************
DELAY:					; 延时子程序
	MOV	R0,#0FFH
	MOV	R1,#0FFH
DLY_LP:
	NOP
	NOP
	DJNZ	R0,DLY_LP
	MOV	R0,#0FFH
	DJNZ	R1,DLY_LP 
	RET
              	

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -