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

📄 i2c.asm

📁 24c04应用系统
💻 ASM
字号:
;--------------------------------------------------
;程序功能:将单片机内部数据存储器中30H-3FH中的数据写入24C04中
;	   30H开始的16个连续存储单元中;从24C04中30H-3F中读取数据
;	   存储到单片机中从40H开始的16个存储单元中,并显示读出的值
;入口参数:写操作:单片机内部数据存储器中30H-3FH中的数据 读操作:24C04中30H-3FH
;出口参数:写操作:24C04中30H-3FH			读操作:单片机内部数据存储器40H-4FH
;程序编写:zqp
;创建时间:2007-8-11
;联系方式:QQ:30871641
;修改日志:
;    NO.1:增加数码管数据显示子程序 2007-8-18
;    NO.2: MOV NUMBYTE,#8 24C04只能连续写入8个字节? 2007-8-19
;---------------------------------------------------
	ACK	BIT	10H	;应答标志位

	SLA  	DATA	50H	;器件地址字
	SUBA	DATA	51H	;器件子地址

	NUMBYTE	DATA	52H	;读/写字节数

	SDA	BIT	P1.5
	SCL	BIT	P1.4	;I2C总线定义

	MTD	EQU	30H	;发送数据缓存区首地址(30H-3FH)
	MRD	EQU	40H	;接收数据缓存区首地址(40H-4FH)

	;显示缓冲区定义
	displaybuf0 EQU 70H 
	displaybuf1 EQU 71H
	displaybuf2 EQU 72H
	displaybuf3 EQU 73H
	displaybuf4 EQU 74H
	displaybuf5 EQU 75H

	AJMP	MAIN
	ORG	80H
;--------------------------------------------------
;程序名称:IWRNBYTE
;程序功能:向器件指定子地址写N个数据
;入口参数:器件地址字SLA,子地址SUBA,发送数据缓冲区MTD,发送字节数NUMBYTE
;出口参数:
;---------------------------------------------------
IWRNBYTE:
	MOV	R3,NUMBYTE	;发送字节数NUMBYTE
	LCALL	START		;启动总线

	MOV	A,SLA		;器件地址字SLA
	LCALL	WRBYTE		;发送器件地址字

	LCALL	CACK
	JNB	ACK,RETWRN	;无应答则退出
	MOV	A,SUBA		;指定子地址
	LCALL	WRBYTE
	LCALL	CACK
	MOV	R1,#MTD
WRDA:	MOV	A,@R1
	LCALL	WRBYTE		;开始写入数据
	LCALL	CACK
	JNB	ACK,IWRNBYTE
	INC	R1
	DJNZ	R3,WRDA		;判断是否写完
RETWRN:	LCALL	STOP
	RET
;--------------------------------------------------
;程序名称:IRDNBYTE
;程序功能:从器件指定子地址读取N个数据
;入口参数:器件地址字SLA,子地址SUBA,接收字节数NUMBYTE
;出口参数:接收数据缓存区MRD
;---------------------------------------------------
IRDNBYTE:
	MOV	R3,NUMBYTE
	LCALL	START

	MOV	A,SLA
	LCALL	WRBYTE		;发送器件地址字

	LCALL	CACK
	JNB	ACK,RETRDN
	MOV	A,SUBA		;指定子地址
	LCALL	WRBYTE
	LCALL	CACK
	LCALL	START		;重新启动总线
	MOV	A,SLA
	INC	A		;准备进行读操作
	LCALL	WRBYTE
	LCALL	CACK
	JNB	ACK,IRDNBYTE

	MOV	R1,#MRD
RON1:	LCALL	RDBYTE		;读操作开始
	MOV	@R1,A
	DJNZ	R3,SACK
	LCALL	MNACK		;最后一字节发非应答位
RETRDN:	LCALL	STOP
	RET
SACK:	LCALL	MACK
	INC	R1
	SJMP	RON1	
;--------------------------------------------------
;程序名称:START
;程序功能:启动I2C总线子程序—发送I2C总线起始条件
;入口参数:
;出口参数:
;---------------------------------------------------
START:	SETB	SDA	;发送起始条件数据信号
	NOP		;起始条件建立时间大于4.7us
   	SETB	SCL	;发送起始条件的时钟信号
	NOP
	NOP
	NOP
	NOP
	NOP		;起始条件锁定时间大于4.7us
   	CLR  	SDA	;发送起始信号
	NOP
	NOP
	NOP
	NOP		;起始条件锁定时间大于4.7us
   	CLR	SCL	;钳住I2C总线,准备发送或接收数据
   	NOP
   	RET
;--------------------------------------------------
;程序名称:STOP
;程序功能:停止I2C总线子程序—发送I2C总线停止条件
;入口参数:
;出口参数:
;---------------------------------------------------
STOP:	CLR  	SDA 	;发送停止条件的数据信号
	NOP			   	
	NOP
	SETB  	SCL 	;发送停止条件的时钟信号
	NOP
	NOP
	NOP
	NOP
	NOP		;起始条件建立时间大于4.7us
	SETB 	SDA 	;发送I2C总线停止信号
	NOP
	NOP
	NOP
	NOP
	NOP		;延迟时间大于4.7us
	RET
;--------------------------------------------------
;程序名称:MACK
;程序功能:发送应答信号子程序
;入口参数:
;出口参数:
;---------------------------------------------------
MACK:	CLR	SDA	;将SDA置0
	NOP
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP		;保持数据时间,大于4.7us
	CLR	SCL
	NOP
	NOP
	RET
;--------------------------------------------------
;程序名称:MNACK
;程序功能:发送非应答信号子程序
;入口参数:
;出口参数:
;---------------------------------------------------
MNACK:	SETB	SDA	;将SDA置1
	NOP
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL	;保持数据时间,大于4.7us
	NOP
	NOP
	RET
;--------------------------------------------------
;程序名称:CACK
;程序功能:检查应答位子程序
;入口参数:
;出口参数: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
;--------------------------------------------------
;程序名称:WRBYTE
;程序功能:发送字节子程序
;入口参数:字节数据放入ACC
;出口参数:SDA
;---------------------------------------------------
WRBYTE:	MOV	R0,#08H
WLP:	RLC	A	;取数据位
	JC	WRI
	SJMP	WRO	;判断数据位
WLP1:	DJNZ	R0,WLP
	NOP
	RET
WRI:	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
;--------------------------------------------------
;程序名称:RDBYTE
;程序功能:读取字节子程序
;入口参数:SDA
;出口参数:读出的数据存放在ACC
;---------------------------------------------------
RDBYTE:	MOV	R0,#08H
RLP:	SETB	SDA
	NOP
	SETB	SCL	;时钟线为高,接收数据位
	NOP
	NOP
	MOV	C,SDA	;读取数据位
	MOV	A,R2
	CLR	SCL	;将SCL拉低,时间大于4.7us
	RLC	A	;进行数据位的处理
	MOV	R2,A
	NOP
	NOP
	NOP
	DJNZ	R0,RLP	;未够8位,继续读入
	RET
;--------------------------------------------------
;程序名称:MAIN
;程序功能:初始化 、向24C01C中写数据 、从24C01C中读数据、显示数据
;入口参数:写:单片机中30H-3FH		   读:24C01C中30H开始的16个字节
;出口参数:写:24C01C中30H开始的16个字节   读:单片机中40H-4FH
;---------------------------------------------------
MAIN:	MOV	R4,#0F0H	;延时,等待其它芯片复位完成
	DJNZ	R4,$
				
	MOV	A,#00h		;发送数据缓存区初始化,将16个连续字节分别赋值为00H到0FH
	MOV	R0,#30H
S1:	MOV	@R0,A
	INC	R0
	INC	A
	CJNE	R0,#40H,S1

;--------------------------------------------------			 	
WRITE:	MOV	SLA,#0A0H	;向24C01C中写数据,数据存放在24C01C中30H开始的16个字节中,24C01C地址字,写操作
	MOV	SUBA,#30H	;目标地址
	MOV 	NUMBYTE,#8	;MOV	NUMBYTE,#16	;字节数
	LCALL	IWRNBYTE	;写数据
;--------------------------------------------------	
DELAY:	MOV	R5,#20		;延时
D1:	MOV	R6,#248
D2:	MOV	R7,#248
	DJNZ	R7,$
	DJNZ	R6,D2
	DJNZ	R5,D1
;--------------------------------------------------
READ:	MOV	SLA,#0A0H	;从24C01C中读数据,数据送AT89C51中40H开始的16个字节中,24C01C地址字,伪写入操作
	MOV	SUBA,#30H	;目标地址
	MOV NUMBYTE,#16;MOV	NUMBYTE,#16	;字节数
	LCALL	IRDNBYTE	;读数据
;--------------------------------------------------
;程序功能:数码管数据显示(适用于:动态扫描方式 共阴数码管)
;入口参数:要显示的数据依次存放在显示缓冲区:70H—75H六个存储单元中,
;出口参数:显示数据端口占用:P2口 ,位选通:P0
;程序编写:zqp
;创建时间:2006-11-29
;修改日志:
;    NO.1:显示数据端口占用:P2口 ,位选通:P0
;---------------------------------------------------
MOV displaybuf0, 40H	;显示缓冲区送数据
MOV displaybuf1, 41H
MOV displaybuf2, 42H
MOV displaybuf3, 43H
MOV displaybuf4, 44H
MOV displaybuf5, 45H
;---------------------------------------------------
DISPLAY:
        MOV A,displaybuf0 ;待显示的数码送累加器A
        MOV DPTR,#TAB	  ;共阴显示代码表的首地址送DPTR
        MOVC A,@A+DPTR	  ;根据待显示的数据找到其对应的共阴显示代码并送到
        MOV P2,A	  ;把待显示的数据对应的共阴显示代码送到P2口
        CLR P0.5          ;选通最高位
        LCALL DELY10MS	  ;延时显示一段时间
        SETB P0.5	  ;关闭显示

        MOV A,displaybuf1
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P2,A
        CLR P0.4          ;
        LCALL DELY10MS
        SETB P0.4

        MOV A,displaybuf2
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P2,A
        CLR P0.3          ;
        LCALL DELY10MS
        SETB P0.3

        MOV A,displaybuf3
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P2,A
        CLR P0.2         ;选通第四位
        LCALL DELY10MS
        SETB P0.2

	MOV A,displaybuf4
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P2,A
        CLR P0.1          ;选通第五位
        LCALL DELY10MS
        SETB P0.1

	MOV A,displaybuf5
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV P2,A
        CLR P0.0         ;选通第六位
        LCALL DELY10MS
        SETB P0.0
        ljmp DISPLAY	;重复执行显示程序
TAB:
 DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,079H  
;共阴显示代码分别对应:0 1 2 3 4 5 6 7 8 9  灭 E
;---------------------------------------------------
;延时程序(按12MHz计算)
;---------------------------------------------------
DELY10MS:MOV R6,#2 
Dl:	 MOV R7,#248 
	 DJNZ R7,$ 
	 DJNZ R6,Dl
	 RET 
	 
;---------------------------------------------------

	END

⌨️ 快捷键说明

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