发布者: 未知 来源:网络
;何立民老师编写的VIIC软件包
STA: SETB VSDA;启动I2C总线
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSDA
NOP
NOP
NOP
NOP
CLR VSCL
RET
;********************
STOP:
CLR VSDA ;停止I2C总线数据传送
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,#08H ;向VSDA线上发送1个数据字节
WLP: RLC 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
RDBYT: MOV R0,#08H ;从VSDA线上读取1个数据字节
RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
WRNBYT: MOV R3,NUMBYT ;虚拟I2C总线发送N个字节数据
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
RDNBYT: MOV R3, NUMBYT ;模拟I2C总线接收n个 ;字节数据
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