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 + -
显示快捷键?