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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
;#################################################################
;              这是一个键盘扫描程序 
;将得到的健值(01H-10H)在右边两位数码管显示 (data= XX) 
;程序采用中断结构,硬件连接上将INT_KEY信号与P3.2(INT0) 连接;
;普通的I2C通讯程序可以直接利用,为读数据子程序需要加延时
;这是ZLG7290芯片在读数据时有延时,在RDBYT中添加一个20US延时
;#################################################################
SDA		BIT	P1.0
SCL		BIT	P1.1  
WSLA		EQU	070H
RSLA		EQU	071H
DISDA		EQU	20H		;源数据块首地址
DISCON		EQU	08H		;写入数据个数		
DATA_1		EQU	30H		;变量区首地址
;********************************************************
	ORG	8000H 
	LJMP	8100H  
;********************************************************
	ORG	8003H
	LJMP	INT_7290
;********************************************************
;            初始化部分					          
;********************************************************
	ORG	8100H 
START: MOV	SP,#60H
	CLR	P1.7   		;7290复位
	LCALL	DELAY	
	SETB	P1.7	
	SETB	EA 			;开INT0中断
	SETB	EX0
	SETB	IT0  		;触发极性为下降沿 	
;********************************************************
;           建立变量缓冲区	(30H-37H) 			          
;********************************************************
	MOV	DATA_1,  #13H	;变量缓冲区(显示 data =   )
	MOV	DATA_1+1,#13H	;注意:
	MOV	DATA_1+2,#13H 	;变量取值范围0-F
	MOV	DATA_1+3,#12H
	MOV	DATA_1+4,#10H
	MOV	DATA_1+5,#11H
	MOV	DATA_1+6,#10H
	MOV	DATA_1+7,#0DH
;********************************************************
;           通过查表建立显示缓冲区(20H-27H)				          
;********************************************************
	MOV	DPTR,#LEDSEG 	;开始对变量查表
	MOV	R7,#DISCON		;写入数据个数	
	MOV	R0,#DISDA  		;源数据块首地址
	MOV	R1,#DATA_1
LOOP1:	MOV	A,@R1
	MOVC	A,@A+DPTR 		;查表得对应的字形码
	MOV	@R0,A 			;送显示缓冲区
	INC	R1
	INC	R0
	DJNZ	R7,LOOP1  
;********************************************************
;	向7290B写入数据,以显示"data=  "
;********************************************************
LOOP:	MOV	R7,#DISCON
	MOV	R2,#10H
	MOV	R3,#WSLA
	MOV	R0,#DISDA 
	LCALL	WRNBYT			;调显示子程序
	LCALL	DELAY 			;使显示稳定 
	SJMP	LOOP 
;******************************************************************
LEDSEG:	DB	0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H	;0-7的字形码
		DB	0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH		;8-F的字形码
		DB	0FAH,1EH,12H,00H						;a,t,= 和熄灭码
;******************************************************************
;	拆分程序(将A中的数据拆分为两个四位16进制数并查表)
;	( 结果在R4、R3中 ) 
;******************************************************************
CF:	PUSH	02H 		;将A中的数据拆分为两个四位16进制数并查表
	PUSH	DPH  	;	
PUSH	DPL
	MOV	DPTR,#LEDSEG
	MOV	R2,A
	ANL	A,#0FH
	MOVC	A,@A+DPTR
	MOV	R3,A
	MOV	A,R2
	SWAP	A
	ANL	A,#0FH
	MOVC	A,@A+DPTR
	MOV	R4,A
	POP	DPL
	POP	DPH
	POP	02H
	RET  
;*******************************************************************
;          中断服务程序 INT_7290:(INT0)
;*******************************************************************	
INT_7290:
	PUSH	00H
	PUSH	02H
	PUSH	03H
	PUSH	04H
	PUSH	07H
	PUSH	ACC
	PUSH	PSW
	MOV	R0,#28H	;状态数据区首址
	MOV	R7,#04H	;取状态数据个数
	MOV	R2,#00H ;内部数据首地址
	MOV	R3,#WSLA;取器件地址(写)
	MOV	R4,#RSLA;取器件地址(读)
 	LCALL	RDADD	;读出7290的00H-03H数据存于28H-2BH 
	NOP			;设定一个断点,以观察读出的4个数据
	MOV	A,29H	;取健值
	LCALL	CF		;拆分、查表
	MOV	20H,R3	;送显示缓冲区(最低两位数码管)
	MOV	21H,R4
	POP	PSW
	POP	ACC
	POP	07H
	POP	04H
	POP	03H
	POP	02H
	POP	00H
	RETI
;**********************************************************************
DELAY:	PUSH	00H
	PUSH	01H
	MOV	R0,#00H
DELAY1:	MOV	R1,#00H
	DJNZ	R1,$
	DJNZ	R0,DELAY1
	POP	01H
	POP	00H
	RET
;**********************************************************************
 
;相关的I2C子程序(WRNBYT、WRBYT、STOP、CACK、STA)参见8.1.4 。这里省略
;*******************************************************************
;【附录一】由汇编语言编制的I2C通讯子程序
;【提  示】下列程序是在系统时钟为12MHZ(或11.0592MHZ),即NOP指令为1微秒左右。
;(1)带有内部单元地址的多字节写操作子程序 WRNBYT
;*******************************************************************
;通用的I2C通讯子程序(多字节写操作)
;入口参数R7字节数,R0:源数据块首地址
;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写)
;相关子程序WRBYT、STOP、CACK、STA
;*******************************************************************	
WRNBYT:	PUSH	PSW		
		PUSH	ACC				
WRADD:	MOV		A,R3		;取外围器件地地址(包含r/w=0)	
		LCALL	STA		;发送起始信号S  
		LCALL	WRBYT		;发送外围地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,WRADD	;如果应
		MOV		A,R2
		LCALL	WRBYT		;发送内部寄存器首地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,WRADD	;如果应答不正确返回重来 	
WRDA:	MOV		A,@R0
		LCALL	WRBYT		;发送外围地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,WRADD	;如果应答不正确返回重来
		INC		R0
		DJNZ  	R7,WRDA
		LCALL	STOP 	
		POP		ACC
		POP		PSW
		RET 	       
;*******************************************************************
 
 
 
 
 
 
 
 
 
 
;(2)带有内部单元地址的多字节读操作子程序 RDADD 
;*******************************************************************
;通用的I2C通讯子程序(多字节读操作)
;入口参数R7字节数;
;R0目标数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序WRBYT、STOP、CACK、STA、MNACK 
;*******************************************************************	
RDADD:  PUSH	PSW			;从PCF8563的02H单元读入7个参数
		PUSH	ACC			;存放于20H-26H单元	
RDADD1:	LCALL	STA 
		MOV		A,R3		;取器件地址(写)
		LCALL	WRBYT		;发送外围地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,RDADD1	;如果应答不正确返回重来
		MOV		A,R2		;取内部地址	
		LCALL	WRBYT		;发送外围地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,RDADD1	;如果应答不正确返回重来	
		LCALL	STA
		MOV		A,R4		;取器件地址(读)
		LCALL	WRBYT		;发送外围地址
		LCALL	CACK		;检测外围器件的应答信号
		JB		F0,RDADD1	;如果应答不正确返回重来
RDN:	LCALL	RDBYT 	
		MOV		@R0,A
		DJNZ	R7,ACK
		LCALL	MNACK
		LCALL	STOP	
		POP		ACC
		POP		PSW
		RET
ACK:	LCALL	MACK
		INC		R0
		SJMP	RDN 
 
 
 
 
 
 
 
;(3)I2C各个信号子程序
;**********************************************************************
;						启动信号子程序S 
;**********************************************************************
STA:	SETB	SDA		;启动信号S
		SETB	SCL
		NOP				;产生4.7US延时
		NOP
		NOP
		NOP
		NOP	
		CLR		SDA
		NOP				;产生4.7US延时
		NOP
		NOP
		NOP
		NOP 	
		CLR		SCL
		RET 
;**********************************************************************
;						停止信号子程序P 
;**********************************************************************
STOP:	CLR		SDA 	;停止信号P
		SETB	SCL
		NOP				;产生4.7US延时
		NOP
		NOP
		NOP
		NOP	
		SETB	SDA
		NOP				;产生4.7US延时
		NOP
		NOP
		NOP
		NOP	
		CLR		SCL
		CLR		SDA
		RET 
;**********************************************************************
;						应答信号子程序   MACK
;**********************************************************************
MACK:	CLR		SDA	;发送应答信号ACK
		SETB	SCL
		NOP			;产生4.7US延时
		NOP
		NOP
		NOP
		NOP
		CLR		SCL
		SETB	SDA
		RET
;**********************************************************************
;						非应答法信号子程序MNACK
;**********************************************************************
MNACK:	SETB	SDA		;发送非应答信号NACK
		SETB	SCL
		NOP				;产生4.7US延时
		NOP
		NOP
		NOP
		NOP
		CLR		SCL
		CLR		SDA
		RET
;**********************************************************************
;						应答检测子程序CACK
;**********************************************************************
CACK:	SETB	SDA		;应答位检测子程序
		SETB	SCL 
		CLR		F0
		MOV		C,SDA	;采样SDA
		JNC		CEND	;应答正确时转CEND
		SETB	F0		;应答错误时F0置一
CEND:	CLR		SCL
		RET
;**********************************************************************
;						发送一个字节子程序WRBYT
;**********************************************************************
WRBYT:	PUSH	06H
MOV		R6,#08H		;发送一个字节子程序 
WLP:	RLC		A 			;(入口参数A)
		MOV		SDA,C
		SETB	SCL
		NOP					;产生4.7US延时
		NOP
		NOP
		NOP
		NOP
		CLR		SCL
		DJNZ	R6,WLP
		POP		06H
		RET
;**********************************************************************
;						接收一个字节子程序RDBYT 
;**********************************************************************
RDBYT: 	PUSH	06H
		MOV		R6,#08H	;接收一个字节子程序
RLP:	SETB	SDA
		SETB	SCL
;  *******************************************
	NOP			;!!!!!产生大于15微秒的延时!!!!!!
	NOP 		;注意这是专门为ZLG7290
	NOP 		;添加的20微秒延时部分
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
;  ********************************************	
	MOV		C,SDA
	MOV		A,R2
	RLC		A
	MOV		R2,A
	CLR		SCL
	DJNZ	R6,RLP 		;(出口参数R2)
	POP		06H
	RET  
;**********************************************************************
 
		END
Tags: ,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

Be the first to comment on this entry.

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)