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

📄 iicnet1.a51.bak

📁 at24c512 at24c1024 at24c16 at24c64 at24c32 等iiceeprom读写通用程序。
💻 BAK
📖 第 1 页 / 共 2 页
字号:
; Outputs	: None
; Register	: None
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICDelay:	
	MOV	IICDelayCo,#80H					;延时用计数器清零
	IICDelay_01:
		CPL	WDT										;喂狗
		DJNZ	IICDelayCo,IICDelay_01;判断延时计算器是否结束
RET


;---------------------------------------------------------------------------------
; Name		: IICStart
; Function	: 产生iic数据传送起始信号
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: None
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICStart:	
	SETB	SDA					;置SDA为高电平状态
	SETB	SCL					;置SCL为高电平状态
	ACALL	IICDelay			;传送半位延时
	CLR	SDA						;发出起始数据信号
	ACALL	IICDelay			;传送半位延时
	CLR	SCL						;处理时钟信号
RET									;返回


;---------------------------------------------------------------------------------
; Name		: IICStop
; Function	: 产生iic数据传送结束信号
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: None
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICStop:	
	SETB	SCL					;置SCL为高电平状态
	CLR	SDA						;置SDA为低电平状态
	ACALL	IICDelay			;传送半位延时
	SETB	SDA					;发出起始数据信号
	ACALL	IICDelay			;传送半位延时
RET									;返回




;---------------------------------------------------------------------------------
; Name		: IICWaitAck
; Function	: 产生iic数据传送起始信号等待从机(或接收器)返回一个响应信号ACK
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: C
; Return	: IICReAckB(1-操作成功,0-操作失败)
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICWaitAck:	
	CLR	SCL								;置SCL为低电平状态
	SETB	SDA							;置SDA为高电平状态,释放SDA信号线
	ACALL	IICDelay					;传送半位延时
	SETB	SCL							;置SCL为高电平状态,准备判断SDA
	ACALL	IICDelay					;传送半位延时
	MOV	IICWAD,#IICWAD_C	;初始化检测失败次数延时
	IICWAITACK_01:
		MOV	C,SDA
		JNC	IICWAITACK_03		;SDA为低电平,返回了响应信号
												;否则等待新的开始数据传输信号
		DJNZ	IICWAD,IICWAITACK_01;检测失败次数不为0循环再检测
		IICWAITACK_02:			;返回信号错误处理
				CLR	IICReAckB
				AJMP	IICWAITACK_04
				IICWAITACK_03:
				SETB	IICReAckB
				IICWAITACK_04:
			CLR	SDA						;响应信号ACK或开始数据传输
												;信号出现,将SDA置为低电平状态
			CLR	 SCL						;将SCL置为低电平状态
		IICWAITACK_END:
RET											;返回



;---------------------------------------------------------------------------------
; Name		: IICAck
; Function	: 向	IIC总线发出一个响应信号ACK
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: None
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICAck:	
	CLR	SCL						;置SCL为低电平状态
	CLR	SDA						;置SDA为低电平状态
	ACALL	IICDelay			;传送半位延时
	SETB	SCL					;释放SCL
	ACALL	IICDelay			;传送半位延时
	CLR	SCL
RET									;返回


;---------------------------------------------------------------------------------
; Name		: IICNoAck
; Function	: 向从机或接收器发出一个响应非信号ACK,使数据传送过程结束
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: None
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICNoAck:	
	CLR	SCL						;置SCL为低电平状态
	SETB	SDA						;置SDA为低电平状态
	ACALL	IICDelay			;传送半位延时
	SETB	SCL					;释放SCL
	ACALL	IICDelay			;传送半位延时
RET									;返回


;---------------------------------------------------------------------------------
; Name		: IICSendByte
; Function	: 向IIC总线发送一个8位数据
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: A C
; Return	: None
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICSendByte:	
	MOV	IICRCo,#08H			;一个字节共发送8位数据
	IICSendByte_01:			;位发送起始
		CLR	SCL						;处理时钟线使进入更改数据周期
		RLC	A							;移位输出数据到进位
		MOV	SDA,C					;进位数据输出到数据引脚
		ACALL	IICDelay			;半位延时
		SETB	SCL					;处理时钟线使进入数据有效周期
		ACALL IICDelay			;半位延时
		DJNZ IICRCo,IICSendByte_01;位发送计数
		CLR	SCL						;发送完毕时钟线处理
RET									;返回


;---------------------------------------------------------------------------------
; Name		: IICRecByet
; Function	: 向IIC总线接收一个8位数据
; Calls		: None
; Input		: None
; Outputs	: None
; Register	: A C
; Return	: IICData
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICRecByte:	
	CLR	SCL
	MOV	IICRCo,#08H			;一个字节共发送8位数据
	CLR	A								;初始化寄存器
	SETB	SDA						;释放SDA
	
	IICRecByte_01:				;位发送起始
		CLR	SCL						;处理时钟线使进入更改数据周期
		ACALL	IICDelay			;半位延时
		
		SETB	SCL					;处理时钟线使进入数据有效周期
		ACALL IICDelay			;半位延时
		MOV	C,SDA					;接收SDA数据到进位
		RLC	A							;进位数据移位到累加器

		SETB	SDA					;确认释放SDA
		
		DJNZ IICRCo,IICRecByte_01;位发送计数
		MOV	IICData,A
RET									;返回





;**********************************************************
;24c512
;**********************************************************

;---------------------------------------------------------------------------------
; Name		: IICWr512
; Function	: 向24C512的特定地址写入一个字节数据
; Calls		: IICStart IICSendByte IICWaitAck
; Input		: #C512Wr C512Ad0 C512Ad1 C512Data
; Outputs	: None
; Register	: A
; Return	: IICReAckB(1-操作成功,0-操作失败)
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICWr512:	
	ACALL	IICStart								;启动iic传送
	;发送寻址数据
	MOV	A,#C512Wr								;读取要操作的器件地址和操作方向(读/写)到累加器
	ACALL	IICSendByte						;发送累加器中的数据
	CLR	IICReAckB								;清零返回应答位
	ACALL	IICWaitAck							;等待应答动作
	JNB	IICReAckB,IICWr512END		;无应答跳转结束传送,有应答继续传送
		;发送要读写的地址
		MOV	A,C512Ad1							;取要读写的高8位地址到累加器
		ACALL	IICSendByte					;发送累加器中的数据
		CLR	IICReAckB							;清零返回应答位
		ACALL	IICWaitAck						;等待应答动作
		JNB	IICReAckB,IICWr512END	;无应答跳转结束传送,有应答继续传送
			MOV	A,C512Ad0						;取要读写的低8位地址到累加器
			ACALL	IICSendByte				;发送累加器中的数据
			CLR	IICReAckB						;清零返回应答位
			ACALL	IICWaitAck					;等待应答动作
			JNB	IICReAckB,IICWr512END;无应答跳转结束传送,有应答继续传送
				;写入数据(连续批量写入数据时可以修改该处)
				MOV	A,C512Data					;取要写入的数据到累加器
				ACALL	IICSendByte			;发送累加器中的数据
				CLR	IICReAckB					;清零返回应答位
				ACALL	IICWaitAck				;等待应答动作
				
	IICWr512END:									;无应答转入点
	
	ACALL	IICStop								;发送iic结束通讯

RET														;返回(IICReAckB)




;---------------------------------------------------------------------------------
; Name		: IICRd512
; Function	: 向24C512的特定地址读出一个字节数据
; Calls		: IICStart IICSendByte IICRecByte IICWaitAck
; Input		: #C512Wr C512Ad0 C512Ad1 #C512Re
; Outputs	: IICData
; Register	: A
; Return	: IICReAckB(1-操作成功,0-操作失败)
; Date		: 20060420 Heng
;---------------------------------------------------------------------------------
IICRd512:	
	ACALL	IICStart								;启动iic传送
	;发送寻址数据
	MOV	A,#C512Wr								;读取要操作的器件地址和操作方向(读/写)到累加器
	ACALL	IICSendByte						;发送累加器中的数据
	CLR	IICReAckB								;清零返回应答位
	ACALL	IICWaitAck							;等待应答动作
	JNB	IICReAckB,IICRd512END		;无应答跳转结束传送,有应答继续传送
		;发送要读写的地址
		MOV	A,C512Ad1							;取要读写的高8位地址到累加器
		ACALL	IICSendByte					;发送累加器中的数据
		CLR	IICReAckB							;清零返回应答位
		ACALL	IICWaitAck						;等待应答动作
		JNB	IICReAckB,IICRd512END	;无应答跳转结束传送,有应答继续传送
			MOV	A,C512Ad0						;取要读写的低8位地址到累加器
			ACALL	IICSendByte				;发送累加器中的数据
			CLR	IICReAckB						;清零返回应答位
			ACALL	IICWaitAck					;等待应答动作
			JNB	IICReAckB,IICRd512END;无应答跳转结束传送,有应答继续传送
			
				ACALL	IICStart					;启动iic传送
				;发送寻址数据
				MOV	A,#C512Rd					;读取要操作的器件地址和操作方向(读/写)到累加器
				ACALL	IICSendByte			;发送累加器中的数据
				CLR	IICReAckB					;清零返回应答位
				ACALL	IICWaitAck				;等待应答动作
				JNB	IICReAckB,IICRd512END;无应答跳转结束传送,有应答继续传送
			
				;读出数据(连续批量读出数据时可以修改该处)
				ACALL	IICRecByte				;发送累加器中的数据
				ACALL	IICNoAck					;发送不应答
				
	IICRd512END:									;无应答转入点
	
	ACALL	IICStop								;发送iic结束通讯

RET														;返回(IICReAckB)
















;*********************************************************************************
;结束
;*********************************************************************************
ORG 07FDH
LJMP 0000H

end

⌨️ 快捷键说明

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