Skip to content

[微机实验/TD-PITE] 数码管显示实验

Published: at 15:22

ToC

实验内容

使七段共阴极数码管显示如下内容:

  1. 从右到左逐位显示移动的数字 0~9。即一开始是 0 从右到左移动,然后是 1,然后是 2,以此类推。最后在 9 移动完后返回 0,继续循环。
  2. 使六位数码管从左到右显示稳定的数字 123456

实验接线

照着书上连就可以了。在这个实验中,PC 甚至可以不连(笑)

代码

数字滚动

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
6
SSEG SEGMENT STACK
7
DW 0, 0, 0, 0
8
SSEG ENDS
9
10
DATA SEGMENT
11
TBL:
12
DB 3FH ;; 0
13
DB 06H ;; 1
14
DB 5BH ;; 2
15
DB 4FH ;; 3
16
DB 66H ;; 4
17
DB 6DH ;; 5
18
DB 7DH ;; 6
19
DB 07H ;; 7
20
DB 7FH ;; 8
21
DB 6FH ;; 9
22
SEQ:
23
DB 00011111B ;; POS 0
24
DB 00101111B ;; POS 1
25
DB 00110111B ;; POS 2
26
DB 00111011B ;; POS 3
27
DB 00111101B ;; POS 4
28
DB 00111110B ;; POS 5
29
DATA ENDS
30
31
CODE SEGMENT
32
ASSUME CS:CODE, DS:DATA, SS:SSEG
33
START PROC
34
MOV AX, DATA
35
MOV DS, AX
36
37
MOV AL, 10001001B ;; A B OUT, C IN
38
MOV DX, CON8255
39
OUT DX, AL
40
41
MOV AX, 0000H
42
LO:
43
CALL PUT
44
CALL DELAY
45
INC AL
46
CMP AL, 6
47
JNE LO
48
MOV AL, 0
49
INC AH
50
CMP AH, 10
51
JNE LO
52
MOV AH, 0
53
JMP LO
54
55
MOV AX, 4C00H
56
INT 21H
57
START ENDP
58
59
;; NUM: AH
60
;; POS: AL
61
PUT PROC
62
PUSH AX
63
64
;; SELECT POS
65
LEA BX, SEQ
66
PUSH AX
67
MOV AH, 0
68
MOV SI, AX
69
70
;; OUTPUT POS
71
MOV DX, A8255
72
MOV AL, [BX+SI]
73
OUT DX, AL
74
POP AX
75
76
;; SELECT NUM
77
LEA BX, TBL
78
MOV AL, AH
79
MOV AH, 0
80
MOV SI, AX
81
82
;; OUTPUT DATA
83
MOV DX, B8255
84
MOV AL, [BX+SI]
85
OUT DX, AL
86
87
POP AX
88
RET
89
PUT ENDP
90
91
DELAY PROC
92
MOV CX, 0FFFFH
93
LOOP $
94
95
MOV CX, 0FFFFH
96
LOOP $
97
RET
98
DELAY ENDP
99
100
CODE ENDS
101
END START

持久显示

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
6
SSEG SEGMENT STACK
7
DW 0, 0, 0, 0
8
SSEG ENDS
9
10
DATA SEGMENT
11
TBL:
12
DB 3FH ;; 0
13
DB 06H ;; 1
14
DB 5BH ;; 2
15
DB 4FH ;; 3
16
DB 66H ;; 4
17
DB 6DH ;; 5
18
DB 7DH ;; 6
19
DB 07H ;; 7
20
DB 7FH ;; 8
21
DB 6FH ;; 9
22
SEQ:
23
DB 00011111B ;; POS 0
24
DB 00101111B ;; POS 1
25
DB 00110111B ;; POS 2
26
DB 00111011B ;; POS 3
27
DB 00111101B ;; POS 4
28
DB 00111110B ;; POS 5
29
DATA ENDS
30
31
CODE SEGMENT
32
ASSUME CS:CODE, DS:DATA, SS:SSEG
33
START PROC
34
MOV AX, DATA
35
MOV DS, AX
36
37
MOV AL, 10001001B ;; A B OUT, C IN
38
MOV DX, CON8255
39
OUT DX, AL
40
41
MOV AX, 0000H
42
LO:
43
MOV AX, 0105H
44
CALL PUT
45
CALL DELAY
46
47
MOV AX, 0204H
48
CALL PUT
49
CALL DELAY
50
51
MOV AX, 0303H
52
CALL PUT
53
CALL DELAY
54
55
MOV AX, 0402H
56
CALL PUT
57
CALL DELAY
58
59
MOV AX, 0501H
60
CALL PUT
61
CALL DELAY
62
63
MOV AX, 0600H
64
CALL PUT
65
CALL DELAY
66
JMP LO
67
68
MOV AX, 4C00H
69
INT 21H
70
START ENDP
71
72
;; NUM: AH
73
;; POS: AL
74
PUT PROC
75
PUSH AX
76
77
;; SELECT POS
78
LEA BX, SEQ
79
PUSH AX
80
MOV AH, 0
81
MOV SI, AX
82
83
;; OUTPUT POS
84
MOV DX, A8255
85
MOV AL, [BX+SI]
86
OUT DX, AL
87
POP AX
88
89
;; SELECT NUM
90
LEA BX, TBL
91
MOV AL, AH
92
MOV AH, 0
93
MOV SI, AX
94
95
;; OUTPUT DATA
96
MOV DX, B8255
97
MOV AL, [BX+SI]
98
OUT DX, AL
99
100
POP AX
101
RET
102
PUT ENDP
103
104
DELAY PROC
105
MOV CX, 0FFH
106
LOOP $
107
RET
108
DELAY ENDP
109
110
CODE ENDS
111
END START

实验效果

这里就只展示数字滚动的效果好了(

选做实验

选做实验 1-2

说明

编写显示子程序,实现一个或多个数码管的稳定显示。使用入口参数定义拟显示的位置和显示的内容。

利用(1)实现的子程序,重新完成基本实验 1)和 2)。

实现

这部分其实在上面的实验里已经实现了,就是这个 PUT 函数。它可以将 AH 的数字显示在 AL 的位置上。

1
;; NUM: AH
2
;; POS: AL
3
PUT PROC
4
PUSH AX
5
6
;; SELECT POS
7
LEA BX, SEQ
8
PUSH AX
9
MOV AH, 0
10
MOV SI, AX
11
12
;; OUTPUT POS
13
MOV DX, A8255
14
MOV AL, [BX+SI]
15
OUT DX, AL
16
POP AX
17
18
;; SELECT NUM
19
LEA BX, TBL
20
MOV AL, AH
21
MOV AH, 0
22
MOV SI, AX
23
24
;; OUTPUT DATA
25
MOV DX, B8255
26
MOV AL, [BX+SI]
27
OUT DX, AL
28
29
POP AX
30
RET
31
PUT ENDP

选做实验 3

说明

在数码管上显示学号后 6 位,并使用 6 个开关控制对应数码管的亮灭。

实现

通过开关控制就可以了,只需要多连一个 8255 即可。

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
6
SSEG SEGMENT STACK
7
DW 0, 0, 0, 0
8
SSEG ENDS
9
10
DATA SEGMENT
11
TBL:
12
DB 3FH ;; 0
13
DB 06H ;; 1
14
DB 5BH ;; 2
15
DB 4FH ;; 3
16
DB 66H ;; 4
17
DB 6DH ;; 5
18
DB 7DH ;; 6
19
DB 07H ;; 7
20
DB 7FH ;; 8
21
DB 6FH ;; 9
22
SEQ:
23
DB 00011111B ;; POS 0
24
DB 00101111B ;; POS 1
25
DB 00110111B ;; POS 2
26
DB 00111011B ;; POS 3
27
DB 00111101B ;; POS 4
28
DB 00111110B ;; POS 5
29
DATA ENDS
30
31
CODE SEGMENT
32
ASSUME CS:CODE, DS:DATA, SS:SSEG
33
START PROC
34
MOV AX, DATA
35
MOV DS, AX
36
37
MOV AL, 10001001B ;; A B OUT, C IN
38
MOV DX, CON8255
39
OUT DX, AL
40
41
MOV AX, 0000H
42
;; DISPLAY 181117
43
LO:
44
MOV AX, 0105H
45
CALL PUT_COND
46
47
MOV AX, 0804H
48
CALL PUT_COND
49
50
MOV AX, 0103H
51
CALL PUT_COND
52
53
MOV AX, 0102H
54
CALL PUT_COND
55
56
MOV AX, 0101H
57
CALL PUT_COND
58
59
MOV AX, 0700H
60
CALL PUT_COND
61
JMP LO
62
63
MOV AX, 4C00H
64
INT 21H
65
START ENDP
66
67
;; NUM: AH
68
;; POS: AL
69
PUT_COND PROC
70
PUSH AX
71
72
MOV BX, 1
73
MOV CL, AL
74
SHL BL, CL
75
76
MOV DX, C8255
77
IN AL, DX
78
79
TEST BL, AL
80
JZ PUT_EXIT
81
POP AX
82
PUSH AX
83
CALL PUT
84
CALL DELAY
85
86
PUT_EXIT:
87
POP AX
88
RET
89
PUT_COND ENDP
90
91
;; NUM: AH
92
;; POS: AL
93
PUT PROC
94
PUSH AX
95
96
;; SELECT POS
97
LEA BX, SEQ
98
PUSH AX
99
MOV AH, 0
100
MOV SI, AX
101
102
;; OUTPUT POS
103
MOV DX, A8255
104
MOV AL, [BX+SI]
105
OUT DX, AL
106
POP AX
107
108
;; SELECT NUM
109
LEA BX, TBL
110
MOV AL, AH
111
MOV AH, 0
112
MOV SI, AX
113
114
;; OUTPUT DATA
115
MOV DX, B8255
116
MOV AL, [BX+SI]
117
OUT DX, AL
118
119
POP AX
120
RET
121
PUT ENDP
122
123
DELAY PROC
124
MOV CX, 0FFH
125
LOOP $
126
RET
127
DELAY ENDP
128
129
CODE ENDS
130
END START

效果

注意左下角的开关(

选做实验 4

说明

在左侧的三个数码管上显示 123,每隔 1 秒钟向右移动一位(循环)。

实现

这里用到的是 8254 延时,不过实验的时候 8254 好像出了什么状况不大行。因此以下代码仅供参考。

1
A8255 EQU 0600H
2
B8255 EQU 0602H
3
C8255 EQU 0604H
4
CON8255 EQU 0606H
5
6
C008254 EQU 0640H
7
C018254 EQU 0642H
8
C028254 EQU 0644H
9
CON8254 EQU 0646H
10
11
SSEG SEGMENT STACK
12
DW 0, 0, 0, 0
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
SEQ:
28
DB 00011111B ;; POS 0
29
DB 00101111B ;; POS 1
30
DB 00110111B ;; POS 2
31
DB 00111011B ;; POS 3
32
DB 00111101B ;; POS 4
33
DB 00111110B ;; POS 5
34
POS DB 05
35
DATA ENDS
36
37
CODE SEGMENT
38
ASSUME CS:CODE, DS:DATA, SS:SSEG
39
START PROC
40
;; INIT 8255
41
MOV AL, 10001001B
42
MOV DX, CON8255
43
OUT DX, AL
44
45
;; MIR6
46
MOV AX, OFFSET MIR6
47
MOV SI, 38H
48
MOV [SI], AX
49
MOV AX, CS
50
MOV SI, 3AH
51
MOV [SI], AX
52
53
MOV AX, DATA
54
MOV DS, AX
55
56
;; INIT 8259
57
CLI
58
MOV AL, 11H
59
OUT 20H, AL
60
MOV AL, 08H
61
OUT 21H, AL
62
MOV AL, 04H
63
OUT 21H, AL
64
MOV AL, 07H
65
OUT 21H, AL
66
MOV AL, 2FH
67
OUT 21H, AL
68
STI
69
70
;; INIT 8254
71
MOV DX, CON8254
72
MOV AL, 00110110B
73
OUT DX, AL
74
MOV DX, C008254
75
MOV AL, 00H
76
OUT DX, AL
77
MOV AL, 48H
78
OUT DX, AL
79
80
MOV AX, 0000H
81
LO:
82
MOV AH, 01H
83
MOV AL, POS
84
CALL PUT_PRE
85
CALL PUT
86
CALL DELAY
87
88
INC AH
89
DEC AL
90
CALL PUT_PRE
91
CALL PUT
92
CALL DELAY
93
94
INC AH
95
DEC AL
96
CALL PUT_PRE
97
CALL PUT
98
CALL DELAY
99
100
JMP LO
101
102
MOV AX, 4C00H
103
INT 21H
104
START ENDP
105
106
MIR6:
107
DEC AX
108
DEC POS
109
CMP POS, 0
110
JGE MIR6_END
111
ADD POS, 6
112
MIR6_END:
113
IRET
114
115
PUT_PRE PROC
116
CMP AH, 0
117
JGE SKIP_AH
118
ADD AH, 10
119
SKIP_AH:
120
CMP AL, 0
121
JGE FIN_PRE
122
ADD AL, 6
123
FIN_PRE:
124
RET
125
PUT_PRE ENDP
126
127
;; NUM: AH
128
;; POS: AL
129
PUT PROC
130
PUSH AX
131
132
;; SELECT POS
133
LEA BX, SEQ
134
PUSH AX
135
MOV AH, 0
136
MOV SI, AX
137
138
;; OUTPUT POS
139
MOV DX, A8255
140
MOV AL, [BX+SI]
141
OUT DX, AL
142
POP AX
143
144
;; SELECT NUM
145
LEA BX, TBL
146
MOV AL, AH
147
MOV AH, 0
148
MOV SI, AX
149
150
;; OUTPUT DATA
151
MOV DX, B8255
152
MOV AL, [BX+SI]
153
OUT DX, AL
154
155
POP AX
156
RET
157
PUT ENDP
158
159
DELAY PROC
160
MOV CX, 0FFH
161
LOOP $
162
RET
163
DELAY ENDP
164
165
DELAY_LONG PROC
166
MOV CX, 0FFFFH
167
LOOP $
168
MOV CX, 0FFFFH
169
LOOP $
170
MOV CX, 0FFFFH
171
LOOP $
172
MOV CX, 0FFFFH
173
LOOP $
174
RET
175
DELAY_LONG ENDP
176
177
CODE ENDS
178
END START