求助:关于I2C程序!
各位大虾,有个问题请教:关于I2C软件读写程序。
以下的原程序来自周立功的I2C读写的软件包,但是本人对其中的程序有点不解,请教
如下:
;读取字节子程序
;读出的值在ACC
;每取一字节要发送一个应答/非应答信号
;周立功原程序
RDBYTE: MOV R0,#08H
RLP: SETB SDA ;该处SETB SDA,我感到不理解。每次循环都把SDA置1那起不是
NOP ;会影响到后面对于总线上的数据SDA的状态,造成读取错误?
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R2 ;另我觉得没有必要用到R2,感觉冗余?
CLR SCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP
RET
;以下是我修改后的程序,能否给我点意见?
;MODIFIED BY Senvic 2003-7-5
;
;RDBYTE:MOV R0, #08H
; SETB SDA
;RLP: NOP
; NOP
; CLR SCL
; NOP
; NOP
; NOP
; NOP
; NOP
; SETB SCL
; MOV C, SDA
; RLC A
; NOP
; NOP
; DJNZ R0, RLP
; RET
; 无子地址器件写1字节数据
; 入口参数: 数据为ACC、器件从地址SLA
; 占用: A、R0、CY
;周立功原程序
IRDBYTE: LCALL START ;START总线开始的条件
MOV A,SLA ;发送器件从地址
INC A ;请问这里加一什么意思?
LCALL WRBYTE ;WRBYTE写字节子程序
LCALL CACK ;应答判断子程序,返回值为ACK
JNB ACK,RETRDB ;ACK为判断应答子程序,ACK=1有应答ACK=0无应答
LCALL RDBYTE ;进行读字节操作
LCALL MNACK ;发送非应信号
RETRDB: LCALL STOP ;结束总线
RET
发表时间:2003年7月8日13:00:33