Sky's blog

微机实验考试代码

Word count: 5,096 / Reading time: 25 min
2017/06/21 Share

8255键盘专题

8255-用发光二极管显示键值(顺序6)

要求:

1
利用8255对键盘的行列扫描控制,键值由8255输出至发光二极管显示。8255口地址290H

注意,此时用C口输出到二极管(不用接数码管了),所以直接把键值打到C口输出到二极管就行
实现代码:

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
PORT_A EQU 290H		;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

DATA SEGMENT
;键盘扫描表
; 0 1 2 3 4 5 6 7
KEYB DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH
; 8 9 A B C D E F
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

;方式0,A端口和C端口输出,B端口输入
MOV DX,PORT_CTL ;控制字端口
MOV AL,10000010B ;控制字
OUT DX,AL
MOV DX,PORT_C
MOV AL,00H
OUT DX,AL
;向所有行送0
RE: MOV DX,PORT_A
MOV AL,00H
OUT DX,AL
;查是否全松开
MOV DX,PORT_B
WAIT_O: IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE WAIT_O
;查是否有键按下
WAIT_P: IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;消抖
MOV CX,16EAH
DELAY: LOOP DELAY ;延时20ms
;检查按键是否仍按着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;确定那一个键按下
MOV AL,0FEH
MOV CL,AL
NEXT_R: MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE
ROL CL,01
MOV AL,CL
JMP NEXT_R
;编码
ENCODE: MOV BX,0000FH
IN AL,DX
NEXT_T: CMP AL,KEYB[BX]
JE DONE
DEC BX
JNS NEXT_T ;不为负值,继续查
MOV AH,01 ;减为负值,出错码01→AH
JMP EXIT
DONE: MOV AL,BL ;此时AL里存放的是键值
MOV DX,PORT_C ;直接打到C口就行(因为只有0-15,所以最多亮4个二极管,不必惊慌)
OUT DX,AL
JMP RE
EXIT:
HLT
CODE ENDS
END START

8255-与0832的电机转动(顺序8)

要求:

1
利用8255对键盘的行列扫描控制,键值由七段数码管显示。当按4号键时由0832启动电机,当6号键时0832停止电机转动。8255控制口地址283H,0832地址290H

实现代码:

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
PORT_A EQU 280H		;8255A口地址
PORT_B EQU 281H ;8255B口地址
PORT_C EQU 282H ;8255C口地址
PORT_CTL EQU 283H ;8255控制口地址

DATA SEGMENT
;键盘扫描表
; 0 1 2 3 4 5 6 7
KEYB DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH
; 8 9 A B C D E F
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH
;数码管表,共阳
; 0 1 2 3 4 5 6 7
TUBE DB 40H,79H,24H,30H,19H,12H,02H,78H
; 8 9 A B C D E F
DB 00H,10H,08H,03H,46H,21H,06H,0EH
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

;方式0,A端口和C端口输出,B端口输入
MOV DX,PORT_CTL ;控制字端口
MOV AL,10000010B ;控制字
OUT DX,AL
MOV DX,PORT_C
MOV AL,0FFH
OUT DX,AL
;向所有行送0
RE: MOV DX,PORT_A
MOV AL,00H
OUT DX,AL
;查是否全松开
MOV DX,PORT_B
WAIT_O: IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE WAIT_O
;查是否有键按下
WAIT_P: IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;消抖
MOV CX,16EAH
DELAY: LOOP DELAY ;延时20ms
;检查按键是否仍按着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;确定那一个键按下
MOV AL,0FEH
MOV CL,AL
NEXT_R: MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE
ROL CL,01
MOV AL,CL
JMP NEXT_R
;编码
ENCODE: MOV BX,0000FH
IN AL,DX
NEXT_T: CMP AL,KEYB[BX]
JE DONE
DEC BX
JNS NEXT_T ;不为负值,继续查
MOV AH,01 ;减为负值,出错码01→AH
JMP EXIT
DONE: MOV AL,BL
MOV AH,00
MOV BX,OFFSET TUBE
XLAT
NOT AL
MOV DX,PORT_C
OUT DX,AL
CMP AL,0E6H
JZ BEGAIN
CMP AL,11111101B
JZ STOP
JMP RE

BEGAIN:
MOV AL,0FFH
MOV DX,290H
OUT DX,AL
JMP RE
STOP:
MOV AL,00H
MOV DX,290H
OUT DX,AL
JMP RE
EXIT:
HLT
CODE ENDS
END START

8255-LED红绿(顺序12)

要求:

1
利用8255合理分配对键盘的行列扫描控制,键值由8255输出七段数码管显示,2号键LED红灯亮,6号键LED绿灯亮,8255控制口地址293H

注意,此时A口用了低4位作为行,B口全部用完,C口全部用完,所以想控制LED灯,就需要用到A口的高4位,这里既然只有红绿2种,所以用PA4,PA5即可
因为我在宿舍写的,所以不记得灯的顺序了,假设右边第一个为红灯,右边第二个为绿灯
所以PA4接右边第一个,PA5接右边第二个
实现代码:

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
PORT_A EQU 290H		;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

DATA SEGMENT
;键盘扫描表
; 0 1 2 3 4 5 6 7
KEYB DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH
; 8 9 A B C D E F
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH
;数码管表,共阳
; 0 1 2 3 4 5 6 7
TUBE DB 40H,79H,24H,30H,19H,12H,02H,78H
; 8 9 A B C D E F
DB 00H,10H,08H,03H,46H,21H,06H,0EH
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

;方式0,A端口和C端口输出,B端口输入
MOV DX,PORT_CTL ;控制字端口
MOV AL,10000010B ;控制字
OUT DX,AL
MOV DX,PORT_C
MOV AL,0FFH
OUT DX,AL
;向所有行送0
RE: MOV DX,PORT_A
MOV AL,00H
OUT DX,AL
;查是否全松开
MOV DX,PORT_B
WAIT_O: IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE WAIT_O
;查是否有键按下
WAIT_P: IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;消抖
MOV CX,16EAH
DELAY: LOOP DELAY ;延时20ms
;检查按键是否仍按着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_P
;确定那一个键按下
MOV AL,0FEH
MOV CL,AL
NEXT_R: MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE
ROL CL,01
MOV AL,CL
JMP NEXT_R
;编码
ENCODE: MOV BX,0000FH
IN AL,DX
NEXT_T: CMP AL,KEYB[BX]
JE DONE
DEC BX
JNS NEXT_T ;不为负值,继续查
MOV AH,01 ;减为负值,出错码01→AH
JMP EXIT
DONE: MOV AL,BL
MOV AH,00
MOV BX,OFFSET TUBE
XLAT
NOT AL ;AL取反,为了查数码管表
MOV DX,PORT_C
OUT DX,AL
NOT AL ;AL再取反回来
CMP AL,79H ;AL是不是2
JZ RED ;是2,跳到红灯显示
CMP AL,02H ;AL是不是6
JZ GREEN ;是6,跳到绿灯显示
JMP RE

RED:
MOV AL,00010000B ;给PA4赋1
MOV DX,290H
OUT DX,AL ;A口输出,此时应该只有PA4接的灯亮,即红灯
JMP RE
GREEN:
MOV AL,00100000B ;给PA5赋1
MOV DX,290H
OUT DX,AL ;A口输出,此时应该只有PA5接的灯亮,即绿灯
JMP RE

EXIT:
HLT
CODE ENDS
END START

0809专题

0809-输出2进制于数码管(顺序3)

要求:

1
将0809输出的2进制数在七段数码管显示(结果为2位16进制数),0809要求将IN0作为模拟输入端口,INO端口地址为280H,8255A口地址为290H

这个比较变态,因为要让七段数码管中两个显示的值不同,所以老师看了后说改成延时,先显示低位,隔段时间再显示高位
所以我就按老师的意思来了(毕竟我太菜,也不会让两个数码管显示不同值)
INO0直接接在0~5V可调电压上
注意了,EOC接PC0,PB0~PB7接数码管
实现代码:

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
PORT_A EQU 290H		;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

DATA SEGMENT
;数码管表,共阳(实验是共阴,所以要取反)
; 0 1 2 3 4 5 6 7
TUBE DB 40H,79H,24H,30H,19H,12H,02H,78H
; 8 9 A B C D E F
DB 00H,10H,08H,03H,46H,21H,06H,0EH
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV DX,PORT_CTL ;初始化8255
MOV AL,10010001B ;A口输入,读值,B口输出,打到数码管,C口输入,PC0接EOC判断用
OUT DX,AL
NEXT: MOV DX,280H ;指向ADC通道0
OUT DX,AL ;启动转换
MOV DX,PORT_C ;指向8255的C口
POLL:
IN AL,DX ;读C口值
TEST AL,01H ;测试PC0是否为1
JZ POLL ;是0,转换未结束,继续等待
MOV DX,280H ;是1,转换结束,指向ADC通道0
IN AL,DX ;读取转换后数据
AND AL,0FH ;取低4位
MOV BX,OFFSET TUBE ;指向数码管表
XLAT
NOT AL ;取反
MOV DX,PORT_B ;指向8255的B口
OUT DX,AL ;将低4位值显示在数码管上
MOV BX,1000
DELAY: ;双重延时
MOV CX,0FFFFH
DELAY1:
LOOP DELAY1
DEC BX
JNZ DELAY
MOV DX,280H ;延时结束后,再指回ADC的通道0
IN AL,DX ;再读一次数据
AND AL,F0H ;取高4位
MOV BX,OFFSET TUBE ;指向数码管表
XLAT
NOT AL ;取反
MOV DX,PORT_B ;指向8255的B口
OUT DX,AL ;将高4位值显示在数码管上
DELAY: ;再次双重延时
MOV CX,0FFFFH
DELAY1:
LOOP DELAY1
DEC BX
JNZ DELAY
JMP NEXT ;延时结束,跳回NEXT,进行一下轮实现
CODE ENDS
END START

0809-LED红绿灯(顺序9,10)

这是顺序9的,顺序10差不多,不写了
要求:

1
当0809采集数据超过4V时,红灯亮;当低于4V高于2.5V时,绿灯亮;低于2.5V黄灯亮,0809基地址为288H,8255控制口地址293H

注意,这里需要计算:
4/0.01953=204
即1100 1100B = CCH
2.5/0.01953=81
即0101 0001B = 51H
故只要读转换后的数据,大于CCH时,红灯亮,低于51H时,黄灯亮,其余时候绿灯亮
接线时候,A口读入ADC转换后数据,C口读入EOC数据(PC0接EOC),B口可以用来输出,故可以PB0接红灯,PB1接绿灯,PB2接黄灯
另外,只需要用IN0即可,单通道采集,IN0接0~5V可调电压上
实现代码:

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
PORT_A EQU 290H		;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,PORT_CTL ;DX指向控制口
MOV AL,10010001B ;送控制字,A,C口输入,B口输出
OUT DX,AL
NEXT: MOV DX,288H ;指向ADC通道0
OUT DX,AL ;启动转换
MOV DX,PORT_C ;指向8255的C口
POLL:
IN AL,DX ;读C口数据
TEST AL,01H ;测试PC0,即EOC是否为1
JZ POLL ;为0,转换未结束,继续等待
MOV DX,280H ;为1,转换结束,再次指向ADC通道0
IN AL,DX ;读转换后的数据
CMP AL,CCH ;看电压是否大于4V
JAE RED ;大于等于4V,跳转到红灯函数
CMP AL,51H ;看电压是否小于2.5V
JB YELLOW ;小于2.5V,跳转到黄灯函数
MOV AL,00000010B ;既不大于4V,也不小于2.5V,则亮绿灯
MOV DX,PORT_B ;指向8255的B口
OUT DX,AL ;亮绿灯
JMP NEXT ;跳回下一次循环
RED:
MOV AL,00000001B
MOV DX,PORT_B
OUT DX,AL
JMP NEXT
YELLOW:
MOV AL 00000100B
MOV DX,PORT_B
OUT DX,AL
JMP NEXT
CODE ENDS
END START

0809-LED显示(顺序4)

要求:

1
将0809输出的2进制在LED灯上显示。0809要求用IN5作为模拟量输入端口,IN0端口地址为288H,8255A口的地址为290H

这个真的是最简单的= =
这里把IN5连到0~5V可调电压就行了,PC0还是连EOC
实现代码

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
PORT_A EQU 290H			;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,PORT_CTL
MOV AL,10010001B ;A,C口输入,B口输出
OUT DX,AL
NEXT: MOV DX,28DH ;IN5通道
OUT DX,AL
MOV DX,PORT_C
POLL:
IN AL,DX
TEST AL,01H
JZ POLL
MOV DX,28DH
IN AL,DX
MOV DX,PORT_B
OUT DX,AL
JMP NEXT
CODE ENDS
END START

8253专题

8253-实现左右轮循环跑马灯(顺序1,2)

这是顺序2的,顺序1和这个就换了方向,不写了
要求:

1
利用8253提供定时时间(2秒),8255输出至发光二极管,显示要求为:从左向右移位显示一次循环,然后从右向左移位显示一次循环。8253控制口地址283H,8255控制口地址293H。

需要一些计算,在CLK0加2MHZ,故此需要级联,让通道0工作在方式2,通道1工作在方式3,让通道1的OUT0的输出送入CLK1作为输入,故此OUT1的输出周期就成2S
2MHZ/5000 =400HZ
400HZ/0.5 =800HZ(0.5是因为2秒的频率是1/2HZ)
因此通道0的NO=5000,通道1的N1=800
实现代码:

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
PORT_A EQU 290H			;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址

PORT_1 EQU 280H
PORT_2 EQU 281H
PORT_3 EQU 282H
PORT_CTL2 EQU 283H

STACK SEGMENT STACK
DB 50 DUP(?)
TOP_S LABEL WORD
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,SS:STACK

START:
MOV AX,STACK
MOV SS,AX
LEA SP,TOP_S

MOV AL,00110101B ;8253的通道0,先送低字节,再送高字节,方式2,BCD码
MOV DX,PORT_CTL2
OUT DX,AL ;8253初始化
MOV AL,00H ;向8253的通道0,N0赋5000
MOV DX,PORT_1
OUT DX,AL
MOV AL,50H
MOV DX,PORT_1
OUT DX,AL

MOV AL,01110111B ;8253的通道1,先送低字节,再送高字节,方式3,BCD码
MOV DX,PORT_CTL2
OUT DX,AL ;8253初始化
MOV AL,00H ;向8253的通道1,N1赋800
MOV DX,PORT_2
OUT DX,AL
MOV AL,08H
MOV DX,PORT_2
OUT DX,AL

MOV DX,PORT_CTL ;8255初始化
MOV AL,10011001B ;B端口输出,A端口控制输入,C端口延时输入
OUT DX,AL
MOV AL,10000000B ;先亮最左边的灯
PUSH AX ;压栈

TEST1:
MOV DX,PORT_B ;B口输出
POP AX ;AL出栈
OUT DX,AL
PUSH AX ;将此时的AL再压栈

cmp AL,00000001B ;看有没有到右边
JZ TEST2 ;到右边了即跳到test2

DELAY1: ;延时
MOV DX,PORT_C
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JZ DELAY1 ;低电平跳出
DELAY2:
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JNZ DELAY2 ;高电平跳出


POP AX ;AL出栈
ROR AL,01 ;循环右移
PUSH AX ;AL再压栈
JMP TEST1 ;返回TEST1

TEST2:
MOV DX,PORT_B
POP AX ;此时AL=00000001B
OUT DX,AL ;亮最右边的灯
PUSH AX
CMP AL,10000000B ;看是否亮到了最左边的灯
JZ TEST1 ;是,跳回TEST1

DELAY3:
MOV DX,PORT_C
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JZ DELAY3 ;低电平跳出
DELAY4:
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JNZ DELAY4 ;高电平跳出


POP AX
ROL AL,01 ;循环左移
PUSH AX
JMP TEST2

CODE ENDS
END START

8253-与0832产生三角波延时(顺序5,7)

这是顺序7的,顺序5的和这个差不多,不写了
要求:

1
利用8253控制0832产生三角波的延时,要求在产生三角波中利用8253产生延时(10ms)上升,当三角波为最大值后利用8253产生延时(10ms)下降,当三角波为0时产生2秒延时,以此循环,0832地址280H,8253控制口地址293H,8255控制口地址28BH

10ms = 100HZ
故初值N2=2MHZ/100HZ=20000=0100 1110 0010 0000B
所以可以使用二进制方式,通道2,工作在方式3,初值N2分高低送入,10进制为20000
对于2s延时,需要使用级联
在CLK0加2MHZ,故此需要级联,让通道0工作在方式2,通道1工作在方式3,让通道1的OUT0的输出送入CLK1作为输入,故此OUT1的输出周期就成2S
2MHZ/5000 =400HZ
400HZ/0.5 =800HZ(0.5是因为2秒的频率是1/2HZ)
因此通道0的NO=5000,通道1的N1=800
注意:2S的接PC1,10ms的接PC0
实现代码:

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
PORT_A EQU 288H			;8255A口地址
PORT_B EQU 289H ;8255B口地址
PORT_C EQU 28AH ;8255C口地址
PORT_CTL EQU 28BH ;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE

STRAT:
MOV DX,PORT_CTL ;8255初始化
MOV AL,10011001B ;B端口输出,A端口控制输入,C端口延时输入
OUT DX,AL

MOV AL,10110110B ;8253的通道2,先送低字节,再送高字节,方式3,二进制
MOV DX,293H
OUT DX,AL ;8253初始化
MOV AL,00100000B ;给通道2赋初值20000
MOV DX,292H
OUT DX,AL
MOV AL,01001110B
OUT DX,AL

MOV AL,00110101B ;8253的通道0,先送低字节,再送高字节,方式2,BCD码
MOV DX,293H
OUT DX,AL ;8253初始化
MOV AL,00H ;向8253的通道0,N0赋5000
MOV DX,290H
OUT DX,AL
MOV AL,50H
OUT DX,AL

MOV AL,01110111B ;8253的通道1,先送低字节,再送高字节,方式3,BCD码
MOV DX,293H
OUT DX,AL ;8253初始化
MOV AL,00H ;向8253的通道1,N1赋800
MOV DX,291H
OUT DX,AL
MOV AL,08H
OUT DX,AL

BEGIN:
MOV AL,0FFH
MOV DX,280H
UP:
CMP AL,00H
JZ DELAY5
GO:
INC AL
OUT DX,AL
DELAY1: ;延时
MOV DX,PORT_C
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JZ DELAY1 ;低电平跳出
DELAY2:
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JNZ DELAY2 ;高电平跳出
CMP AL,0FFH
JNZ UP
MOV DX,280H
DOWN:
DEC AL
OUT DX,AL
DELAY3:
MOV DX,PORT_C
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JZ DELAY3 ;低电平跳出
DELAY4:
IN AL,DX
AND AL,00000001B ;取PC0
CMP AL,00000001B
JNZ DELAY4 ;高电平跳出
CMP AL,00H
JNZ DOWN
JMP UP

DELAY5:
MOV DX,PORT_C
IN AL,DX
AND AL,00000010B ;取PC1
CMP AL,00000010B
JZ DELAY5 ;低电平跳出
DELAY6:
IN AL,DX
AND AL,00000010B ;取PC1
CMP AL,00000010B
JNZ DELAY6 ;高电平跳出
JMP GO

0832专题

0832-产生规定电压(顺序11)

要求:

1
要求在0832依次产生1V、2.5V、5V电压提供给0809转换结果在LED灯上显示。0809基地址为280H,0832基地址288H,8255基地址290H

这个题看着好烦(嘤嘤嘤,用3个芯片)
将ua接到0809的INO上,EOC还是接PC0,8255的B口输出,C口低位输入,A口输入
还是有计算
1/0.01953=51
2.5/0.01953=128
5直接就是FFH了
1是33H
2.5是80H
实现代码:

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
PORT_A EQU 290H		;8255A口地址
PORT_B EQU 291H ;8255B口地址
PORT_C EQU 292H ;8255C口地址
PORT_CTL EQU 293H ;8255控制口地址


CODE SEGMENT
ASSUME CS:CODE
START:
MOV DX,PORT_CTL ;8255初始化
MOV AL,10010001B
OUT DX,AL
MOV AL,0FFH
AGAIN:
INC AL
CMP AL,33H ;一连串比较,是不是1V
JZ SHUCHU
CMP AL,80H ;一连串比较,是不是2.5V
JZ SHUCHU
CMP AL,0FFH ;一连串比较,是不是5V
JZ SHUCHU
JMP AGAIN ;都不是,跳回AGAIN,继续增加电压
SHUCHU:
MOV DX,288H ;指向0832的输出
OUT DX,AL ;电压输出
NEXT: MOV DX,280H ;指向0809ADC通道0
OUT DX,AL ;启动转换
MOV DX,PORT_C ;指向8255的C口
POLL:
IN AL,DX ;读C口值
TEST AL,01H ;测试PC0是否为1,即EOC是否为1
JZ POLL ;是0,转换未结束,继续等待
MOV DX,280H ;是1,转换结束,指向ADC通道0
IN AL,DX ;读取转换后数据
MOV DX,PORT_B ;将数据显示在二极管上
OUT DX,AL
MOV BX,80H ;延时
DELAY:
MOV CX,16EAH
DELAY1:
LOOP DELAY1
DEC BX
JNZ DELAY
JMP AGAIN
CODE ENDS
END

CATALOG
  1. 1. 8255键盘专题
    1. 1.1. 8255-用发光二极管显示键值(顺序6)
    2. 1.2. 8255-与0832的电机转动(顺序8)
    3. 1.3. 8255-LED红绿(顺序12)
  2. 2. 0809专题
    1. 2.1. 0809-输出2进制于数码管(顺序3)
    2. 2.2. 0809-LED红绿灯(顺序9,10)
    3. 2.3. 0809-LED显示(顺序4)
  3. 3. 8253专题
    1. 3.1. 8253-实现左右轮循环跑马灯(顺序1,2)
    2. 3.2. 8253-与0832产生三角波延时(顺序5,7)
  4. 4. 0832专题
    1. 4.1. 0832-产生规定电压(顺序11)