📄 iicrount.asm
字号:
;晶振为12Mhz,相应机器周期为1us,应修改相应NOP指令个数
NAME IICRount
SCL BIT P1.3
SDA BIT P1.4
?PR?STA?IICRount SEGMENT CODE
?PR?STOP?IICRount SEGMENT CODE
?PR?CACK?IICRount SEGMENT CODE
?PR?MACK?IICRount SEGMENT CODE
?PR?MNACK?IICRount SEGMENT CODE
?PR?WRBYT?IICRount SEGMENT CODE
?PR?RDBYT?IICRount SEGMENT CODE
;?PR?_WRNBYT?IICRount SEGMENT CODE
?PR?_RDNBYT?IICRount SEGMENT CODE
?PR?_WRADR?IICRount SEGMENT CODE
?PR?_RDADR?IICRount SEGMENT CODE
?DT?_WRADR?IICRount SEGMENT DATA OVERLAYABLE ;定义可覆盖局部数据段
?DT?_RDADR?IICRount SEGMENT DATA OVERLAYABLE
PUBLIC STA,STOP,CACK,MACK,MNACK,WRBYT,RDBYT,_RDADR,_WRADR,_RDNBYT ;,_WRNBYT
PUBLIC ?_WRADR?BYTE
PUBLIC ?_RDADR?BYTE
RSEG ?DT?_WRADR?IICRount
?_WRADR?BYTE:
ORG 4
subadr_w?00: DS 1
RSEG ?DT?_RDADR?IICRount
?_RDADR?BYTE:
ORG 4
subadr_r?00: DS 1
;-------------------------------------------
RSEG ?PR?STA?IICRount
STA: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
;-------------------------------------------
RSEG ?PR?STOP?IICRount
STOP: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
;--------------------------------------------
RSEG ?PR?MACK?IICRount
MACK: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
SETB SDA
RET
;--------------------------------------------
RSEG ?PR?MNACK?IICRount
MNACK:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
RET
;---------------------------------------------
RSEG ?PR?CACK?IICRount
CACK: SETB SDA
SETB SCL
CLR F0
MOV A,P1
JNB ACC.4,CEND ;数据线SDA被器件拉低
SETB F0
CEND: CLR SCL
NOP
RET
;---------------------------------------------
RSEG ?PR?WRBYT?IICRount
WRBYT:MOV R3,#08H ;发送ACC中一字节数据
WLP: RLC A
JC WLR1
JMP WLR0
WLP1: DJNZ R3,WLP
RET
WLR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
AJMP WLP1
WLR0: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
AJMP WLP1
;----------------------------------------------
RSEG ?PR?RDBYT?IICRount
RDBYT:MOV R3,#08 ;接收一字节,放ACC
RLP: SETB SDA
SETB SCL
MOV A,P1
JNB ACC.4,RD0
AJMP RD1
RLP1: DJNZ R3,RLP
MOV A,R2
RET
RD0: CLR C
MOV A,R2
RLC A
MOV R2,A
CLR SCL
AJMP RLP1
RD1: SETB C
MOV A,R2
RLC A
MOV R2,A
CLR SCL
AJMP RLP1
;---------------------------------------------
;功能:发送数据到指定EEPROM地址
;入口:R7存放数据缓冲区首地址,
; R5存放数据长度
;---------------------------------------------
RSEG ?PR?_WRADR?IICRount ;发送数据到指定EEPROM地址
_WRADR:PUSH PSW ;发送数据缓冲区地址参数在R1<低字节>,R2<高>中
MOV R7,subadr_w?00 ;长度参数在数据段中,EEPROM写地址参数在R5中
WADB: LCALL STA
MOV A,#0A0H
LCALL WRBYT
LCALL CACK
JB F0,WADB
MOV A,R5 ;发送写EEPROM数据地址
LCALL WRBYT
LCALL CACK
JB F0,WADB
WADA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WADB
INC R1
DJNZ R7,WADA ;R5存放数据长度
LCALL STOP
POP PSW
RET
;---------------------------------------------
;功能:发送数据到默认EEPROM地址
;入口:R7存放数据缓冲区首地址,
; R5存放数据长度
;---------------------------------------------
;RSEG ?PR?_WRNBYT?IICRount
;_WRNBYT:PUSH PSW
; MOV A,R1 ;R1(低字节),R2(高字节)存放数据缓冲区首地址
; MOV DPL,A
; MOV A,R2
; MOV DPH,A
; MOV R3,#00
;WRDB: LCALL STA
; MOV A,#0A0H
; LCALL WRBYT
; LCALL CACK
; JB F0,WRDB
;WRDA: MOV A,R3
; MOVC A,@A+DPTR
; LCALL WRBYT
; LCALL CACK
; JB F0,WRDB
; INC R3
; DJNZ R5,WRDA ;R5存放数据长度
; LCALL STOP
; POP PSW
; RET
;---------------------------------------------
;功能:读取指定EEPROM地址数据
;入口:R7存放数据缓冲区首地址,
; R5存放数据长度
;---------------------------------------------
RSEG ?PR?_RDADR?IICRount
_RDADR:PUSH PSW ;数据缓冲区地址参数在R1<低〉>,R2<高>中
MOV R7,subadr_r?00
RDN0: LCALL STA ;数据长度参数在R5中
MOV A,#0A0H
LCALL WRBYT
LCALL CACK
JB F0,RDN0
MOV A,R5 ;发送读数据地址
LCALL WRBYT
LCALL CACK
JB F0,RDN0
LCALL STA
MOV A,#0A1H
LCALL WRBYT
LCALL CACK
JB F0,RDN0
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R7,RDN2
LCALL MNACK
LCALL STOP
POP PSW
RET
RDN2: LCALL MACK
INC R1
SJMP RDN1
;---------------------------------------------
;功能:读取默认EEPROM地址数据
;入口:R7存放数据缓冲区首地址,
; R5存放数据长度
;---------------------------------------------
RSEG ?PR?_RDNBYT?IICRount
_RDNBYT:PUSH PSW ;数据缓冲区地址参数在R1<低〉>,R2<高>中
RAN0: LCALL STA ;数据长度参数在R5中
MOV A,#0A1H
LCALL WRBYT
LCALL CACK
JB F0,RAN0
RAN1: LCALL RDBYT
MOV @R1,A
DJNZ R5,RAN2
LCALL MNACK
LCALL STOP
POP PSW
RET
RAN2: LCALL MACK
INC R1
SJMP RAN1
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -