📄 i2c.src
字号:
;**************************************
;24c02 read/write subroutine
;**************************************
.include "define.mac"
.public WR_24C02
.public RD_24C02
.public restore
;**********************************************
I2C_start:
nop
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
and I2C_PORT,#I2C_SDA0 ;SDA=0
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
nop
ret
;***********************************************
;***********************************************
I2C_stop:
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
nop
and I2C_PORT,#I2C_SDA0 ;SDA=0
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
ret
;***********************************************
;***********************************************
I2C_ask:
nop
and I2C_PORT,#I2C_SDA0 ;SDA=0
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
nop
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
ret
;***********************************************
;***********************************************
I2C_noask:
nop
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
nop
ret
;***********************************************
;***********************************************
I2C_cack:
nop
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
ld I2C_ack_flag,#00H
tm p2,#00010000B
jr nz,I2C_nocack
ld I2C_ack_flag,#01H
I2C_nocack:
and I2C_PORT,#I2C_SCL0 ;SCL=0
nop
ret
;***********************************************
;***********************************************
WRbyte:
ld r0,#08H
wlp:
rlc I2C_wrdata
jr c,wr1
jr wr0
wr1:
or I2C_PORT,#I2C_SDA1 ;SDA=1
NOP
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
nop
nop
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
jr wlp1
wr0:
and I2C_PORT,#I2C_SDA0 ;SDA=0
NOP
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
nop
nop
nop
and I2C_PORT,#I2C_SCL0 ;SCL=0
jr wlp1
wlp1:
sub r0,#01H
jr nz,wlp
ret
;***************************************************
;***************************************************
RDbyte:
ld r0,#08H
rlp:
or I2C_PORT,#I2C_SDA1 ;SDA=1
nop
or I2C_PORT,#I2C_SCL1 ;SCL=1
nop
tm I2C_PORT,#I2C_SDA1 ;SDA=0 ?
jr z,rd_0
or I2C_rddata,#80H
jr rlp1
rd_0:
and I2C_rddata,#7FH
rlp1:
and I2C_PORT,#I2C_SCL0 ;SCL=0
rl I2C_rddata
sub r0,#01H
jr nz,rlp
ret
;***************************************************
;***************************************************
WR_24C02:
call I2C_start
ld I2C_wrdata,#0A0H ;write 24c02 dress
call WRbyte
call I2C_cack
tm I2C_ack_flag,#01H
jr z,exit_wr
ld I2C_wrdata,I2C_dress ;write eeprom dress
call WRbyte
call I2C_cack
wrdata:
ld I2C_wrdata,I2C_data ;write data to 24C02
call WRbyte
call I2C_cack
exit_wr:
call I2C_stop
ret
;***************************************************
;***************************************************
RD_24C02:
call I2C_start
ld I2C_wrdata,#0A0H ;write 24c02 dress A0H
call WRbyte
call I2C_cack
tm I2C_ack_flag,#01H
jr z,exit_rd
ld I2C_wrdata,I2C_dress ;write eeprom dress
call WRbyte
call I2C_cack
call I2C_start
ld I2C_wrdata,#0A0H ;read 24c02 dress A1H
call WRbyte
call I2C_cack
tm I2C_ack_flag,#01H
jr z,exit_rd
rddata:
call RDbyte
ld I2C_data,I2C_rddata ;save read data
call I2C_noask
exit_rd:
call I2C_stop
ret
;******************************************************
;******************************************************
restore:
ld I2C_dress,#lamp_status_dress
call RD_24C02
ld lamp_status,I2C_data
ld I2C_dress,#sound_status_dress
call RD_24C02
ld sound_status,I2C_data
ld I2C_dress,#fire_value_dress
call RD_24C02
ld fire_value,I2C_data
ld I2C_dress,#temp_value_dress
call RD_24C02
ld temp_value,I2C_data
ret
;******************************************************
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -