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

📄 at24c08存储练习.asm

📁 开发keil:标准51单片机,针对24c01读写
💻 ASM
字号:
	#include <reg51.inc>

	SDA	EQU	P2.0
	SCL	EQU	P2.1
	adder	data	0aH	;器件地址
	adderz	data	0bH
	ader	data	0cH	;读写缓冲区	
	byte	data	0eH	;字节数	
	ack	bit	0f0h
	LDATA	DATA	04dH
	CNT	DATA	070H
	cnt1	data	080h
	


	ORG	0000H
	LJMP	MAIN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
;开始子程序
start:	setb	SDA
	NOP
	SETB	SCL
	NOP
	NOP
	NOP	
	NOP
	NOP
	CLR	SDA
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL
	NOP
	RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;结束子程序
STOP:	CLR	SDA
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	SETB	SDA
	NOP
	NOP
	NOP
	NOP
	NOP
	RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;应答子程序
MACK:
	CLR	SDA
	NOP
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL
	NOP
	NOP
	RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;非应答子程序
NOMACK:
	SETB	SDA
	NOP
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL
	NOP
	NOP
	RET

;~~~~~~~~~~~~~~~~~~~~
; 非应答检查重器件应答
CACK:
	SETB	SDA
	NOP
	NOP
	SETB	SCL
	CLR	ACK
	NOP
	NOP
	MOV	C,SDA
	JC	CEND
	SETB	ACK
CEND:	
	NOP
	CLR	SCL
	NOP
	RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;发送字节程序
;传送的数据给A
;入口A
;使用的变量:R0,PSW,ACC

WRBYTE:
	PUSH	00H
	PUSH	psw
	push	acc

	MOV	R0,#08H		;循环8次
WLP:	RLC	A		;取数
	jc	send1		;是1发1
	sjmp	send0		;是0发0
wlp1:	djnz	r0,wlp		;判断完成标志
	nop	
	pop	acc
	POP	psw	
	POP	00H
	ret

send1:	setb	SDA
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL
	SJMP	WLP1
send0:	CLR	SDA
	NOP
	SETB	SCL
	NOP
	NOP
	NOP
	NOP
	NOP
	CLR	SCL
	SJMP	WLP1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;读取字节程序
;读出值给ACC
;每取一字节要发送一应答/非应答
;出口R2
;;使用的变量:R0,PSW,ACC

RDBYTE:	
	PUSH	00h
	push	psw
	push	acc

	MOV	R0,#08H
RLP:	SETB	SDA
	NOP
	SETB	SCL
	NOP
	NOP
	MOV	C,SDA
	MOV	A,R2
	CLR	SCL
	RLC	A
	MOV	R2,A
	NOP
	NOP
	NOP
	DJNZ	R0,RLP

	pop	acc
	pop	psw
	POP	00H
	
	RET

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;所有清零子程序
;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,页数cnt1(不同的器件输入不同的字节或页数)
;LDATA,写入数据变量
;使用的寄存器;acc,psw,r0,



clerzero:
	push	acc
	push	psw
	push	adder
	push	adderz
	
	
wrbytead:	
	mov	adder,#10100000b
	LCALL	start
	mov	a,adder
	lcall	WRBYTE
	lcall	CACK
	jnb	ack,endby	
	

	mov	a,adderz
	lcall	WRBYTE
	lcall	CACK	

wrbyted:	
	mov	a,LDATA
	lcall	WRBYTE	
	lcall	CACK
	jnb	ack,endby
	inc	adderz				
	DJNZ	CNT,wrbyted
	lcall	STOP
	mov	cnt,#8		

	lcall	delay
	djnz	cnt1,wrbytead
	pop	adderz
	pop	adder
	pop	psw
	pop	acc	
	ret

		
endby:	
	lcall	STOP
		
	pop	adderz
	pop	adder
	pop	psw
	pop	acc	
	ret

;~~~~~~~~~~~~~~~~~~~~~~~~~
delay:
	mov	r5,#20
ms:	mov	r6,#97
	djnz	r6,$
	djnz	r5,ms
	ret

;~~~~~~~~~~~~~~~~~~~~~~~~~~





;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;写数据子程序
;入口参数;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,页数cnt1(不同的器件输入不同的字节或页数)
;LDATA;数据存放区
;r1;数据存放区起始地址
;使用的寄存器;acc,psw,r0,

writer:	
	push	acc
	push	psw
	push	adder
	push	adderz	


	
writepage:
	mov	adder,#10100000b	
	LCALL	start
	mov	a,adder
	lcall	WRBYTE
	lcall	CACK
	jnb	ack,endw	

	mov	a,adderz
	lcall	WRBYTE
	lcall	CACK
writerd:	
	mov	a,@r1
	lcall	WRBYTE	
	lcall	CACK
	jnb	ack,endw
	inc	r1
	inc	adderz	
	lcall	stop
	lcall	delay	
	djnz	cnt,writepage
	
	pop	adderz
	pop	adder
	pop	psw
	pop	acc

	ret


endw:
	lcall	stop			
	pop	adderz
	pop	adder
	pop	psw
	pop	acc

	ret



;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;写数据子程序
;入口参数;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,
;LDATA;数据存放区
;r1;数据存放区起始地址
;使用的寄存器;acc,psw,r0,r2


read:	
	push	acc
	push	psw
	push	adder
	push	adderz	
	push	01h
	
	mov	adder,#10100000b
	LCALL	start
	mov	a,adder
	lcall	WRBYTE
	lcall	CACK
	jnb	ack,endr
		
	mov	a,adderz
	lcall	WRBYTE
	lcall	CACK
	
	mov	adder,#10100001b
	LCALL	start
	mov	a,adder
	lcall	WRBYTE
	lcall	CACK
	jnb	ack,endr	
readd:		
	lcall	RDBYTE
	mov	a,r2	
	mov	@r1,a
	lcall	MACK
	inc	r1
	DJNZ	CNT,readd	
	ljmp	aaa
aaa:	lcall	NOMACK
	
	
	
endr:	
	lcall	STOP
	pop	01h
	pop	adderz
	pop	adder
	pop	psw
	pop	acc
	ret

	







;无子地址写数据
;入口参数;数据ACC,器件地址SLA 
;占用:A,R0,CY


IWRBYTE:
	push	acc
	push	psw
	push	adder
	push	adderz	
	push	01h
iwbloop:
	lcall	start
	mov	adder,#10100000b
	mov	a,adder
	lcall	WRBYTE
	lcall	cack
	jnb	ack,retwrb	
	
	mov	a,#0ffh
	lcall	wrbyte
	lcall	cack	
	
retwrb:	
	lcall	stop
	
	pop	01h	
	pop	adderz
	pop	adder	
	pop	psw
	pop	acc
	ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

data01:
	mov	cnt,#20
	mov	r1,#LDATA
	mov	a,#16
		
data00:	mov	@r1,a
	inc	r1
	add	a,#1
	djnz	cnt,data00
	ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~






	org	0200h

MAIN:	mov	adder,#00h
	mov	adderz,#00h
	mov	ader,#00h
	mov	byte,#00h
	MOV	CNT,#00H
	MOV	CNT1,#00H
	mov	sp,#31h	
	

startm:	mov	r7,#4
	mov	cnt,#16
	mov	ader,#00h
	mov	LDATA,#0FFH
	cjne	r7,#1,rd1
	lcall	writer1
rd1:	cjne	r7,#2,wrn
	lcall	read1	
wrn:	cjne	r7,#3,rdn
	lcall	writern
rdn:	cjne	r7,#4,startm
	lcall	readn

writer1:	
	mov	cnt,#1
	mov	LDATA,#0FFH	
	mov	r1,#LDATA
	mov	adderz,ader	
	lcall	writer
	lcall	exit
	
read1:
	mov	cnt,#1
	mov	r1,#LDATA
	mov	adderz,ader
	lcall	read
	lcall	exit
	
writern:
	lcall	data01

	mov	cnt,#16		
	mov	r1,#LDATA
	mov	adderz,ader	
	lcall	writer
	lcall	exit
	

readn:
	mov	cnt,#16
	mov	r1,#LDATA
	mov	adderz,ader
	lcall	read
	lcall	exit

exit:	
	jmp	$

	



	end









































⌨️ 快捷键说明

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