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 |
Be the first to comment on this entry.