Skip to content

[微机实验/TD-PITE] 微机接口综合实验

Published: at 16:21

ToC

实验内容

实现一个以秒为单位的计时器。

使用 1MHz 的时钟源和 82548259 构成周期为 1 秒的计时中断时钟。

通过键盘 0-9 输入计时的分钟数A 控制计时过程的开始和结束,B 控制暂停和继续,C 退出程序。

具体功能如下:

实验接线

正常连接 82548255 即可。在本实现中,8254IOY08255IOY1

代码

不想动了,就这样吧,代码就不解释了(逃

1
A8255 EQU 0640H
2
B8255 EQU 0642H
3
C8255 EQU 0644H
4
CON8255 EQU 0646H
5
6
C008254 EQU 0600H
7
C018254 EQU 0602H
8
C028254 EQU 0604H
9
CON8254 EQU 0606H
10
11
SSEG SEGMENT STACK
12
DW 20 DUP(?)
13
SSEG ENDS
14
15
DATA SEGMENT
16
TBL:
17
DB 3FH ;; 0
18
DB 06H ;; 1
19
DB 5BH ;; 2
20
DB 4FH ;; 3
21
DB 66H ;; 4
22
DB 6DH ;; 5
23
DB 7DH ;; 6
24
DB 07H ;; 7
25
DB 7FH ;; 8
26
DB 6FH ;; 9
27
DB 77H ;; A
28
DB 7CH ;; B
29
DB 39H ;; C
30
DB 5EH ;; D
31
DB 79H ;; E
32
DB 71H ;; F
33
DB 00H ;; CLR
34
SEQ:
35
DB 00011111B ;; POS 0
36
DB 00101111B ;; POS 1
37
DB 00110111B ;; POS 2
38
DB 00111011B ;; POS 3
39
DB 00111101B ;; POS 4
40
DB 00111110B ;; POS 5
41
CNT_STARTED DB 00H
42
CNT_PAUSED DB 00H
43
VAL_MIN:
44
DB 2 DUP(10H)
45
VAL_SEC:
46
DB 2 DUP(0)
47
MIR_COUNTER DB 00H
48
DATA ENDS
49
50
CODE SEGMENT
51
ASSUME CS:CODE, DS:DATA
52
53
START PROC
54
MOV AX, 0
55
MOV DS, AX
56
57
;; INIT 8255
58
MOV AL, 81H ;;10001001B ;; A B OUT, C IN
59
MOV DX, CON8255
60
OUT DX, AL
61
62
;; MIR6
63
MOV AX, OFFSET MIR6
64
MOV SI, 38H
65
MOV [SI], AX
66
MOV AX, CS
67
MOV SI, 3AH
68
MOV [SI], AX
69
70
;; --------------------------------------------------
71
;; INIT 8259
72
CLI
73
MOV AL, 11H
74
OUT 20H, AL
75
MOV AL, 08H
76
OUT 21H, AL
77
MOV AL, 04H
78
OUT 21H, AL
79
MOV AL, 07H
80
OUT 21H, AL
81
MOV AL, 2FH
82
OUT 21H, AL
83
STI
84
;; --------------------------------------------------
85
86
;; --------------------------------------------------
87
;; INIT 8254
88
MOV AL, 00110110B
89
MOV DX, CON8254
90
OUT DX, AL
91
92
MOV DX, C008254
93
MOV AL, 24H ;; LOWER 8 BYTES
94
OUT DX, AL
95
96
MOV AL, 0F4H ;; HIGHER 8 BYTES
97
OUT DX, AL
98
;; --------------------------------------------------
99
100
MOV AX, DATA
101
MOV DS, AX
102
LO:
103
CALL NUM_DISPLAY
104
CALL SCAN
105
CMP AX, 10H
106
JE LO
107
CMP AX, 0AH ;; PRESS A TO START/STOP
108
JNE LO_NB
109
;;;;;;
110
CMP CNT_STARTED, 00H
111
JE COUNTER_START
112
;; COUNTER_STOP
113
MOV CNT_STARTED, 0
114
CALL CLR_TIME
115
LEA BX, VAL_MIN
116
MOV [BX], 1010H
117
JMP WAIT_UP
118
COUNTER_START:
119
MOV CNT_STARTED, 1
120
MOV CNT_PAUSED, 0
121
JMP WAIT_UP
122
;;;;;;
123
LO_NB:
124
CMP AX, 0BH ;; PRESS B TO PAUSE/RESUME
125
JNE LO_NC
126
XOR CNT_PAUSED, 1
127
JMP WAIT_UP
128
LO_NC:
129
CMP AX, 0CH ;; PRESS C TO EXIT
130
JE MA_EXIT
131
132
CMP AX, 0AH
133
JGE WAIT_UP
134
CALL MIN_SET
135
WAIT_UP:
136
CALL NUM_DISPLAY
137
CALL KEY_PRESSED
138
CMP AX, 1
139
JE WAIT_UP
140
JMP LO
141
142
MA_EXIT:
143
MOV AX, 1000H
144
CALL PUT
145
MOV AX, 4C00H
146
INT 21H
147
START ENDP
148
149
MIN_SET PROC
150
CMP CNT_STARTED, 1
151
JE MS_EXIT
152
153
LEA BX, VAL_MIN
154
MOV AH, [BX]
155
CMP AH, 10H
156
JE MS_SW
157
MOV AH, [BX+1]
158
CMP AH, 10H
159
JE MS_GW
160
JMP MS_EXIT
161
MS_SW:
162
MOV [BX], AL
163
JMP MS_EXIT
164
MS_GW:
165
MOV [BX+1], AL
166
MS_EXIT:
167
RET
168
MIN_SET ENDP
169
170
TIMER_RESET PROC
171
MOV CNT_STARTED, 0
172
CALL CLR_TIME
173
MOV CX, 3
174
TR_LO:
175
PUSH CX
176
CALL ZERO_BLINK
177
CALL DELAY
178
179
CALL NUM_DISPLAY_CLS
180
CALL DELAY_LONG
181
POP CX
182
LOOP TR_LO
183
184
CALL CLR_TIME
185
RET
186
TIMER_RESET ENDP
187
188
CLR_TIME PROC
189
LEA BX, VAL_MIN
190
MOV AH, 10H
191
MOV [BX], AH
192
MOV [BX+1], AH
193
LEA BX, VAL_SEC
194
MOV AH, 00H
195
MOV [BX], AH
196
MOV [BX+1], AH
197
RET
198
CLR_TIME ENDP
199
200
ZERO_BLINK PROC
201
PUSH CX
202
MOV CX, 0FFH
203
ZB:
204
PUSH CX
205
MOV AX, 0005H
206
CALL PUT
207
CALL DELAY
208
209
MOV AX, 0004H
210
CALL PUT
211
CALL DELAY
212
213
MOV AX, 0003H
214
CALL PUT
215
CALL DELAY
216
217
MOV AX, 0002H
218
CALL PUT
219
CALL DELAY
220
POP CX
221
LOOP ZB
222
POP CX
223
RET
224
ZERO_BLINK ENDP
225
226
NUM_DISPLAY PROC
227
CMP CNT_STARTED, 1
228
JE ND_TIMER
229
;; INPUT MODE
230
LEA BX, VAL_MIN
231
MOV SI, 0
232
233
MOV AH, [BX+SI]
234
MOV AL, 03H
235
CALL PUT
236
CALL DELAY
237
238
LEA BX, VAL_MIN
239
MOV SI, 0
240
MOV AH, [BX+SI+1]
241
MOV AL, 02H
242
CALL PUT
243
CALL DELAY
244
RET
245
246
ND_TIMER:
247
;; TIMER MODE
248
LEA BX, VAL_MIN
249
MOV SI, 0
250
MOV AH, [BX+SI]
251
MOV AL, 05H
252
CALL PUT
253
CALL DELAY
254
255
LEA BX, VAL_MIN
256
MOV SI, 0
257
MOV AH, [BX+SI+1]
258
MOV AL, 04H
259
CALL PUT
260
CALL DELAY
261
262
LEA BX, VAL_SEC
263
MOV SI, 0
264
MOV AH, [BX+SI]
265
MOV AL, 03H
266
CALL PUT
267
CALL DELAY
268
269
LEA BX, VAL_SEC
270
MOV SI, 0
271
MOV AH, [BX+SI+1]
272
MOV AL, 02H
273
CALL PUT
274
CALL DELAY
275
RET
276
NUM_DISPLAY ENDP
277
278
NUM_DISPLAY_CLS PROC
279
MOV CX, 5
280
ND_CLS:
281
MOV AH, 10H
282
MOV AL, AL
283
CALL PUT
284
LOOP ND_CLS
285
RET
286
NUM_DISPLAY_CLS ENDP
287
288
;; DECREASE SECOND & MIN WHEN NECESSARY
289
DEC_SEC PROC
290
CMP CNT_STARTED, 0 ;; NOT STARTED
291
JE DEC_EXIT
292
293
CMP CNT_PAUSED, 1 ;; PAUSED
294
JE DEC_EXIT
295
296
LEA BX, VAL_SEC
297
MOV AH, [BX+1]
298
CMP AH, 0
299
JE DS_JW_S
300
DEC AH
301
MOV [BX+1], AH
302
JMP DEC_EXIT
303
DS_JW_S:
304
MOV AH, 9
305
MOV [BX+1], AH
306
MOV AH, [BX]
307
CMP AH, 0
308
JE DS_JW_MG
309
DEC AH
310
MOV [BX], AH
311
JMP DEC_EXIT
312
DS_JW_MG:
313
MOV AH, 5
314
MOV [BX], AH
315
LEA BX, VAL_MIN
316
MOV AH, [BX+1]
317
CMP AH, 0
318
JE DS_JW_MS
319
DEC AH
320
MOV [BX+1], AH
321
JMP DEC_EXIT
322
DS_JW_MS:
323
MOV AH, 9
324
MOV [BX+1], AH
325
MOV AH, [BX]
326
CMP AH, 0
327
JE DS_FIN
328
DEC AH
329
MOV [BX], AH
330
JMP DEC_EXIT
331
DS_FIN:
332
CALL TIMER_RESET
333
DEC_EXIT:
334
RET
335
DEC_SEC ENDP
336
337
MIR6 PROC
338
STI
339
INC MIR_COUNTER
340
CMP MIR_COUNTER, 10H
341
JNE MIR6_FIN
342
MOV MIR_COUNTER, 0
343
CALL DEC_SEC
344
MIR6_FIN:
345
IRET
346
MIR6 ENDP
347
348
SCAN PROC
349
BEGIN:
350
CALL KEY_PRESSED ;; EXIT IF NOT PRESSED
351
CMP AX, 0
352
JE SCAN_NO_KEY
353
354
CALL DELAY
355
CALL KEY_PRESSED
356
CMP AX, 0
357
JE SCAN_NO_KEY
358
359
MOV CH, 0FEH
360
MOV CL, 0
361
COLUMN:
362
MOV AL, CH
363
MOV DX, A8255
364
OUT DX, AL
365
MOV DX, C8255
366
IN AL, DX
367
L1:
368
TEST AL, 1
369
JNZ L2
370
MOV AL, 00H
371
JMP KCODE
372
L2:
373
TEST AL, 2
374
JNZ L3
375
MOV AL, 04H
376
JMP KCODE
377
L3:
378
TEST AL, 4
379
JNZ L4
380
MOV AL, 08H
381
JMP KCODE
382
L4:
383
TEST AL, 8
384
JNZ NEXT
385
MOV AL, 0CH
386
KCODE:
387
ADD AL, CL
388
JMP SCAN_FIN
389
NEXT:
390
INC CL
391
MOV AL, CH
392
TEST AL, 08H
393
JE SCAN_NO_KEY
394
ROL AL, 1
395
MOV CH, AL
396
JMP COLUMN
397
398
SCAN_NO_KEY:
399
MOV AX, 10H
400
SCAN_FIN:
401
RET
402
SCAN ENDP
403
404
;; RETURN WHETHER KEY PRESSED IN AX
405
KEY_PRESSED PROC
406
MOV DX, A8255
407
MOV AL, 00H
408
OUT DX, AL ;; LINE OUTPUT 0000
409
410
MOV DX, C8255
411
IN AL, DX ;; GET LINE STATUS
412
AND AL, 0FH
413
CMP AL, 0FH
414
JE KP_NONE
415
416
MOV AX, 1 ;; KEY PRESSED
417
RET
418
KP_NONE:
419
MOV AX, 0
420
RET
421
KEY_PRESSED ENDP
422
423
;; NUM: AH
424
;; POS: AL
425
PUT PROC
426
PUSH AX
427
428
;; SELECT POS
429
LEA BX, SEQ
430
PUSH AX
431
MOV AH, 0
432
MOV SI, AX
433
434
;; OUTPUT POS
435
MOV DX, A8255
436
MOV AL, [BX+SI]
437
OUT DX, AL
438
POP AX
439
440
;; SELECT NUM
441
LEA BX, TBL
442
MOV AL, AH
443
MOV AH, 0
444
MOV SI, AX
445
446
;; OUTPUT DATA
447
MOV DX, B8255
448
MOV AL, [BX+SI]
449
OUT DX, AL
450
451
POP AX
452
RET
453
PUT ENDP
454
455
DELAY PROC
456
MOV CX, 0FFH
457
LOOP $
458
RET
459
DELAY ENDP
460
461
DELAY_LONG PROC
462
MOV CX, 0FFFFH
463
LOOP $
464
RET
465
DELAY_LONG ENDP
466
467
CODE ENDS
468
END START

效果