wl008.asm

来自「单片机开发资料 基于51单片机的单片机开发板 包括《实验例程」· 汇编 代码 · 共 297 行

ASM
297
字号
;********************************************************************************
;*                                                                              *
;*    File       : wl008.asm                                                    *
;*    Date       : 2004-11-5                                                    *
;*    Version    : 1.0                                                          *
;*                                                                              *
;********************************************************************************
;*    Descriptoon:                                                              *
;*                 X5045读写演示程序                                            *
;*                                                                              *
;*                                                                              *
;*                                                                              *
;********************************************************************************
NAME    WL008

CODE_SEG        SEGMENT CODE
;DATA_SEG       SEGMENT DATA
STACK_SEG       SEGMENT IDATA

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

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
        LCALL   WREN_CMD                ; 使能写入
        LCALL   WRSR_CMD                ; 写入00H到状态寄存器
        LCALL   WREN_CMD                ; 使能写入
        LCALL   BYTE_WRITE              ; 写入11H到地址55H (字节写入)
        LCALL   BYTE_READ               ; 读取地址55H处的数据(字节读取)
        LCALL   WREN_CMD                ; 使能写入
        LCALL   PAGE_WRITE              ; 页写入22H/33H/44H到地址1F0/1F1/1F2H
        LCALL   SEQU_READ               ; 连续读取地址1F0/1F1/1F2H
        LCALL   RST_WDOG                ; 清除看门狗
	LCALL	WRDI_CMD		; 写入禁止指令
        
        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
	
	END

⌨️ 快捷键说明

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