📄 up51s011.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 + -