24C02操作 汇编

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
;
				
;		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