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

📄 iic_a51.asm

📁 51单片机用汇编实例 包括ad
💻 ASM
字号:
;===============================================================
; 文件名称: IIC_A51.ASM
; 功能描述: IIC总线底层子程序, 时钟: 11.0592MHz
;===============================================================

SDA	BIT  P1.6
SCL	BIT  P1.7

ACK	BIT  00H

SLA	DATA 30H		; 地址
SUBA	DATA 31H		; 子地址

; 总线启动函数
START_IIC:
	SETB SDA
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR SDA
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	NOP
	NOP
	RET

; 停止总线函数
STOP_IIC:
	CLR SDA
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB SDA
	NOP
	NOP
	NOP
	NOP
	NOP
	RET

; 初始化IIC总线
INIT_IIC:
	CLR SCL
	LCALL STOP_IIC
	RET

; 字节发送函数
; 入口参数: R1
SENDBYTE:
	PUSH ACC
	MOV A, R1
	MOV R2, #8
SBYTE1:	RLC A
	JC SBYTE2
	CLR SDA
	SJMP SBYTE3
SBYTE2:	SETB SDA
SBYTE3:	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	DJNZ R2, SBYTE1

	NOP
	SETB SDA
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	JB SDA, SBYTE4
	SETB ACK
	SJMP SBYTE5
SBYTE4:	CLR ACK
SBYTE5:	NOP
	CLR SCL
	NOP
	NOP
	POP ACC
	RET

; 字节数据接收函数
; 出口参数: R1
RCVBYTE:
	PUSH ACC
	MOV A, #00H
	CLR C
	SETB SDA
	MOV R2, #8
RBYTE1:	NOP
	CLR SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	JB SDA, RBYTE2
	CLR C
	SJMP RBYTE3
RBYTE2:	SETB C
RBYTE3:	RLC A
	NOP
	NOP
	CLR SCL
	DJNZ R2, RBYTE1
	MOV R1, A
	POP ACC
	RET

; 应答子函数
ACK_IIC:
	CLR SDA
	NOP
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	NOP
	NOP
	NOP
	RET

; 非应答子函数
NACK_IIC:
	SETB SDA
	NOP
	NOP
	NOP
	SETB SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR SCL
	NOP
	NOP
	NOP
	RET

; 向有子地址器件发送多字节数据函数
SEND_STR:
	PUSH ACC
	LCALL START_IIC
	MOV R1, SLA
	LCALL SENDBYTE
	JNB ACK, SSTR2
	MOV R1, SUBA
	LCALL SENDBYTE
	JNB ACK, SSTR2
	MOV R2, #8		; 一次发送8个字节
	MOV R3, #00H
	MOV DPTR, #DTAB
SSTR1:	MOV A, R3
	MOVC A, @A+DPTR
	MOV R1, A
	LCALL SENDBYTE
	INC R3
	JNB ACK, SSTR2
	DJNZ R2, SSTR1
	LCALL STOP_IIC
SSTR2:	POP ACC
	RET

; 从有子地址器件读取多字节数据函数
; 读出数据保存到40H, 8个字节
RCV_STR:
	PUSH ACC
	LCALL START_IIC
	MOV R1, SLA
	LCALL SENDBYTE
	JNB ACK, RSTR2
	MOV R1, SUBA
	LCALL SENDBYTE
	JNB ACK, RSTR2
	LCALL START_IIC
	INC SLA
	MOV R1, SLA
	LCALL START_IIC
	JNB ACK, RSTR2
	MOV R2, #8
	MOV R0, #40H
RSTR1:	LCALL RCVBYTE
	MOV A, R1
	MOV @R0, A
	LCALL ACK_IIC
	INC R0
	DJNZ R2, RSTR1
	LCALL RCVBYTE
	MOV A, R1
	MOV @R0, A
	LCALL NACK_IIC
	LCALL STOP_IIC
RSTR2:	POP ACC
	RET

DTAB:	DB 11H,22H,33H,44H,55H,66H,77H,88H

⌨️ 快捷键说明

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