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

📄 eeprom.dt

📁 此程序为EEPROM的读写,可供单片机爱好者研究学习之用.
💻 DT
字号:


;------------------------------------------------
;--------读写eeprom AT24C16----------------------
;-------- PlatForm: EPD3331----------------------
;---------CLOCK 8MHZ-----------------------------
;---------Date:2007-06-02-  WXY------------------
;------------------------------------------------
;PORTB
SDA	EQU	7 (PULL UP )
SCL	EQU	6 (PULL UP )

;--------------------------------------------------
;--------R_PositionX	=DEVICE ADDRESS------------
;--------R_PositionY	=WOED   ADDRESS------------
;--------R_temp3	=Write Data----------------
;--------------------------------------------------

Start_Write_Byte:

	MOV	R_temp3,A
	
	CALL	Delay100ms	
	
	CALL	Start_bit
	
	MOV	A,R_PositionX	;Device Address
	AND	A,#10101110B
	OR	A,#10100000B
	CALL	Write_data
	
	MOV	A,R_PositionY	;Word Address
	CALL	Write_data
	
	MOV	A,R_temp3	;Data
	CALL	Write_data

	CALL	Stop_bit
	
	RET
;-------------------------------------------------------


;--------------------------------------------------
;--------R_PositionX	=DEVICE ADDRESS------------
;--------R_PositionY	=WOED   ADDRESS------------
;--------R_temp2	=Read Byte Numbers---------
;--------------------------------------------------

Start_Read_Byte:

	MOV	R_temp2,A	;连续读字节数	
	
	MOVPR	BSR_bak,BSR1
	BS	POST_ID,FSR1PE	;AUTO INCREASE
	BS	POST_ID,FSR1_ID
	MOV	A,#03H		;BANK 3
	MOV	BSR1,A
	
	MOV	A,#80H
	MOV	FSR1,A
	
	CALL	Start_bit
	
	MOV	A,R_PositionX	;Device Address
	AND	A,#10101110B
	OR	A,#10100000B
	CALL	Write_data
	
	MOV	A,R_PositionY	;Word Address
	CALL	Write_data


	CALL	Start_bit
	OR	A,#10100001B	;Send Read command
	CALL	Write_data
	
Read_Next:			

	
	CALL	Read_data
	
	MOV	A,R_temp1
	MOV	INDF1,A
	JDNZ	R_temp2,Read_Next
	
	MOVRP	BSR1,BSR_bak

	CALL	Stop_bit

	RET

;-------------------------------------------
Write_data:
	
	MOV	R_temp1,A
	MOV	A,#8
	MOV	Temploop,A

Write_dataLoop:	
	BC	PORTB,SCL
	CALL	NOP_Delay5US
	
	BC	STATUS,C
	RLC	R_temp1
	
	JBC	STATUS,F_C,Write_data1
	BS	PORTB,SDA	
	JMP	Write_data2
Write_data1:
	BC	PORTB,SDA	
Write_data2:
	
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	JDNZ	Temploop,Write_dataLoop
	
	BC	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	
	MOV	A,DCRB
	OR	A,#10000000B	;SET PORTB 7 AS INPUT	
	MOV	DCRB,A
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	
	
Check_ACK:
	JBS	PORTB,SDA,Check_ACK
	
	BC	PORTB,SCL
	
	MOV	A,DCRB		;set portb as output
	AND	A,#01111111b
	MOV	DCRB,A
	
	RET
;--------------------------------------------

Read_data:
		
	MOV	A,#8
	MOV	Temploop,A
	
	MOV	A,DCRB
	OR	A,#10000000B	;SET PORTB 7 AS INPUT	
	MOV	DCRB,A
	CALL	NOP_Delay5US
	
Read_dataLoop:	
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	
	BC	STATUS,F_C
	JBC	PORTB,SDA,Read_data1
	BS	STATUS,F_C
	
Read_data1:

	RLC	R_temp1
	
	BC	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	
	JDNZ	Temploop,Read_dataLoop
	MOV	A,DCRB		;set portb as output
	AND	A,#01111111b
	MOV	DCRB,A
	
	MOV	A,R_temp2
	JE	A,#01,Read_finish
	BC	PORTB,SDA	
	JMP	Read_continue
Read_finish:
	BS	PORTB,SDA	;若是最后一字节置SDA=1.
	
Read_continue:	
	CALL	NOP_Delay5US
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	
	BC	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	
	BS	PORTB,SDA	;应答毕,置SDA=1.
	
	RET
;------------------------------------
Start_bit:
	BS	PORTB,SDA
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	BC	PORTB,SDA
;	BC	PORTB,SCL			
	
	RET
	
Stop_bit:
	BC	PORTB,SDA
	BS	PORTB,SCL
	CALL	NOP_Delay5US
	CALL	NOP_Delay5US
	BS	PORTB,SDA		
	
	RET	
	
;-------------------------------------------
	
NOP_Delay5US:
	NOP
	NOP
	NOP		
	NOP		
	NOP		
	NOP		
	NOP	
	NOP
	NOP
	RET
		
			

⌨️ 快捷键说明

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