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		
	


posted @ 2013-08-03 21:19  javawebsoa  Views(331)  Comments(0Edit  收藏  举报