📄 i2c程序.txt
字号:
*****************定义数据寄存器******************
SDA BIT P3.0
SCL BIT P3.1
ACK BIT 10H ;应答标志位
SLA DATA 50H ;器件地址字
SUBA DATA 51H ;SUBA器件子地址
*********************主程序开始******************
ORG 00H
AJMP STAR
START: SETB SDAK
NOP
SETB SCLK
NOP
NOP
NOP
NOP
CLR SDAK
NOP
NOP
NOP
NOP
NOP
CLR SCLK
NOP
RET
STOP: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCLK
NOP
NOP
RET
TACK: SETB SDA ;检查应大位子程序
NOP
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK ;判断应答位
CEND: NOP
CLR SCL
NOP
RET
NOTACK: SETB SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
WRBYT: MOV R7, #08H
WRBYT1: RLC A
JC WRBYT2
CLR SDA
SETB SCL ;发送0
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7, WRBYT1
RET
WRBYT2: SETB SDA ;发送1
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7, WRBYT1
RET
RDBYT: MOV R7, #08H
RDBYT1: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C, SDA
MOV A, R6
NOP
NOP
CLR SCL
RLC A
MOV R6, A
NOP
NOP
DJNZ R7, RDBYT1
RET
;*************************主函数*******************************
STAR: ACALL DLY5M
ACALL DLY5M
ACALL DLY5M
MOV B, P2
ACALL WR2416 ;向2401C中写数据
ACALL DLY5M
ACALL DLY5M
ACALL DLY5M
ST1: ACALL RD2416 ;从2401C中读数据
MOV A, R6
MOV P1, A
ACALL DLY5M
ACALL DLY5M
ACALL DLY5M
SJMP ST1
RD2416: MOV SLA,#0A0H
MOV SUBA,#30H
ACALL START
MOV A,SLA
ACALL WRBYT
ACALL TACK
JNB ACK,RETWRN
MOV A,SUBA
ACALL WRBYT
ACALL TACK
ACALL START ;重新启动总线
MOV SLA,#0A1H
ACALL WRBYT
ACALL TACK
JNB ACK,RD2416
ACALL RDBYT
ACALL NOTACK
ACALL STOP
ACALL DLY5M
RET
WR2416: MOV SLA,#0A0H
MOV SUBA,#30H
ACALL START
MOV A, SLA
ACALL WRBYT
ACALL TACK
JNB ACK,RETWRN ;无应答则退出
MOV A,SUBA
ACALL WRBYT
ACALL TACK
MOV A, B
ACALL WRBYT ;写入数据
ACALL TACK
JNB ACK,RETWRN
ACALL DLY5M
ACALL DLY5M
ACALL DLY5M
ACALL DLY5M
RET
RETWRN: ACALL STOP
RET
DLY1S: MOV R5, #20
D1: MOV R4, #100
D2: MOV R3, #250
DJNZ R3, $
DJNZ R4, D2
DJNZ R5, D1
RET
DLY5M: MOV R4, #10
DLY5M1: MOV R3, #248
DJNZ R3, $
DJNZ R4, DLY5M1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -