📄 viic.asm
字号:
;程序名:虚拟IIC总线程序包
;VSDA: 虚拟IIC总线数据线
;VSCL: 虚拟IIC总线时钟线
;SLA: 寻址字节存放单元
;SLAW: 寻址字节写
;SLAR: 寻址字节读
;NUMBYT:传输字节数存放单元
;MTD: 发送数据缓冲区
;MRD: 接收数据缓冲区
;占用: F0、C、R0、R1、R2、R3、A
;VIIC1.0软件包规定了读写子程序RDNBYT/WRNBYT的惟一出口界面,因此RDNBYT/WRNBYT
;的调用操作命令,以及满足调用操作的初始化操作的三条命令为VIIC的应用界面,即:
;MOV SLA,#SLAR/SLAW ;总线上节点寻址并确定传送方向
;MOV NUMBYT,#N ;确定传送字节数N
;LCALL RDNBYT/WRNBYT ;读/写操作调用
;*********启动总线********************
STA: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSDA
NOP
NOP
NOP
NOP
CLR VSCL
RET
;**********停止总线********************
STOP: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
SETB VSDA
NOP
NOP
NOP
NOP
CLR VSDA
CLR VSCL
RET
;**********发送应答********************
MACK: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
SETB VSDA
RET
;**********发送非应答******************
MNACK: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
RET
;**********应答位检查******************
CACK: SETB VSDA
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND: CLR VSCL
RET
;**********发送一个数据字节******************
WRBYT: MOV R0,#8
WLP: RCL A
JC WR1
AJMP WR0
WLP1: DJNZ R0,WLP
RET
WR1: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WR0: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
AJMP WLP1
;**********接受一个数据字节******************
RDRYT: MOV R0,#8
RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
;**********发送N个数据字节******************
WRNBYT: MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
;**********接受N个数据字节******************
RDNBYT: MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK: LCALL MACK
INC R1
SJMP RDN1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -