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

📄 vi2c_asm.asm

📁 I2C芯片的读写程序
💻 ASM
字号:
;--------------------------------------------------------------------------------------------------------
;VI2C_ASM.ASM
;I2C 软件包的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式
;(12 Clock)下,对主频要求是不高于12MHz(1个机器周期1us);若Fosc>12MHz
;则要增加相应的NOP指令数。在使用本软件包时,请在你的程序的未尾加入
;--------------------------------------------------------------------------------------------------------
;启动I2C总线子程序 
     
START:    	SETB  	SDA
          	NOP
          	SETB  	SCL     	;起始条件建立时间大于4.7us
          	NOP
          	NOP
          	NOP
          	NOP
          	NOP
          	CLR  	SDA      
          	NOP           		;起始条件锁定时大于4us
          	NOP
          	NOP
          	NOP
          	NOP
          	CLR   	SCL     	;钳住总线,准备发数据
          	NOP
          	RET
;--------------------------------------------------------------------------------------------------------
;结束总线子程序

STOP:     	CLR    	SDA
          	NOP
          	SETB   	SCL    		;发送结束条件的时钟信号
          	NOP           		;结束总线时间大于4us
          	NOP            
          	NOP
          	NOP
          	NOP
          	SETB  	SDA    		;结束总线
          	NOP          		;保证一个终止信号和起始信号的空闲时间大于4.7us
          	NOP
          	NOP
          	NOP
          	RET
;--------------------------------------------------------------------------------------------------------
;发送应答信号子程序

MACK:     	CLR  	SDA      	;将SDA置0 
          	NOP
          	NOP
          	SETB 	SCL
          	NOP            		;保持数据时间,即SCL为高时间大于4.7us
          	NOP
          	NOP
          	NOP
          	NOP
          	CLR  	SCL
          	NOP
          	NOP
          	RET
;--------------------------------------------------------------------------------------------------------
;发送非应答信号

MNACK:    	SETB 	SDA          	;将SDA置1 
          	NOP
          	NOP
          	SETB 	SCL
          	NOP
       	  	NOP               	;保持数据时间,即SCL为高时间大于4.7us
          	NOP
          	NOP
          	NOP
          	CLR  	SCL
          	NOP
          	NOP
          	RET
;--------------------------------------------------------------------------------------------------------
; 检查应答位子程序
; 返回值,ACK=1时表示有应答

CACK:		SETB  	SDA
        	NOP
        	NOP
        	SETB  	SCL
        	CLR   	ACK
        	NOP
        	NOP
        	MOV  	C,SDA
        	JC    	CEND
        	SETB  	ACK           	;判断应答位
CEND:		NOP
        	CLR  	SCL
        	NOP
        	RET
;--------------------------------------------------------------------------------------------------------
;发送字节子程序
;字节数据放入ACC       
;每发送一字节要调用一次CACK子程序,取应答位     
       
WRBYTE: 	MOV  	R2,#08H
WLP: 		RLC   	A              	;取数据位
        	JC     	WR1
        	SJMP  	WRO            	;判断数据位
WLP1:   	DJNZ  	R2,WLP
        	NOP
        	RET
WR1:    	SETB  	SDA            	;发送1
        	NOP
        	SETB  	SCL
        	NOP
        	NOP
        	NOP
        	NOP
        	NOP
        	CLR   	SCL
        	SJMP  	WLP1
WRO:  		CLR   	SDA            	;发送0
        	NOP
        	SETB  	SCL
        	NOP
        	NOP
        	NOP
        	NOP
        	NOP
        	CLR  	SCL
        	SJMP 	WLP1
;--------------------------------------------------------------------------------------------------------
; 无子地址器件写字节数据
; 入口参数: 数据为ACC、器件从地址SLA              
; 占用:  A、R2、CY

IWRBYTE:	NOP
		NOP
		PUSH   	ACC
IWBLOOP: 	ACALL  	START      	;起动总线
         	MOV    	A,SLA  
         	ACALL  	WRBYTE     	;发送器件从地址 
         	ACALL  	CACK
         	JNB     ACK,RETWRB     	;无应答则跳转
         	NOP
         	NOP
         	POP     ACC       	;写数据
         	LCALL  	WRBYTE
         	LCALL  	CACK
         	LCALL  	STOP
         	RET
RETWRB:  	POP     ACC
         	LCALL	STOP
         	NOP
         	NOP
         	RET
;--------------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -