📄 96_25045.asm
字号:
CPU 80C196KC
;***********************************************
; X25045子程序 SJR_9900S
; _CS ==> P1.5(30), SO ==> P0.3(4)
; SI ==> P2.6(33), SCK==> P1.6(31)
;***********************************************
_CS EQU PORT1
SO EQU PORT0
SI EQU PORT2
SCK EQU PORT1
WP EQU PORT2 ;0 ENBALE
CS_L EQU 11011111B
CS_H EQU 00100000B
SI_L EQU 10111111B
SI_H EQU 01000000B
SCK_L EQU 10111111B
SCK_H EQU 01000000B
WREN EQU 00000110B ;设置写使能锁存器(准许)
WRDI EQU 00000100B ;复位写使能锁存器(禁止)
RDSR EQU 00000101B ;读状态寄存器
WRSR EQU 00000001B ;写状态寄存器
READ0 EQU 03H ;读000-0FFH
READ1 EQU 0BH ;读100-1FFH
WRITE0 EQU 02H ;写000-0FFH
WRITE1 EQU 0AH ;写100-1FFH
ADDRESS EQU 00H ;读写起始地址
;==================系统设置=================
CHECK EQU 30H
STATE1 EQU 31H
STATE2 EQU 32H
STATE3 EQU 33H
BYTE_WR_R EQU 38H
BYTE_RD_R EQU 39H
COUNT EQU 40H; 计数器
IOC2 EQU 0BH
IOC3 EQU 0CH
INT_PEND1 EQU 12H
INT_MASK1 EQU 13H
WSR EQU 14H
;====================主程序=================
ORG 2018H
DB 0CEH
ORG 2080H
DI
DPTS
LD SP,#0BEH
LDB WSR,#00H
LDB IOC0,#80H ;HSI 定义
LDB IOC1,#20H ;中断定义
LDB IOC2,#00H
LDB WSR,#01H
LDB IOC3,#00H
LDB INT_PEND1,#00H ;中断悬挂寄存器1
LDB INT_MASK1,#00H ;中断屏蔽寄存器1
LDB WSR,#00H
X25045: NOP
LCALL READ_X
SUBB CHECK,#33H
JE OUTPUT
INPUT: LCALL WRITE_X ;写入4个(CHECK[固定33H],STATE1,STATE2,STATE3)
RET
OUTPUT: LCALL READ_X ;读出4个(CHECK,STATE1,STATE2,STATE3)
RET
;-----------------------------------------------
;(1)X25045数据写入程序
; 功能:将STATE区数据写入指定地址ADDRESS开始的单元
WRITE_X:
LCALL WIP_CHK ;等待WIP=0
LCALL STARX
LCALL WREN_SR ;设置写使能
LCALL STARX
LDB BYTE_WR_R,#WRITE0 ;写最高位
SCALL BYTE_WR
LDB BYTE_WR_R,#ADDRESS ;单元地址低八位
SCALL BYTE_WR
LDB CHECK,#33H
LDB BYTE_WR_R,CHECK ;写入内容
SCALL BYTE_WR
LDB BYTE_WR_R,STATE1
SCALL BYTE_WR
LDB BYTE_WR_R,STATE2
SCALL BYTE_WR
LDB BYTE_WR_R,STATE3
SCALL BYTE_WR
LCALL WRDI_SR ;复位写使能
LCALL ENDX ;指令结束
RET
;-----------------------------------------------
;(2)X25045数据读出程序
; 功能:把指定地址ADDRESS开始的单元数据读出并放入STATE区
READ_X:
LCALL WIP_CHK ;等待WIP=0
LCALL STARX
LDB BYTE_WR_R,#READ0 ;读地址区域,最高位
SCALL BYTE_WR
LDB BYTE_WR_R,#ADDRESS ;单元地址低八位
SCALL BYTE_WR
SCALL BYTE_RD ;读出内容
LDB CHECK,BYTE_RD_R
SCALL BYTE_RD
LDB STATE1,BYTE_RD_R
SCALL BYTE_RD
LDB STATE2,BYTE_RD_R
SCALL BYTE_RD
LDB STATE3,BYTE_RD_R
LCALL ENDX
RET
;----------------------------------------------
;(3)X25045状态寄存器写入程序
; 功能:对状态寄存器进行设置(写入)。
WRITE_SR: LCALL WIP_CHK
LCALL STARX
LCALL WREN_SR
LCALL STARX
LDB BYTE_WR_R,#WRSR
SCALL BYTE_WR ;传送写状态指令
LDB BYTE_WR_R,#00111100B
SCALL BYTE_WR ;传送状态数据
LCALL WRDI_SR
LCALL ENDX
RET
;----------------------------------------------
;(4)X25045状态寄存器读出程序
; 功能:读出状态寄存器当前值。
READ_SR: LCALL STARX
LDB BYTE_WR_R,#RDSR
SCALL BYTE_WR
SCALL BYTE_RD
LCALL ENDX
RET
;-----------------------------------------------
;向X25045写入一字节数据(进口是BYTE_WR_R)
BYTE_WR: LDB COUNT,#8
BYTE_WR_1: JBS BYTE_WR_R,7,BYTE_WR_2
ANDB SI,SI_L
SJMP BYTE_WR_3
BYTE_WR_2: ORB SI,#SI_H
BYTE_WR_3: ANDB SCK,#SCK_L ;0
ORB SCK,#SCK_H ;1 上升沿锁存
SHLB BYTE_WR_R,#1
DJNZ COUNT,BYTE_WR_1
RET
;-----------------------------------------------
;从X25045读出一字节数据(出口是BYTE_RD_R)
BYTE_RD: LDB COUNT,#8
BYTE_RD_1: SHLB BYTE_RD_R,#1
ORB SCK,#SCK_H ;1
ANDB SCK,#SCK_L ;0 下降沿锁存
JBS SO,3,BYTE_RD_2 ;P0.3
ANDB BYTE_RD_R,#11111110B
SJMP BYTE_RD_3
BYTE_RD_2: ORB BYTE_RD_R,#00000001B
BYTE_RD_3: DJNZ COUNT,BYTE_RD_1
RET
RST_DOG: ORB _CS,#CS_H ;复位看门狗定时器
ANDB _CS,#CS_L
ORB _CS,#CS_H
RET
WIP_CHK: LCALL READ_SR ;等待X25045结束内部写周期
JBS BYTE_RD_R,0,WIP_CHK
RET
STARX: ORB _CS,#CS_H ;启动X25045指令
NOP ;先拉高CS,再拉低SCK,最后拉低CS
ANDB SCK,#SCK_L
ANDB _CS,#CS_L
NOP
RET
ENDX: ANDB SCK,#SCK_L ;结束X25045指令
ORB _CS,#CS_H ;先拉低SCK后拉高CS
NOP
RET
; 设置写使能锁存器(WREN_SR)
WREN_SR: LCALL READ_SR
JBS BYTE_RD_R,1,WREN_END
LCALL STARX
LDB BYTE_WR_R,#WREN
SCALL BYTE_WR
LCALL ENDX
WREN_END: RET
; 复位写使能锁存器(WRDI_SR)
WRDI_SR: LCALL READ_SR
JBC BYTE_RD_R,1,WRDI_END
LCALL STARX
LDB BYTE_WR_R,#WRDI
SCALL BYTE_WR
LCALL ENDX
WRDI_END: RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -