Skip to content

[微机实验/TD-PITE] 键盘扫描及数码管显示实验

Published: at 15:58

ToC

实验内容

在数码管上显示键盘输入的内容,新输入的内容显示在数码管的最右侧。

当数码管显示空间已满时,删除最左侧的文本。

实验接线

这次的接线和上次是一样的。唯一的不同是不能不连 Y1-Y4 了(笑)

代码

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
ROWOUT EQU 200H
6
7
SSEG SEGMENT STACK
8
DW 20 DUP(?)
9
SSEG ENDS
10
11
DATA SEGMENT
12
TBL:
13
DB 3FH ;; 0
14
DB 06H ;; 1
15
DB 5BH ;; 2
16
DB 4FH ;; 3
17
DB 66H ;; 4
18
DB 6DH ;; 5
19
DB 7DH ;; 6
20
DB 07H ;; 7
21
DB 7FH ;; 8
22
DB 6FH ;; 9
23
DB 77H ;; A
24
DB 7CH ;; B
25
DB 39H ;; C
26
DB 5EH ;; D
27
DB 79H ;; E
28
DB 71H ;; F
29
SEQ:
30
DB 00011111B ;; POS 0
31
DB 00101111B ;; POS 1
32
DB 00110111B ;; POS 2
33
DB 00111011B ;; POS 3
34
DB 00111101B ;; POS 4
35
DB 00111110B ;; POS 5
36
VAL:
37
DB 6 DUP(0)
38
VAL_USED:
39
DB 6 DUP(0)
40
VAL_HEAD DW 0005H
41
DATA ENDS
42
43
CODE SEGMENT
44
ASSUME CS:CODE, DS:DATA, SS:SSEG
45
START PROC
46
MOV AX, DATA
47
MOV DS, AX
48
49
MOV AL, 81H ;;10001001B ;; A B OUT, C IN
50
MOV DX, CON8255
51
OUT DX, AL
52
53
MOV AX, 0000H
54
LO:
55
CALL VAL_DISPLAY
56
CALL SCAN
57
CMP AX, 10H
58
JE LO
59
CALL VAL_INSERT
60
WAIT_UP:
61
CALL VAL_DISPLAY
62
CALL KEY_PRESSED
63
CMP AX, 1
64
JE WAIT_UP
65
JMP LO
66
67
MOV AX, 4C00H
68
INT 21H
69
START ENDP
70
71
SCAN PROC
72
BEGIN:
73
CALL KEY_PRESSED ;; EXIT IF NOT PRESSED
74
CMP AX, 0
75
JE SCAN_NO_KEY
76
77
CALL DELAY
78
CALL KEY_PRESSED
79
CMP AX, 0
80
JE SCAN_NO_KEY
81
82
MOV CH, 0FEH
83
MOV CL, 0
84
COLUMN:
85
MOV AL, CH
86
MOV DX, A8255
87
OUT DX, AL
88
MOV DX, C8255
89
IN AL, DX
90
L1:
91
TEST AL, 1
92
JNZ L2
93
MOV AL, 00H
94
JMP KCODE
95
L2:
96
TEST AL, 2
97
JNZ L3
98
MOV AL, 04H
99
JMP KCODE
100
L3:
101
TEST AL, 4
102
JNZ L4
103
MOV AL, 08H
104
JMP KCODE
105
L4:
106
TEST AL, 8
107
JNZ NEXT
108
MOV AL, 0CH
109
KCODE:
110
ADD AL, CL
111
JMP SCAN_FIN
112
NEXT:
113
INC CL
114
MOV AL, CH
115
TEST AL, 08H
116
JE SCAN_NO_KEY
117
ROL AL, 1
118
MOV CH, AL
119
JMP COLUMN
120
121
SCAN_NO_KEY:
122
MOV AX, 10H
123
SCAN_FIN:
124
RET
125
SCAN ENDP
126
127
;; RETURN WHETHER KEY PRESSED IN AX
128
KEY_PRESSED PROC
129
MOV DX, A8255
130
MOV AL, 00H
131
OUT DX, AL ;; LINE OUTPUT 0000
132
133
MOV DX, C8255
134
IN AL, DX ;; GET LINE STATUS
135
AND AL, 0FH
136
CMP AL, 0FH
137
JE KP_NONE
138
139
MOV AX, 1 ;; KEY PRESSED
140
RET
141
KP_NONE:
142
MOV AX, 0
143
RET
144
KEY_PRESSED ENDP
145
146
147
;; INSERT AX TO VAL[VAL_HEAD]
148
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149
;; INDEX: 0 1 2 3 4 5
150
;; VALUE: A B C D E F
151
;; HEAD: |
152
;; INPUT: 0
153
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
154
;; INDEX: 0 1 2 3 4 5
155
;; VALUE: 0 B C D E F
156
;; HEAD: |
157
;; (-> 1 BYTE)
158
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159
VAL_INSERT PROC
160
PUSH BX
161
LEA BX, VAL
162
MOV SI, VAL_HEAD
163
164
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
165
;; !!!CAUTION!!! ;;
166
;; MAKE SURE TO USE 8-BIT REGISTER ;;
167
;; IF YOU WANT TO MOVE BYTES ;;
168
;; BETWEEN MEMORY AND REGISTER!! ;;
169
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170
MOV [BX+SI], AL ;; NUMBER BYTE
171
MOV DL, 1
172
MOV [BX+SI+6], DL ;; DISPLAY BYTE
173
INC SI
174
CMP SI, 5 ;; HEAD <= 5, SKIP
175
JLE VI_EXIT
176
177
SUB SI, 6 ;; MAKE HEAD IN [0, 5]
178
179
VI_EXIT:
180
MOV VAL_HEAD, SI
181
POP BX
182
RET
183
VAL_INSERT ENDP
184
185
186
;; DISPLAY VAL ARRAY
187
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
188
;; INDEX: 0 1 2 3 4 5
189
;; VALUE: A B C D E F
190
;; HEAD: |
191
;; THIS IS THE SAME DIRECTION AS SCREEN
192
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
193
VAL_DISPLAY PROC
194
PUSH CX
195
MOV CX, 6
196
197
LEA BX, VAL
198
MOV SI, VAL_HEAD
199
200
VD_LO:
201
PUSH CX
202
MOV AH, [BX+SI]
203
MOV AL, CL
204
DEC AL
205
206
MOV DH, [BX+SI+6]
207
CMP DH, 0
208
JE VD_SKIP_BIT
209
210
PUSH BX
211
PUSH SI
212
CALL PUT
213
CALL DELAY
214
POP SI
215
POP BX
216
217
VD_SKIP_BIT:
218
POP CX
219
;; CALCULATE NEXT SI
220
INC SI
221
CMP SI, 5 ;; HEAD <= 5, SKIP
222
JLE VD_SI_SKIP
223
SUB SI, 6
224
225
VD_SI_SKIP:
226
LOOP VD_LO
227
228
POP CX
229
RET
230
VAL_DISPLAY ENDP
231
232
;; NUM: AH
233
;; POS: AL
234
PUT PROC
235
PUSH AX
236
237
;; SELECT POS
238
LEA BX, SEQ
239
PUSH AX
240
MOV AH, 0
241
MOV SI, AX
242
243
;; OUTPUT POS
244
MOV DX, A8255
245
MOV AL, [BX+SI]
246
OUT DX, AL
247
POP AX
248
249
;; SELECT NUM
250
LEA BX, TBL
251
MOV AL, AH
252
MOV AH, 0
253
MOV SI, AX
254
255
;; OUTPUT DATA
256
MOV DX, B8255
257
MOV AL, [BX+SI]
258
OUT DX, AL
259
260
POP AX
261
RET
262
PUT ENDP
263
264
DELAY PROC
265
MOV CX, 0FFH
266
LOOP $
267
RET
268
DELAY ENDP
269
270
CODE ENDS
271
END START

选做实验

说明

通过键盘输入 0-E,将刚刚输入的一位数字显示在数码管上。

最开始数码管无显示。在输入新数字后,将输入的数字显示在数码管最右端。之后每次输入数字,数字的显示位置向左移动一格。

当显示的数字已经位于最左时,此时输入的数字并不立即向右移动,而是先在最左停顿一次,下一个输入的数字再向右移动。

到达最右时的处理和最左一致。

键盘输入 F 时程序退出。

效果

上面说的这段话简直就不是人话,还是看一下实际的效果吧(

代码

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
ROWOUT EQU 200H
6
7
SSEG SEGMENT STACK
8
DW 20 DUP(?)
9
SSEG ENDS
10
11
DATA SEGMENT
12
TBL:
13
DB 3FH ;; 0
14
DB 06H ;; 1
15
DB 5BH ;; 2
16
DB 4FH ;; 3
17
DB 66H ;; 4
18
DB 6DH ;; 5
19
DB 7DH ;; 6
20
DB 07H ;; 7
21
DB 7FH ;; 8
22
DB 6FH ;; 9
23
DB 77H ;; A
24
DB 7CH ;; B
25
DB 39H ;; C
26
DB 5EH ;; D
27
DB 79H ;; E
28
DB 71H ;; F
29
DB 00H ;; CLR
30
SEQ:
31
DB 00011111B ;; POS 0
32
DB 00101111B ;; POS 1
33
DB 00110111B ;; POS 2
34
DB 00111011B ;; POS 3
35
DB 00111101B ;; POS 4
36
DB 00111110B ;; POS 5
37
VAL DB 00H
38
VAL_POS DB 00H
39
VAL_SHOW DB 00H
40
VAL_STEP DB 00H
41
DATA ENDS
42
43
CODE SEGMENT
44
ASSUME CS:CODE, DS:DATA, SS:SSEG
45
START PROC
46
MOV AX, DATA
47
MOV DS, AX
48
49
MOV AL, 81H ;;10001001B ;; A B OUT, C IN
50
MOV DX, CON8255
51
OUT DX, AL
52
53
MOV AX, 0000H
54
LO:
55
CALL NUM_DISPLAY
56
CALL SCAN
57
CMP AX, 10H
58
JE LO
59
CMP AX, 0FH
60
JE MA_EXIT
61
CALL NUM_SET
62
WAIT_UP:
63
CALL NUM_DISPLAY
64
CALL KEY_PRESSED
65
CMP AX, 1
66
JE WAIT_UP
67
JMP LO
68
69
MA_EXIT:
70
MOV AX, 1000H
71
CALL PUT
72
MOV AX, 4C00H
73
INT 21H
74
START ENDP
75
76
SCAN PROC
77
BEGIN:
78
CALL KEY_PRESSED ;; EXIT IF NOT PRESSED
79
CMP AX, 0
80
JE SCAN_NO_KEY
81
82
CALL DELAY
83
CALL KEY_PRESSED
84
CMP AX, 0
85
JE SCAN_NO_KEY
86
87
MOV CH, 0FEH
88
MOV CL, 0
89
COLUMN:
90
MOV AL, CH
91
MOV DX, A8255
92
OUT DX, AL
93
MOV DX, C8255
94
IN AL, DX
95
L1:
96
TEST AL, 1
97
JNZ L2
98
MOV AL, 00H
99
JMP KCODE
100
L2:
101
TEST AL, 2
102
JNZ L3
103
MOV AL, 04H
104
JMP KCODE
105
L3:
106
TEST AL, 4
107
JNZ L4
108
MOV AL, 08H
109
JMP KCODE
110
L4:
111
TEST AL, 8
112
JNZ NEXT
113
MOV AL, 0CH
114
KCODE:
115
ADD AL, CL
116
JMP SCAN_FIN
117
NEXT:
118
INC CL
119
MOV AL, CH
120
TEST AL, 08H
121
JE SCAN_NO_KEY
122
ROL AL, 1
123
MOV CH, AL
124
JMP COLUMN
125
126
SCAN_NO_KEY:
127
MOV AX, 10H
128
SCAN_FIN:
129
RET
130
SCAN ENDP
131
132
;; RETURN WHETHER KEY PRESSED IN AX
133
KEY_PRESSED PROC
134
MOV DX, A8255
135
MOV AL, 00H
136
OUT DX, AL ;; LINE OUTPUT 0000
137
138
MOV DX, C8255
139
IN AL, DX ;; GET LINE STATUS
140
AND AL, 0FH
141
CMP AL, 0FH
142
JE KP_NONE
143
144
MOV AX, 1 ;; KEY PRESSED
145
RET
146
KP_NONE:
147
MOV AX, 0
148
RET
149
KEY_PRESSED ENDP
150
151
;; SET AL TO VAL & MOVE POS
152
NUM_SET PROC
153
PUSH AX
154
MOV VAL, AL
155
MOV AL, VAL_POS
156
ADD AL, VAL_STEP
157
158
CMP VAL_STEP, 0 ;; REGULAR STATUS: STEP != 0
159
JNE NS_REG
160
CMP VAL_POS, 5
161
JE NS_LMOST
162
MOV VAL_STEP, 1 ;; POS == 0, RIGHT MOST
163
JMP NS_FIN
164
NS_LMOST: ;; POS == 5, LEFT MOST
165
MOV VAL_STEP, -1
166
JMP NS_FIN
167
168
NS_REG:
169
CMP AL, 5
170
JE NS_SET0
171
CMP AL, 0
172
JE NS_SET0
173
JMP NS_FIN
174
NS_SET0:
175
MOV VAL_STEP, 0
176
NS_FIN:
177
MOV VAL_SHOW, 1
178
MOV VAL_POS, AL
179
POP AX
180
RET
181
NUM_SET ENDP
182
183
;; DISPLAY VAL AT VAL_POS
184
NUM_DISPLAY PROC
185
;MOV AL, VAL_SHOW
186
CMP VAL_SHOW, 0
187
JE ND_SKIP
188
189
MOV AH, VAL
190
MOV AL, VAL_POS
191
CALL PUT
192
CALL DELAY
193
ND_SKIP:
194
RET
195
NUM_DISPLAY ENDP
196
197
;; NUM: AH
198
;; POS: AL
199
PUT PROC
200
PUSH AX
201
202
;; SELECT POS
203
LEA BX, SEQ
204
PUSH AX
205
MOV AH, 0
206
MOV SI, AX
207
208
;; OUTPUT POS
209
MOV DX, A8255
210
MOV AL, [BX+SI]
211
OUT DX, AL
212
POP AX
213
214
;; SELECT NUM
215
LEA BX, TBL
216
MOV AL, AH
217
MOV AH, 0
218
MOV SI, AX
219
220
;; OUTPUT DATA
221
MOV DX, B8255
222
MOV AL, [BX+SI]
223
OUT DX, AL
224
225
POP AX
226
RET
227
PUT ENDP
228
229
DELAY PROC
230
MOV CX, 0FFH
231
LOOP $
232
RET
233
DELAY ENDP
234
235
CODE ENDS
236
END START