📄 i2c.asm
字号:
;------------------------ Subroutines for I2C ------------------------------
.equ SDA=1 ;SDA conn to pin #1
.equ SCL=0 ;SCL conn to pin #0
.equ PI2C=DDRD ;I2C Bus thrue Port D
;------------------------- Start for I2C -----------------------------------
I2CSTART: CBI PI2C,SDA ;1=>SDA
CBI PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5 mkS
SBI PI2C,SDA ;0=>SDA
rcall DL3 ;Wait 3.5 mkS
SBI PI2C,SCL ;0=>SCL
rcall DL3 ;Wait 3.5 mkS
RET
;-------------- I2C Out byte (data in R16, if ACK>0 all OK)---------------------------
I2COUT: push r17
ldi r17,9 ;9=>counter
I2Cou1: sbi PI2C,SCL ;0=>SCL
sbi PI2C,SDA ;0=>SDA
sbrc r16,7 ;if bit 7=0 then GO OVER
cbi PI2C,SDA ;Elsie 1=>SDA
rcall DL3 ;Wait 3.5mkS
lsl r16 ;Shift left r16
inc r16 ;1=>bit0/r16
cbi PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5mkS
;---------- Define ACK ------------------------
CLR ACK ;0=>fl ACK
SBIS PIND,SDA ;if ack present
SER ACK ;1=>fl ACK
;----------------------------------------------
sbi PI2C,SCL ;0=>SCL
rcall DL3 ;Wait 3.5mkS
dec r17 ;Counter=counter-1
brne I2Cou1 ;Go to continue
pop r17
RET
;------------------------ I2C IN byte (data => R16)-------------------------
I2CIN: push r17
clr r16 ;Clear I2C Data IN
ldi r17,8 ;8=>counter
I2Cin1: sbi PI2C,SCL ;0=>SCL
cbi PI2C,SDA ;1=>SDA
rcall DL3 ;Wait 3.5mkS
cbi PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5mkS
LSL R16 ;LSB=>LSB+1 ...
SBIC PIND,SDA ;SDA=>LSB R16
inc r16 ;1=>r16
sbi PI2C,SCL ;0=>SCL
rcall DL3 ;Wait 3.5mkS
dec r17 ;Counter=counter-1
brne I2Cin1 ;Go to continue
;------------ ACK ---------------------
dec ACK ;DEC ACK (Counter)
brne I2Cin3
inc ACK
cbi PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5mkS
sbi PI2C,SCL ;0=>SCL
rcall DL3
rjmp I2Cin2
I2Cin3:
inc ACK
sbi PI2C,SDA ;0=>SDA
rcall DL3 ;Wait 3.5mkS
cbi PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5mkS
sbi PI2C,SCL ;0=>SCL
rcall DL3 ;Wait 3.5mkS
I2Cin2: pop r17
RET
;------------------------- Stop for I2C -----------------------------------
I2CSTOP: SBI PI2C,SDA ;0=>SDA
CBI PI2C,SCL ;1=>SCL
rcall DL3 ;Wait 3.5 mkS
CBI PI2C,SDA ;1=>SDA
rcall DL3 ;Wait 3.5 mkS
RET
;------------------------ Time Delay 3.5 mkS -------------------------------
DL3: push r16
ldi r16,5 ; Load time constant (7)
DL31: dec r16 ;R16=R16-1
brne dl31
pop R16
RET
;---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -