📄 1.asm
字号:
SDA EQU P2.0
SCL EQU P2.1
Address EQU 08H
I2CData EQU 09H
ORG 0040H
LJMP START;转入主程序.
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#0FH
MOV P0,I2CDATA
CALL DELAY
CALL I2C_WRITE ;写入数据.
MOV I2CDATA,#0F0H
MOV P0,I2CDATA
CALL DELAY
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A ;读出数据.
MOV P0,I2CDATA
CALL DELAY
NOP
NOP
LJMP START
//*******************************************
/*------------------------------------------------------
读一个字节 Address地址 Data读出的数据
------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B ;从器件地址位是000,并且对从器件进行写操作。
;不要有所疑问为什么这么操作。因为这是一个选择性读的操作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_A ;=1,表示无确认,再次发送 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B ;//从器件地址位是000,并且对从器件进行读操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_READ_B ;//C=1转移,表示无确认,再次发送。
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
;//*******************************************************
;//*******************************************************
;接收八位数据
;//主器件接收从器件指定地址的8位数据。
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
;//*******************************************************
;//*******************************************************
;/*------------------------------------------------------
;写一个字节 Address地址 I2CDatata写入的数据
;------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START ;调用I2C总线的起始信号的程序。
MOV A,#10100000B ;从器件地址位是000,并且对从器件进行写操作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JC I2C_WRITE_A ; //=1,表示无确认,再次发送。 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
;发送开始信号
;//I2C总线的起始信号的程序。
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
;送八位数据
;//主器件送从器件8位数据。
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
;发送接收确认信号
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0 ;SDA为1跳转。
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
;发送结束信号
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
delay:
MOV R7,#0FFH
DEL1:
MOV R6,#0FFH
DEL2:
MOV R5,#10
DEL3:
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -