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

📄 i2cproc.h

📁 EM78P153源代码,含24C02,I2C,以及1418FM发射模块控制部分!
💻 H
字号:
;===============================================
;	Function:I2cDelay():多个延时函数共用.
;===============================================
I2cDelay:
SpiDelay:
LcdDelay:
		WDTC

		NOP
		NOP
		NOP
		NOP
		NOP

		NOP
		NOP
		NOP
		NOP
		NOP

		NOP
		NOP
		NOP
		NOP
		NOP

		NOP
		NOP
		NOP
		NOP
		NOP
		
		RET

;===============================================
;	Function:I2cStart():SCL为高时,SDA由高到低
;===============================================
I2cStart:
		BS		I2cPort,SDA
		CALL	I2cDelay

		BS		I2cPort,SCL
		CALL	I2cDelay

		BC		I2cPort,SDA
		CALL	I2cDelay

		BC		I2cPort,SCL
		CALL	I2cDelay
		RET

;===============================================
;	Function:I2cStop():SCL为高时,SDA由低到高
;===============================================
I2cStop:
		BC		I2cPort,SCL
		CALL	I2cDelay

		BC		I2cPort,SDA
		CALL	I2cDelay

		BS		I2cPort,SCL
		CALL	I2cDelay

		BS		I2cPort,SDA
		CALL	I2cDelay

		RET

;===============================================
;	Function:I2cGetAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cGetAck:
		;		SDA输入模式
		IOR		I2cPort
		OR		A,@OI2c_SDA
		IOW		I2cPort

		CLR		A_buff
		
		;		时钟拉高,开始读数据
		BS		I2cPort,SCL
		CALL	I2cDelay
		CALL	I2cDelay

		;		SDA	为低就是应答,否则不是
		JBS		I2cPort,SDA
		BS		A_buff,ACK

		BC		I2cPort,SCL
		CALL	I2cDelay

		;		切换为SDA输出模式
		IOR		I2cPort
		AND		A,@AI2c_SDA
		IOW		I2cPort
		
		MOV		A,A_buff
		RET

;===============================================
;	Function:I2cDoAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cDoAck:
		;		数据置高,准备输入
		BC		I2cPort,SDA
		CALL	I2cDelay

		;		时钟拉高,数据的低表示ACK信号
		BS		I2cPort,SCL
		CALL	I2cDelay
		CALL	I2cDelay

		BC		I2cPort,SCL
		CALL	I2cDelay
		
		RET

;===============================================
;	Function:I2cSendByte(A=Data)
;===============================================
I2cSendByte:
		MOV		A_buff,A
		MOV		A,@8
		MOV		N1,A

I2cLoopSend:
		JBS		A_buff,7
		JMP		I2cSend0
		
I2cSend1:
		BS		I2cPort,SDA
		JMP 	I2cSendBegin

I2cSend0:
		BC		I2cPort,SDA

I2cSendBegin:
		CALL	I2cDelay

		BS		I2cPort,SCL
		CALL	I2cDelay
		CALL	I2cDelay

		BC		I2cPort,SCL
		CALL	I2cDelay

I2cSendNext:
		RLC		A_buff
		DJZ		N1
		JMP		I2cLoopSend

I2cSendDone:
		RET

;===============================================
;	Function:I2cReadByte()= A
;===============================================	
I2cReadByte:
		IOR		I2cPort
		OR		A,@OI2c_SDA
		IOW		I2cPort

		CLR		A_buff

		MOV		A,@8
		MOV		N1,A
I2cLoopRead:
		;	数据置高,准备读数据
		BS		I2cPort,SDA
		CALL	I2cDelay

		;	时钟置高,开始读
		BS		I2cPort,SCL
		CALL	I2cDelay

		;	设进位标志,准备移进入低位1
		BS		STATU,C
		RLC		A_buff

		;	读数据,
		JBS		I2cPort,SDA
		BC		A_buff,0
		CALL	I2cDelay

		;	数据读取完毕		
		BC		I2cPort,SCL
		CALL	I2cDelay

		DJZ		N1
		JMP		I2cLoopRead

		;	数据置为输出
		IOR		I2cPort
		AND		A,@AI2c_SDA
		IOW		I2cPort
		
		MOV		A,A_buff
		RET

;**********************************************
;*	下面是标准协议,可以用于标准I2C传输
;**********************************************
;==============================================
;	Function:I2cRead(I2cDevId,I2cAddr) Return(I2cData)
;===============================================
I2cRead:
 	CALL	I2cStart

	; Device Id:0xa0
	MOV		A,I2cDevId
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cReadDone
		
	; SubDevice:Addr
	MOV		A,I2cAddr
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cReadDone

 	CALL	I2cStart

	; Device Id:0xa1
	MOV		A,I2cDevId
	OR		A,@0x01
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cReadDone

	; Read Data:Data
	CALL	I2cReadByte
	MOV		I2cData,A

	; Set Ok flag!
	MOV		A,@1
	NOP

I2cReadDone:
	CALL	I2cStop
	MOV		A,A_buff
	RET
	
;===============================================
;	Function:I2cWrite(I2cDevId,I2cAddr,I2cData)
;===============================================
I2cWrite:
 	CALL	I2cStart

	; Device Id : I2cDevId
	MOV		A,I2cDevId
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cWriteDone

	; Sub Address : I2cAddr
	MOV		A,I2cAddr
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cWriteDone

	; Write Data : I2cData
	MOV		A,I2cData
	CALL 	I2cSendByte
	CALL	I2cGetAck
	JBS		A_buff,ACK
	JMP		I2cWriteDone

	MOV		A,@1
	NOP

I2cWriteDone:
	CALL	I2cStop
	MOV		A,A_buff
	RET
;===============================================
;	END OF I2C
;===============================================

⌨️ 快捷键说明

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