📄 复件 zichengxu.asm
字号:
;*****************************x5045程序包****************************************************
;********************************************************************************************
wren_cmd:
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #WREN_INST ; 给A赋写允许指令(0000 0110)
lcall outbyt ; 送WREN指令
clr sck ; SCK置低
setb cs ; /CS置高
ret
;********************************************************************************************
;********************************************************************************************
;* 名称: WRDI_CMD
;* 描述: 复位写允许
;* 功能: 这段程序禁止写EEPROM存储器阵列或状态寄存器
;* 调用: outbyt
;* 输入: 无
;* 输出: 无
;* 使用寄存器: A
;********************************************************************************************
wrdi_cmd:
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #WRDI_INST ; 给A赋写禁止指令(0000 0100)
lcall outbyt ; 调用outbyt,送出WRDI指令
clr sck ; SCK置低
setb cs ; /CS置高
ret
;********************************************************************************************
;* 名称: WRSR_CMD
;* 描述: 写状态寄存器
;* 功能: 这段程序写WD0、WD1、BP0 and BP1 EEPROM
;* 调用: outbyt, wip_poll
;* 输入: 无
;* 输出: 无
;* 使用寄存器: A
;********************************************************************************************
wrsr_cmd:
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #WRSR_INST ; 写状态寄存器指令
lcall outbyt ; 送出WRSR指令
mov A, #STATUS_REG ; 写状态内容
lcall outbyt ; 送出状态寄存器内容
clr sck ; SCK置低
setb cs ; /CS置高
lcall wip_poll ; 查写周期完成否(等待写完)
ret
;********************************************************************************************
;* 名称: RDSR_CMD
;* 描述: 读状态寄存器
;* 功能: 这段程序读状态寄存器内容
;* 调用: outbyt, inbyt
;* 输入: 无
;* 输出: A = 状态寄存器
;* 使用寄存器: A
;********************************************************************************************
rdsr_cmd:
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #RDSR_INST ; 读状态寄存器指令
lcall outbyt ; 送出RDSR指令
lcall inbyt ; 读出状态寄存器
clr sck ; SCK置低
setb cs ; /CS置高
ret
;********************************************************************************************
;* 名称: BYTE_WRITE
;* 描述: 单字节写
;* 功能: 这段程序送出命令,写单个字节到EEPROM存储器阵列
;* 调用: outbyt, wip_poll
;* 输入: 无
;* 输出: 无
;* 使用寄存器: A, B
;********************************************************************************************
byte_write:
mov r1,#10h
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #WRITE_INST ; 写指令(A3不确定)
mov B, DPH
mov C, B.0
mov ACC.3, C ; 确定写哪一页
lcall outbyt ; 送出写指令(包括页地址ACC.3)
mov A, DPL
lcall outbyt ; 送出8位地址
nextwrite:
mov dps,#01h
mov dptr,#SysInitial
mov dpl1,r2
movx a,@dptr
inc dpl1
inc r2
mov dps,#00h
lcall outbyt ; 送出数据
djnz r1,nextwrite
clr sck ; SCK置低
setb cs ; /CS置高
lcall wip_poll ; 查写周期是否完成(等待写完)
ret
;********************************************************************************************
;* 名称: BYTE_READ
;* 描述: 单字节读
;* 功能: 这段程序送出命令,读EEPROM存储器中的一个字节数据
;* 调用: outbyt, inbyt
;* 输入: 无
;* 输出: A = read byte
;* 使用寄存器: A, B
;********************************************************************************************
byte_read:
mov dps,#00h
mov r1,#10h
clr sck ; SCK置低
clr cs ; /CS置低
mov A, #READ_INST ; 读指令
mov B, DPH
mov C, B.0
mov ACC.3, C ; 确定读哪一页
lcall outbyt ; 送出读指令(包括页地址AA.3)
mov A, DPL
lcall outbyt ; 送出地址(8位)
nextread:
lcall inbyt ; 读取数据
mov dps,#01h
mov dptr,#SysInitial
mov dpl1,r2
movx @dptr,a
inc dpl1
inc r2
mov dps,#00h
djnz r1,nextread
clr sck ; SCK置低
setb cs ; /CS置高
ret
;********************************************************************************************
;* 名称: WIP_POLL
;* 描述: 写进度查询
;* 功能: 这段程序通过检测状态寄存器中的WIP位,来查询非易失性写周期是否完成
;* 调用: rdsr_cmd
;* 输入: 无
;* 输出: 无
;* 使用寄存器: R1, A
;********************************************************************************************
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
;* 描述: 送一个字节给EEPROM
;* 功能: 这段程序送一个字节给EEPROM,高位(MSB)在前
;* 调用: 无
;* 输入: A (要送的字节)
;* 输出: 无
;* 使用寄存器: R0, A
;********************************************************************************************
outbyt:
mov R0, #08 ; 设置位计数器(8个)
outbyt1:
clr sck ; SCK置低
rlc A ; 带进位C字节左移
mov so, C ; 送出移出的位
setb sck ; SCK置高
djnz R0, outbyt1 ; 最后一位,则结束
clr so ; 置SI于已知状态
ret
;********************************************************************************************
;* 名称: INBYT
;* 描述: 从EEPROM接收一个字节
;* 功能: 这段程序从EEPROM接收一个字节,高字节(MSB)在前
;* 调用: 无
;* 输入: 无
;* 输出: A(接收到的字节)
;* 使用寄存器: R0, A
;********************************************************************************************
inbyt:
mov R0, #08 ; 设置位计数器(8个)
inbyt1:
setb sck ; SCK置高
clr sck ; SCK置低
mov C, so ; 接收位并存储在进位C中
rlc A ; 带进位C右移
djnz R0, inbyt1
ret
;**************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -