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

📄 at24c128.asm

📁 at24c128读写源程序.用ASM写的C函数
💻 ASM
字号:
;*************************************************************************
;文件:at24c128.asm
;功能:读/写24c128
;设计:裴洪广
;时间:2006年4月5日
;说明:	注意事项:
	;1. 24c128每次最多读/写256个字节
	;2. 在连续读/写时,如果数据地址已经到FFH时,将返回到00H操作,所以
	;	256-数据地址>=字节数
	;3. 24c128共有256页(每页64字节),地址为0~0x3fff
;*************************************************************************
;子程序定义

;bit wr24c128(uchar num,uint addr,uchar *da);//字节数,块地址,数据地址
;bit rd24c128(uchar num,uint addr,uchar *da);//操作成功返回1,否则返回0

; 参数:

; R7 		字节数
; R4,R5		存储起始地址(R4:地址高8位,R5:地址低8位)
; R1,R2,R3	数据缓冲地址(MEM TYPE IN R3,MSB R2,LSB R1)
; T0计数器	写超时计时(16位计时,不能小于10MS)

I2C_SCL	BIT	P1.1	;时钟线引脚
I2C_SDA	BIT	P1.2	;数据线引脚
DATA_WP	BIT	P1.0	;写保护引脚

;================================================

; 定义代码段
?PR?_wr24c128?at24c128 segment code
?PR?_rd24c128?at24c128 segment code
; 定义数据段
?DT?_wr24c128?at24c128 segment data overlayable
?BI?_wr24c128?at24c128 segment bit overlayable

	public _wr24c128	;输出函数名
	public _rd24c128

	EXTRN	CODE (delayms)
	EXTRN	DATA (?delayms?BYTE)


rseg ?DT?_wr24c128?at24c128
?_wr24c128?BYTE:
	pagenum:	DS   1	;页数(每页64字节)
	sparebyte:	DS   1	;最后一页字节数

rseg ?BI?_wr24c128?at24c128
?_wr24c128?bit:
	no_ack_f:	dbit 1	;应答标志位
	c_pagenum_f:	dbit 1	;计算页号标志位
	wr_end_f:	dbit 1	;写结束标志位


;================================================
;向24c128存入数据

rseg ?PR?_wr24c128?at24c128
;cseg at 100h
_WR24c128:
	CLR	DATA_WP	;写允许
 	CLR	C_PAGENUM_F	;复位计算页号
        CLR	WR_END_F   	;复位写结束
WR_PAGE_LOOP:
 	MOV	A,#0A0H
 	LCALL	SEND_START		;发送块号及写控制字
	JB	NO_ACK_F,SD_EX       	;没有应答则跳出
	mov	a,r4
	lcall	send_byte		;发送地址1
	JB	NO_ACK_F,SD_EX       	;没有应答则跳出
	MOV	A,R5
	LCALL	SEND_BYTE		;发送地址2
	JB	NO_ACK_F,SD_EX       	;没有应答则跳出
	JB	WR_END_F,SD_LOOP	;写结束?
	LCALL	C_PAGENUM
SD_LOOP:
 	MOV	A,@R1
 	LCALL	SEND_BYTE;发送数据
 	INC	R1
 	JB	NO_ACK_F,SD_EX       	;没有应答则跳出
 	DJNZ	R7,SD_LOOP
        LCALL   SEND_STOP
        mov	?delayms?byte,#20	;写延时10MS
        lcall	delayms
 	JB	WR_END_F,SD_EX;写结束?
 	DJNZ	pagenum,WR_PAGE_LOOP
 	SETB	WR_END_F		;置位写结束
 	MOV	A,sparebyte
        JZ      SD_EX
 	MOV	r7,A
 	AJMP	WR_PAGE_LOOP
SD_EX:
	LCALL	SEND_STOP
	CPL	NO_ACK_F
	MOV	C,NO_ACK_F		;成功:返回1
 	SETB	DATA_WP			;写保护
 	RET

;计算页号
C_PAGENUM:
	MOV	A,R5
	MOV	B,#64
	DIV	AB
	MOV	A,#64
	CLR	C
	SUBB	A,B
	PUSH	ACC
        MOV     B,A
	JB	C_PAGENUM_F,C_PAGENUM_END
	MOV	A,R7
	CLR	C
	SUBB	A,B
        JZ      LASTPAGE	;若A=B,则只有一页
	JC	LASTPAGE	;若A<B,则只有一页
	MOV	B,#64
	DIV	AB
	ADD	A,#1
	MOV	pagenum,A	;写满页的次数
	MOV	sparebyte,B	;写最后一页的字节数
	SETB	C_PAGENUM_F
C_PAGENUM_END:
	POP	ACC
	MOV	R7,A		;写页的字节数
	ADD	A,R5
	MOV	R5,A		;计算起始地址
	RET
LASTPAGE:
	SETB	WR_END_F	;置位写结束
	POP	ACC
	RET

;================================================
;从24c128读出数据

rseg ?PR?_rd24c128?at24c128

_RD24c128:
	MOV	A,#0A0H
        LCALL	SEND_START	;发送块号及写控制字
	JB	NO_ACK_F,RD_EX
        MOV	A,R4
 	LCALL	SEND_BYTE	;地址1
  	JB	NO_ACK_F,RD_EX
        MOV	A,R5
 	LCALL	SEND_BYTE	;地址2
  	JB	NO_ACK_F,RD_EX

	MOV	A,#0A1H
	LCALL	SEND_START	;发送块号及读控制字
 	JB	NO_ACK_F,RD_EX
RD_LOOP:
 	LCALL	RECV_BYTE	;接收数据
 	MOV	@R1,A
 	INC	R1
 	DJNZ	R7,RD_LOOP
RD_EX:
 	LCALL	SEND_STOP
	CPL	NO_ACK_F
	MOV	C,NO_ACK_F	;成功:返回1
 	RET
;================================================
;启动24c128

SEND_START:

 	CLR	NO_ACK_F
 	LCALL	RELEASE_SCL_HIGH
 	SETB	I2C_SDA
	CLR	I2C_SDA
 	LCALL	DELAY_2US
 	CLR	I2C_SCL
 	LCALL	DELAY_2US
 	LCALL	SEND_BYTE
 	RET

;================================================
;送出一个字节数据

SEND_BYTE:
 	MOV	R2,#8
SB_LOOP:
	RLC	A
 	MOV	I2C_SDA,C
 	LCALL	RELEASE_SCL_HIGH
 	LCALL	DELAY_2US
 	CLR	I2C_SCL
 	LCALL	DELAY_2US
 	DJNZ	R2,SB_LOOP
 	SETB	I2C_SDA
 	LCALL	RELEASE_SCL_HIGH
 	LCALL	DELAY_3US
 	JNB	I2C_SDA,SB_EX
 	SETB	NO_ACK_F
SB_EX:
	CLR	I2C_SCL
 	LCALL	DELAY_2US
 	RET
;================================================
;接收一个字节数据

RECV_BYTE:
 	MOV	R2,#8
RB_LOOP:
 	LCALL	RELEASE_SCL_HIGH
 	LCALL	DELAY_2US
 	MOV	C,I2C_SDA
 	RLC	A
 	CLR	I2C_SCL
 	LCALL	DELAY_2US
 	DJNZ	R2,RB_LOOP
 	PUSH	ACC
 	MOV	A,R7
 	CJNE	A,#1,RB_ACK
 	SETB	I2C_SDA
	AJMP	RB_ACLK
RB_ACK:
 	CLR	I2C_SDA
RB_ACLK:
 	LCALL	RELEASE_SCL_HIGH
 	POP	ACC
	LCALL	DELAY_2US
 	CLR	I2C_SCL
 	SETB	I2C_SDA
 	LCALL	DELAY_3US
 	RET
;================================================
;停止发送

SEND_STOP:
	CLR	I2C_SDA
 	LCALL	RELEASE_SCL_HIGH
 	LCALL	DELAY_2US
 	SETB	I2C_SDA
 	RET
;================================================
;延时

DELAY_3US:	;3US
 	NOP
        NOP
DELAY_2US:	;2US
        NOP
        NOP
 	RET
;================================================
;将时钟引脚置为高电平

RELEASE_SCL_HIGH:
	SETB	I2C_SCL
 	JNB	I2C_SCL,$
 	RET
;//////////////////////////////////////////////////////////////////////
	END

⌨️ 快捷键说明

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