⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iiic.asm

📁 IIC汇编子程序 在伟福仿真器调试通过 在主程序中 直接复制即可使用!
💻 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 + -