📄 iiic.asm
字号:
SDA EQU P1.5
SCL EQU P1.4
SLA DATA 0A0H
HIGH1 DATA 00H
SUBA DATA 0A1H
ACK BIT 3H
PRM EQU 40H
START EQU 41H
B0 EQU 43H ;温度参数
S EQU 44H ;发送来的温度
RETC EQU 41H
ACK_A BIT 05H
START_I2C: SETB SDA ;发送起始条件的数据信号
NOP
SETB SCL
NOP ;起始条件建立时间大于4.7us,延时
NOP
NOP
NOP
NOP
CLR SDA ;发送起始信号
NOP ;起始条件锁定时间大于4μs
NOP
NOP
NOP
NOP
CLR SCL ;钳住I2C总线,准备发送或接收数据
NOP
NOP
RET
STOP_I2C: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
;*******************************************************************
; 向有子地址器件读取多字节数据函数
;函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
;功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
; 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
; 如果返回1表示操作成功,否则操作有误。
;注意: 使用前必须已结束总线。
;********************************************************************/
READ_RAM: LCALL START_I2C
MOV A,SLA
LCALL SENDBYTE ;发送SLA,0XA0H
JNB ACK,RET_SLA0 ;
MOV A,HIGH1
LCALL SENDBYTE ;发送HIGH,0000H
JNB ACK,RET_HIGH0
MOV A,SUBA
LCALL SENDBYTE ;发送SUBA,0XA1,0XA2,0XA3,0XA4
JNB ACK,RET_SUBA0
LCALL START_I2C
MOV SLA,A
INC A
LCALL SENDBYTE ;发送数据
JNB ACK,RET_PRM0
SETB ACK_A
LCALL ACK_I2C
LCALL STOP_I2C
RET_SLA0: MOV ADDR,#00H ;这里返回的值是主程序定义的开始标志位
RET
RET_HIGH0: MOV ADDR,#00H ;停止标志位
RET
RET_SUBA0: MOV ADDR,#00H ;0XA1,0XA2,0XA3,0XA4
RET
RET_PRM0: MOV ADDR,#00H ;返回参数0
RET
;*****************************************/
SENDBYTE: CLR SCL ;写一个字节
MOV R7,#8
SEND1: MOV C,ACC.7 ;;;;此处用的寄存器A循环未清值
MOV SDA,C
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
RL A
DJNZ R7,SEND1
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
JB SDA,ANS1
SETB ACK
AJMP ANS2
ANS1: CLR ACK
ANS2: CLR SCL
NOP
NOP
RET
;*********************************************/
RCVBYTE: MOV A,#00H ;读取一个字节
SETB SDA
NOP
NOP
MOV R7,#8
RBYTE3: CLR SCL
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
RL A
JB SDA,RBYTE1
AJMP RBYTE2
RBYTE1: INC A
RBYTE2: CLR SCL
NOP
NOP
DJNZ R7,RBYTE3
CLR SCL
NOP
NOP
MOV RETC,A ;RETC就是C程序中的d,I2C中的
RET
;*************************************/
ACK_I2C: JNB ACK_A,SEND_ANS1
SETB SDA
AJMP SEND_ANS2
SEND_ANS1: CLR SDA
SEND_ANS2: NOP
NOP
NOP
SETB SCL
NOP ; 时钟低电平周期大于4μs
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;****************************************/
ISENDSTR: LCALL START_I2C
MOV A,SLA
LCALL SENDBYTE ;发送器件地址SLA,0XA0H
JNB ACK,RETB0_SLA0 ;
MOV A,HIGH1
LCALL SENDBYTE ;发送器件子地址HIGH,0000H
JNB ACK,RETB0_HIGH0
MOV A,SUBA
LCALL SENDBYTE ;发送器件子地址SUBA,0XA1,0XA2,0XA3,0XA4
JNB ACK,RETB0_SUBA0
MOV A,S ;S位18B20发送来的温度
LCALL SENDBYTE ;发送数据
JNB ACK,RETB0_PRM0
RET
RETB0_SLA0: MOV B0,#00H ;这里返回的值是主程序定义的标志位,b0未定义
RET
RETB0_HIGH0:MOV B0,#00H
RET
RETB0_SUBA0:MOV B0,#00H
RET
RETB0_PRM0: MOV B0,#00H
RET
END
;*****************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -