西电计科微机原理实验四

实验要求

  1. 流水灯实验:利用8255的A口、B口、C口循环点亮发光二极管。
  2. 根据输入控制灯的亮灭
  3. 在完成(1)基础上,增加通过读取开关控制流水灯的循环方向和循环方式。

跟上一次实验基本相同,换了个芯片,然后控制的范围从八颗发光二极管变为了十六颗发光二极管

基础版

简单实现了功能1和2,全1左移,全0右移

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
COM_ADD EQU 0273H 
PA_ADD EQU 0270H
PB_ADD EQU 0271H
PC_ADD EQU 0272H
_STACK SEGMENT STACK
DW 100 DUP(?)
_STACK ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CODE SEGMENT
START PROC NEAR
ASSUME CS:CODE, DS:_DATA, SS:_STACK
MOV AX,_DATA ; 将数据段地址加载到AX寄存器
MOV DS,AX ; 将数据段地址传送给数据段寄存器DS
NOP
MOV DX,COM_ADD ; 将串口地址传送给DX寄存器
MOV AL,82H ; 设置AL寄存器的值为82H
OUT DX,AL


INPUT:
; 清零操作
MOV AX, 0FFFFH
MOV DX, PA_ADD
OUT DX, AX
MOV DX, PC_ADD
OUT DX, AX
; 输入操作
MOV DX, PB_ADD
IN al, DX
mov ah, 0

; 判断
CMP al, 0FFH ;全1
JZ low1
CMP al, 0 ;全0
JZ high1
MOV DX, PA_ADD
OUT DX, al
JMP INPUT
; 处理输入值为0-7的情况
low1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
low3:
MOV al, 7FH
MOV DX, PC_ADD
low4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT

; 处理输入值为15-8的情况
high1:
MOV al, 0FEH
MOV DX, PC_ADD
high2:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high2
MOV AX, 0FFFFH
OUT DX, AX
; 处理输入值为7-0的情况
high3:
MOV al, 0FEH
MOV DX, PA_ADD
high4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high4
JMP INPUT




Delay PROC NEAR
Delay1:
XOR CX,CX
LOOP $
RET
Delay ENDP


START ENDP
CODE ENDS
END START

完整版

增加了一些功能:

  • 输入为11010000时,流水灯展示00001101
  • 输入为00001111时,前8颗发光二极管左移,后8颗发光二极管右移
  • 输入为11110000时,前8颗发光二极管右移,后8颗发光二极管左移

这个版本的代码还没有在试验箱上跑过,本来我是想验证完基础版后加上的,但当时我的试验箱出了一些问题,浪费了我好多时间,所以实验的时候只跑了基础版,应该是没有问题的

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
COM_ADD EQU 0273H 
PA_ADD EQU 0270H
PB_ADD EQU 0271H
PC_ADD EQU 0272H
_STACK SEGMENT STACK
DW 100 DUP(?)
_STACK ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CODE SEGMENT
START PROC NEAR
ASSUME CS:CODE, DS:_DATA, SS:_STACK
MOV AX,_DATA ; 将数据段地址加载到AX寄存器
MOV DS,AX ; 将数据段地址传送给数据段寄存器DS
NOP
MOV DX,COM_ADD ; 将串口地址传送给DX寄存器
MOV AL,82H ; 设置AL寄存器的值为82H
OUT DX,AL


INPUT:
; 清零操作
MOV AX, 0FFFFH
MOV DX, PA_ADD
OUT DX, AX
MOV DX, PC_ADD
OUT DX, AX
; 输入操作
MOV DX, PB_ADD
IN al, DX
mov ah, 0
; 判断
CMP al, 0D0H
JZ mid
cmp al, 0FH
JZ lar1
cmp al, 0F0H
JZ ral1
CMP al, 0FFH ;全1,
JZ low1
CMP al, 0 ;全0
JZ high1
MOV DX, PA_ADD
OUT DX, al
JMP INPUT
; 处理输入值为0-7的情况
mid:
shl al,4
shr al,4
shr ah,4
add al,ah
mov ah,0
mov dx, PA_ADD ;00001101
out dx,ax
jmp INPUT



; 处理输入值为0-7的情况
ral1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
ral2:
ROR al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
ral3:
MOV al, 7FH
MOV DX, PC_ADD
ral4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT


; 处理输入值为0-7的情况
lar1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
lar2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
lar3:
MOV al, 7FH
MOV DX, PC_ADD
lar4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT




; 处理输入值为0-7的情况
low1:
MOV al, 7FH ; 设置AL寄存器的值为7FH
MOV DX, PA_ADD ; 将并口PA地址传送给DX寄存器
low2:
ROL al, 1 ; 将AL寄存器的值左循环移位1位
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low2
MOV AX, 0FFFFH ; 将AX寄存器的值设为0xFFFF
OUT DX, AX
; 处理输入值为8-15的情况
low3:
MOV al, 7FH
MOV DX, PC_ADD
low4:
ROL al, 1
OUT DX, al
CALL Delay
CMP al, 7FH
JNE low4
JMP INPUT

; 处理输入值为15-8的情况
high1:
MOV al, 0FEH
MOV DX, PC_ADD
high2:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high2
MOV AX, 0FFFFH
OUT DX, AX
; 处理输入值为7-0的情况
high3:
MOV al, 0FEH
MOV DX, PA_ADD
high4:
ROR al, 1
OUT DX, al
CALL Delay
CMP al, 0FEH
JNE high4
JMP INPUT




Delay PROC NEAR
Delay1:
XOR CX,CX
LOOP $
RET
Delay ENDP


START ENDP
CODE ENDS
END START