📄 x5045.asm
字号:
;X5045读写程序(51汇编)
WREN_INST EQU 06H;对应的是WREN指令,设置写使能锁存器(使能写操作)
WRDI_INST EQU 04H;对应的是WRDI指令,复位写使能锁存器(禁止写操作)
WRSR_INST EQU 01H;对应的是WRSR指令,写状态寄存器(看门狗和块锁)
RdsR_INST EQU 05H;对应的是RSDR指令,读状态寄存器
WRITE_INST EQU 02H;对应的是WRITE指令,从选下的地址开始写入数据至存储器阵列(1-16字节)
READ_INST EQU 03H;对应的是READ指令,
STATUS_REG EQU 30H
MAX_POLL EQU 99H
X_SO EQU P1.1;在读数据时,数据在SCK脉冲的下降沿由这个引脚送出
X_SCK EQU P1.2;串行时钟,串行时钟的上升沿通过SI引脚进行数据的输入,下降沿通过SO引脚进行数据的输出
X_CS EQU P1.0;上电之后任何操作之前,CS必须有一个高到低的过程,同时高到低过程能复位看门狗
X_SI EQU P1.3;串行输入,SI是串行数据输入端 指令码 地址 数据都通过这个引脚进行输入 在SCK的上升沿进行数据的输入 并且高位MS在前
DISM0 EQU 30H
DISM1 EQU 38H
;WP---写保护,WP引脚是低电平时,向X5645里写操作是被禁止的,但其他功能正常;
;WP引脚是高电平时,所有操作正常,包括写操作
;如果是在CS低的时候,WP变为低电平,则会中断向X5645里写操作,R
;但是如果内部的非易失性写周期已经初始化了,WP变为低电平不起作用
;RESET,复位输出 RESET是一个开漏型输出引脚 只要VCC下降到最小允许VCC值
;这个引脚就会输出高电平 一直到VCC上升超过最小允许值之后200MS,同时
;它也受看门狗定时器控制 只要看门狗处于激活状态 并且WDI引脚上电平保持
;为高或者为低超过了定时的时间 就会产生复位信号 CS引脚上的一个下降沿
;将会复位看门狗定时器 由于这是一个开漏型的输出引脚 所以在使用时必须接上拉电阻
ORG 0000H
AJMP START
ORG 0003H
LJMP ERR
NOP
NOP
LJMP ERR
ORG 000BH
LJMP ERR
NOP
NOP
LJMP ERR
ORG 0013H
LJMP ERR
NOP
NOP
LJMP ERR
ORG 001BH
LJMP ERR
NOP
NOP
LJMP ERR
ORG 0023H
LJMP ERR
NOP
NOP
LJMP ERR ;中断向量软件陷阱
ORG 0100H
START:
MOV 30H,#0AAH ; 缓存区覆初值
MOV 31H,#55H
MOV 32H,#55H
MOV 33H,#55H
MOV 34H,#55H
MOV 35H,#55H
MOV 36H,#55H
MOV 37H,#0AAH
;**********************************************************************************************
; 将CPU 首地址为DISM0连续8个字节写入x5045 的0000H~0007H单元
;**********************************************************************************************
LCALL WREN_CMD ;写允许命令
MOV R0,#DISM0
MOV R4,#08H
MOV DPTR,#0000H
LCALL BYTE_WRITE ;写存储器命令 写存储地址
;**********************************************************************************************
; 将X5045 0000H~0008H单元的数据 读到首地址为DISM1连续8个字节中
;**********************************************************************************************
LCALL WRSR_CMD ;写状态寄存器命令 (禁止写保护,禁止看门狗)
MOV DPTR,#0000H
MOV R0,#DISM1
MOV R4,#08H
LCALL BYTE_READ ;读存储器命令 读存储地址
;**********************************************************************************************
; 将CPU 首地址为DISM1连续8个字节写入x5045 的0008H~000fH单元
;**********************************************************************************************
LCALL WREN_CMD ;写允许命令
MOV R0,#DISM1
MOV R4,#08H
MOV DPTR,#0008H
LCALL BYTE_WRITE ;写存储器命令 写存储地址
sjmp $
;以下为x5045的子程序,用户可以直接调用,不用更改。
;********************************************************
RDSR_CMD: ;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
CLR X_CS
MOV A,#RDSR_INST
LCALL OUTBYT
LCALL INBYT
;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
SETB X_CS
mov 70h,a;
RET
WRSR_CMD: ;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
CLR X_CS
MOV A,#WRSR_INST
LCALL OUTBYT
MOV A,#STATUS_REG
LCALL OUTBYT
;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
SETB X_CS
ACALL WIP_POLL;----------
MOV R7,#50H
WAIT_WRITE2: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,WAIT_WRITE2
RET
WREN_CMD: ;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
CLR X_CS
MOV A,#WREN_INST
LCALL OUTBYT
;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
SETB X_CS
RET
BYTE_READ: ;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
CLR X_CS
MOV A,#READ_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
LOOP_BYTE1: LCALL INBYT
MOV @R0,A
INC R0
DJNZ R4,LOOP_BYTE1
;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
SETB X_CS
RET
BYTE_WRITE: ;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
CLR X_CS
MOV A,#WRITE_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
LOOP_BYTE: MOV A,@R0
LCALL OUTBYT
INC R0
DJNZ R4,LOOP_BYTE
;CLR X_SCK
SETB X_SCK;初始状态是为1的
NOP
NOP
NOP
SETB X_CS
ACALL WIP_POLL; ------------
MOV R7,#50H
WAIT_WRITE1:MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,WAIT_WRITE1
RET
INBYT: MOV R3,#08H
INBYT1: SETB X_SCK
NOP
NOP
NOP
CLR X_SCK
NOP
NOP
MOV C,X_SO
RLC A
DJNZ R3,INBYT1
SETB X_SO;+++++++++
RET
OUTBYT: MOV R3,#08H
OUTBYT1: CLR X_SCK
RLC A
MOV X_SI,C
NOP
NOP
NOP
SETB X_SCK
NOP
NOP
DJNZ R3,OUTBYT1
;CLR X_SI
SETB X_SI;释放总线
RET
WIP_POLL: MOV R1,#MAX_POLL
WIP_POLL1: LCALL RDSR_CMD
JNB ACC.0,WIP_POLL2
DJNZ R1,WIP_POLL1
WIP_POLL2: RET
ERR:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -