⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.src

📁 使用三星芯片的控制程序,可供三星8位MCU初学者参考!
💻 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 + -