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

📄 i2cproc-bak.asm

📁 153控制收音5800的源码
💻 ASM
字号:
include		"I2cproc.inc"
;===============================================
;	Function:I2cDelay():;;多个延时函数共用.
;===============================================
I2cDelay:
	
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		
		

		ret

;===============================================
;	Function:I2cStart()
;===============================================
I2cStart:
		bs		SdaPort,@SDA
		bs		SclPort,@SCL
		call		I2cDelay

		bc		SdaPort,@SDA
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay

		ret



;===============================================
;	Function:I2cStop()
;===============================================
I2cStop:

		bc		SdaPort,@SDA
		call		I2cDelay
		bs		SclPort,@SCL
		call		I2cDelay
		bs		SdaPort,@SDA
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		ret

;===============================================
;	Function:I2cStop()
;===============================================
/*I2cStop:

		bc		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		bc		SdaPort,@SDA
		call		I2cDelay
		call		I2cDelay
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		bs		SdaPort,@SDA
		call		I2cDelay
		call		I2cDelay

		ret
*/


;===============================================
;	Function:I2cGetAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cGetAck:
		;Set @SDA to input Modual
		
		ior		SdaPort
		mov		IO_buff,A
		bs		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		CLR		A_buff
		call		I2cDelay

		;@SCL = 1

		bs		SclPort,@SCL
		call		I2cDelay
		;if(@SDA == 0) A_buff=(1<<ACK);
		jbs		SdaPort,@SDA
		bs		A_buff,ACK

		;@SCL = 0
		bc		SclPort,@SCL
		call		I2cDelay
		;Set @SDA output 
		ior		SdaPort
		mov		IO_buff,A
		bc		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		mov		A,A_buff
		ret



;===============================================
;	Function:I2cDoAck()
;===============================================
I2cDoAck:
		;@SDA = 0;
		bc		SdaPort,@SDA
		call		I2cDelay
		;@SCL = 1;
		bs		SclPort,@SCL
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		bs		SclPort,@SDA
		call		I2cDelay
		ret



;===============================================
;	Function:I2cDoAck()
;===============================================
I2cUnDoAck:
		;@SDA = 0;
		bs		SdaPort,@SDA
		call		I2cDelay
		bs		SclPort,@SCL
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		;@SCL = 0;
		bc		SclPort,@SDA
		call		I2cDelay
		ret

;===============================================
;	Function:I2cSendByte(A=Data)
;===============================================
I2cSendByte:
		mov		A_buff,A
		mov		A,@8
		mov		Count,A

I2cLoopSend:
		;if(A_buff & 0x80) Send1 else Send0;
		jbs		A_buff,7
		jmp		I2cSend0

I2cSend1:
		bs		SdaPort,@SDA
		jmp 		I2cSendBegin

I2cSend0:
		bc		SdaPort,@SDA

I2cSendBegin:
		call		I2cDelay

		;@SCL = 1;
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

I2cSendNext:
		;A_buff <<= 1;
		rlc		A_buff
		djz		Count
		jmp		I2cLoopSend

		ret

;===============================================
;	Function:I2cSendVByte(A=Data)
;===============================================
I2cSendVByte:
		mov		A_buff,A
		mov		A,@8
		mov		Count,A

I2cLoopSendV:
		;if(A_buff & 0x01) Send1 else Send 0;
		jbs		A_buff,0
		jmp		I2cSendV0

I2cSendV1:
		;@SDA = 1;
		bs		SdaPort,@SDA
		jmp 		I2cSendVBegin

I2cSendV0:
		;@SDA = 0
		bc		SdaPort,@SDA

I2cSendVBegin:
		call		I2cDelay
		
		;@SCL = 1
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

		;A_buff >>= 1;
		rrc		A_buff
		djz		Count
		jmp		I2cLoopSendV
		ret

;===============================================
;	Function:I2cReadByte()= A
;===============================================	
I2cReadByte:
		;Set Input @SDA
		ior		SdaPort
		mov		IO_buff,A
		bs		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		CLR		A_buff

		mov		A,@8
		mov		Count,A
I2cLoopRead:
		;@SDA = 1;
		bs		SdaPort,@SDA
		call		I2cDelay

		;@SCL = 1
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;A_buff <<= 1;
		bs		FLAG,C
		rlc		A_buff

		;if(@SDA)
		jbs		SdaPort,@SDA
		bc		A_buff,0
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

		djz		Count
		jmp		I2cLoopRead

		;Set @SDA output
		ior		SdaPort
		mov		IO_buff,A
		bc		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort
		
		mov		A,A_buff

		ret

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

	; Device Id:I2cAddr
	mov		A,@0x21;I2cDevId
	call 		I2cSendByte
	call		I2cGetAck
	jbs		A_buff,ACK
	jmp		I2cReadDone

	; SubDevice:I2cAddr
	call 		I2cReadByte
	mov		channel_cnt,a
	call		I2cDoAck
	

	; Read Data:Data
	call		I2cReadByte
	mov		channel_cnt,A
	
	call		I2cUnDoAck
	; Set Ok flag!
	mov		A,@1
	NOP

I2cReadDone:
	;call		I2cStop
	call		I2cStop
	mov		A,A_buff
	ret
	
;===============================================
;	Function:I2cWrite(I2cDevId,I2cAddr,I2cData)
;===============================================
;I2cWrite:
; 	call		I2cStart

	; Device Id : (A = I2cDevId)
;	mov		A,I2cDevId
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone
;
	; Sub Address : (A = I2cAddr)
;	mov		A,I2cAddr
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone

	; Write Data : (A = I2cData)
;	mov		A,I2cData
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone

	; return true!
;	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 + -