24C02操作--松瀚汇编源码

;

					

;		P_CLKIIC 	EQU	P1.2

;		P_DATIIC	EQU	P1.3

;		PM_DATIIC	EQU	P1M.3	



;		EE_ADDR		DS	1    	;地址寄存器

;		TMP3_IIC	DS	1

;		TMP2_IIC	DS	1

;		TMP1_IIC	DS	1

;		DATA_TEMP	DS	1	;数据缓存

;		R_DATA		DS	1	;读数据寄存器	

;		W_DATA		DS	1	;写数据寄存器



;*************************************************

;功能:读出一认定地址的数据

;INPUT:  EE_ADDR_H  , EE_ADDR_L  --> EE_ADDR

;OUTPUT: R_DATA		

;影响参数:DATA_TEMP ,TMP1_IIC ,TMP2_IIC	,TMP3_IIC,TMP4_IIC

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

READ_EEPROM:

	MOV A,#200

	MOV TMP2_IIC,A	

READ_EEPROM_LOOP0:	

;------------

	B0BSET	PM_DATIIC			;SET  OUT MODEL

	CALL	STAR_CONDITION

	MOV	A,#10100000B

	B0MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;写模式,写入高3位地址	

	B0BCLR	PM_DATIIC			;IN MODEL	

	B0BSET	P_CLKIIC

	B0BTS1	P_DATIIC	

	JMP 	READ_EEPROM_LOOP1	

	DECMS 	TMP2_IIC

	JMP 	READ_EEPROM_LOOP0

	BSET	F_ERRIIC	

READ_EEPROM_LOOP1:

	B0BCLR	P_CLKIIC

	B0BSET	PM_DATIIC			;OUT MODE

	MOV	A,EE_ADDR

	MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;写入低8位地址

	B0BCLR	PM_DATIIC			;IN MODEL

	B0BSET	P_CLKIIC

	MOV 	A,#200

	MOV 	TMP2_IIC,A	

READ_EEPROM_LOOP2:	

	B0BTS1	P_DATIIC	

	JMP 	READ_EEPROM_LOOP3	

	DECMS 	TMP2_IIC

	JMP 	READ_EEPROM_LOOP2

	BSET	F_ERRIIC		

READ_EEPROM_LOOP3:

	B0BCLR	P_CLKIIC

	B0BSET	PM_DATIIC			;OUT MODEL

	CALL	STAR_CONDITION	

	MOV	A,#10100001B

	MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;读出数据

	B0BCLR	PM_DATIIC			;IN MODEL

	B0BSET	P_CLKIIC

	MOV 	A,#200

	MOV	 TMP2_IIC,A	

READ_EEPROM_LOOP4:	

	B0BTS1	P_DATIIC	

	JMP 	READ_EEPROM_LOOP5	

	DECMS 	TMP2_IIC

	JMP 	READ_EEPROM_LOOP4

	BSET	F_ERRIIC		

READ_EEPROM_LOOP5:

	B0BCLR	P_CLKIIC	

	CALL	OUT_DATA_X

	B0BSET	PM_DATIIC			;OUT MODEL

	CALL	STOP_CONDITION

	B0BCLR	PM_DATIIC			;IN MODEL

;-------------	

	MOV 	A,DATA_TEMP

	MOV 	R_DATA,A     		 ;8.28

	RET

;************************************************************************

;功能:定入一指定地址的数据

;INPUT:  EE_ADDR_H  , EE_ADDR_L ,W_DATA

;OUTPUT: F_EER ,24写入有错		

;影响参数:DATA_TEMP ,TMP1_IIC ,TMP2_IIC	,TMP3_IIC

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

WRITE_EEPROM:

;先读出,与写入相同则不写 --> 如果读出的数与要写的数一致则不用再写

		

	CALL	READ_EEPROM	;



	MOV	A,R_DATA

	XOR	A,W_DATA

	BTS0	FZ

	RET



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

	MOV	A,#3		;如果写数据失败则重复写 最多写3次

	MOV	TMP3_IIC,A

;------------

WRITE_EEPROM00:		

	B0BSET	PM_DATIIC		;SET P1.3 OUT MODEL

	CALL	STAR_CONDITION

	MOV	A,#10100000B		;写入高3位地址

	MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;DEVICE_ADDRESS

	B0BCLR	PM_DATIIC		;IN MODEL

	B0BSET	P_CLKIIC

	MOV 	A,#200

	MOV 	TMP2_IIC,A	

WRITE_EEPROM_LOOP0:	

	B0BTS1	P_DATIIC	

	JMP 	WRITE_EEPROM_LOOP1	

	DECMS 	TMP2_IIC

	JMP 	WRITE_EEPROM_LOOP0

	BSET	F_ERRIIC		

WRITE_EEPROM_LOOP1:

	B0BCLR	P_CLKIIC

	B0BSET	PM_DATIIC			;OUT

	MOV	A,EE_ADDR

	MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;写入低8位地址

	B0BCLR	PM_DATIIC			;IN MODEL

	B0BSET	P_CLKIIC

	MOV 	A,#200

	MOV 	TMP2_IIC,A	

WRITE_EEPROM_LOOP2:	

	B0BTS1	P_DATIIC	

	JMP 	WRITE_EEPROM_LOOP3	

	DECMS 	TMP2_IIC

	JMP 	WRITE_EEPROM_LOOP2

	BSET	F_ERRIIC		

WRITE_EEPROM_LOOP3:

	B0BCLR	P_CLKIIC

	B0BSET	PM_DATIIC		;OUT	

	MOV	A,W_DATA

	MOV	DATA_TEMP,A

	CALL	SEND_DATA_ADD		;写入的数据

	B0BCLR	P_DATIIC;

	B0BCLR	PM_DATIIC		;IN MODEL

	B0BSET	P_CLKIIC

	MOV 	A,#200

	MOV 	TMP2_IIC,A	

WRITE_EEPROM_LOOP4:	

	B0BTS1	P_DATIIC	

	JMP 	WRITE_EEPROM_LOOP5	

	DECMS 	TMP2_IIC

	JMP 	WRITE_EEPROM_LOOP4

	BSET	F_ERRIIC		

WRITE_EEPROM_LOOP5:

	B0BCLR	P_CLKIIC

	B0BSET	PM_DATIIC			;OUT	

	B0BSET	P_DATIIC

	JMP $+1

	B0BCLR	P_DATIIC

	CALL	STOP_CONDITION	

	CALL	STOP_CONDITION

	B0BCLR	PM_DATIIC			;IN MODEL

;---------------

;读出比较是否与定入的一致

	CALL	READ_EEPROM

	MOV	A,R_DATA

	CMPRS	A,W_DATA

	RET

	DECMS	TMP3_IIC

	JMP	WRITE_EEPROM00

	BSET	F_EEPOM_W		

	RET

;----------------

OUT_DATA_X:

	CLR	DATA_TEMP

	MOV	A,#8H

	MOV	TMP1_IIC,A

OUT_LOOP1:	

	B0BCLR	PFLAG.2

	B0BTS0	P_DATIIC

	B0BSET	PFLAG.2

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



	JMP 	$+1

 	JMP 	$+1

	B0BSET	P_CLKIIC	

	JMP 	$+1

 	JMP 	$+1

	B0BCLR	P_CLKIIC

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

	RLCM	DATA_TEMP

	DECMS	TMP1_IIC

	JMP	OUT_LOOP1

	RET	

;----------------

SEND_DATA_ADD:			;

	MOV	A,#8H

	MOV	TMP1_IIC,A

SEND_LOOP1:

	RLCM	DATA_TEMP

	B0BCLR	P_DATIIC

	B0BTS0	PFLAG.2

	B0BSET	P_DATIIC

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

	JMP 	$+1

 	JMP 	$+1

	B0BSET	P_CLKIIC	

	JMP 	$+1

 	JMP 	$+1

	B0BCLR	P_CLKIIC

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

	DECMS	TMP1_IIC

	JMP	SEND_LOOP1

	RLCM	DATA_TEMP

	RET		

;---------

POSITIVE_EDGE:		;起始信号

	JMP 	$+1

 	JMP 	$+1

	B0BSET	P_CLKIIC	

	JMP 	$+1

 	JMP 	$+1

	B0BCLR	P_CLKIIC

	RET	

;----------	

STAR_CONDITION:		;结束信号

	B0BSET	P_CLKIIC

	B0BSET	P_DATIIC

	JMP $+1

	JMP $+1

	B0BCLR	P_DATIIC	

	JMP $+1

  	JMP $+1

	B0BCLR	P_CLKIIC	

	RET	

;------------	

STOP_CONDITION:			;

	B0BCLR	P_DATIIC

	B0BSET	P_CLKIIC		

	JMP 	$+1

	JMP 	$+1

	B0BSET	P_DATIIC

	JMP 	$+1

	JMP 	$+1

	B0BCLR	P_CLKIIC

	B0BCLR	P_DATIIC	

	RET		

	


你可能感兴趣的:(源码)