Skip to content

TD-PITE 型微机系统与接口实验

Published: at 16:30

ToC

说明

本系列为 TD-PITE 型微机系统与接口实验的实验源码,附选做实验。

实验内容

  1. 8255 并行接口实验(略)
  2. 存储器扩展实验
  3. 8259 中断优先级实验
  4. A/D 转换实验
  5. D/A 转换实验
  6. 8254 定时/计数器实验
  7. 8251 串行接口实验
  8. 数码管显示实验
  9. 键盘扫描及数码管显示实验
  10. 微机接口综合实验

代码片段

这里列举一些可以复用的代码片段,可用于期末测试。

程序结构

1
;; 四个 IOY 口对应的首地址,供参考
2
IOY0 EQU 0600H
3
IOY1 EQU 0640H
4
IOY2 EQU 0680H
5
IOY3 EQU 06C0H
6
7
;; 栈区声明
8
SSEG SEGMENT STACK
9
DW 20 DUP(?)
10
SSEG ENDS
11
12
;; 数据区声明
13
DATA SEGMENT
14
DB 8 DUP(?)
15
DATA ENDS
16
17
CODE SEGMENT
18
ASSUME CS:CODE, DS:DATA, SS:SSEG
19
20
START PROC
21
MOV AX, 0
22
MOV DS, AX
23
;; --------------------------------------------------
24
;; 此时可初始化中断
25
;; MOV AX, 1
26
;; --------------------------------------------------
27
28
MOV AX, DATA
29
MOV DS, AX
30
;; --------------------------------------------------
31
;; 此时可使用 DATA 段
32
;; MOV AX, 1
33
;; --------------------------------------------------
34
35
;; 程序退出
36
MOV AX, 4C00H
37
INT 21H
38
START ENDP
39
40
;; --------------------------------------------------
41
;; 此处可放置其他函数
42
;; TEST PROC
43
;; RET
44
;; TEST ENDP
45
;; --------------------------------------------------
46
CODE ENDS
47
END START

延时

可以通过调整 CX 的大小,控制延时的时间。

如果不考虑 CX,可以考虑删除下面关于 CXPUSHPOP

1
DELAY PROC
2
PUSH CX
3
MOV CX, 0FFH
4
LOOP $
5
POP CX
6
RET
7
DELAY ENDP

8259 初始化(中断)

放置在可初始化中断处。如果不需要使用 MIR7,可以删除 ;;MIR7 部分。

1
;; MIR6
2
MOV AX, OFFSET MIR6
3
MOV SI, 38H
4
MOV [SI], AX
5
MOV AX, CS
6
MOV SI, 3AH
7
MOV [SI], AX
8
9
;; MIR7
10
MOV AX, OFFSET MIR7
11
MOV SI, 3CH
12
MOV [SI], AX
13
MOV AX, CS
14
MOV SI, 3EH
15
MOV [SI], AX
16
17
;; --------------------------------------------------
18
;; 初始化 8259
19
CLI
20
MOV AL, 11H
21
OUT 20H, AL
22
MOV AL, 08H
23
OUT 21H, AL
24
MOV AL, 04H
25
OUT 21H, AL
26
MOV AL, 07H
27
OUT 21H, AL
28
MOV AL, 2FH
29
OUT 21H, AL
30
STI
31
;; --------------------------------------------------

8254 方波初始化(计数器)

通过改变计数初值,可以改变方波的周期。

当连接 18.432KHz 时钟源时,使用 4800H 作为计数初值可以使 OUT 的输出周期为 1s

1
MOV DX, CON8254
2
MOV AL, 00110110B
3
OUT DX, AL
4
5
MOV DX, C018254
6
MOV AL, 00H ;; 低 8 位
7
OUT DX, AL
8
9
MOV AL, 48H ;; 高 8 位
10
OUT DX, AL

数码管显示

预定义数据

1
;; 预定义 8255 的端口
2
;; 此处使用的是 IOY0,根据需求修改
3
A8255 EQU 0600H
4
B8255 EQU 0602H
5
C8255 EQU 0604H
6
CON8255 EQU 0606H
7
8
;; 在数据区中增加如下内容
9
DATA SEGMENT
10
TBL:
11
DB 3FH ;; 0
12
DB 06H ;; 1
13
DB 5BH ;; 2
14
DB 4FH ;; 3
15
DB 66H ;; 4
16
DB 6DH ;; 5
17
DB 7DH ;; 6
18
DB 07H ;; 7
19
DB 7FH ;; 8
20
DB 6FH ;; 9
21
DB 77H ;; A
22
DB 7CH ;; B
23
DB 39H ;; C
24
DB 5EH ;; D
25
DB 79H ;; E
26
DB 71H ;; F
27
DB 00H ;; CLR
28
SEQ:
29
DB 00011111B ;; POS 0
30
DB 00101111B ;; POS 1
31
DB 00110111B ;; POS 2
32
DB 00111011B ;; POS 3
33
DB 00111101B ;; POS 4
34
DB 00111110B ;; POS 5
35
DATA ENDS

初始化 8255

1
MOV AL, 81H
2
MOV DX, CON8255
3
OUT DX, AL

字符显示

AH 的数值输出到第 AL 位数码管。

1
;; 输出 AH 到 AL 位数码管
2
PUT PROC
3
PUSH AX
4
LEA BX, SEQ
5
PUSH AX
6
MOV AH, 0
7
MOV SI, AX
8
MOV DX, A8255
9
MOV AL, [BX+SI]
10
OUT DX, AL
11
POP AX
12
LEA BX, TBL
13
MOV AL, AH
14
MOV AH, 0
15
MOV SI, AX
16
MOV DX, B8255
17
MOV AL, [BX+SI]
18
OUT DX, AL
19
POP AX
20
RET
21
PUT ENDP

键盘输入

检测是否有键按下

调用后通过检查 AX 判断是否有键按下。AX=1 表示有键按下,AX=0 表示无键按下。

1
KEY_PRESSED PROC
2
MOV DX, A8255
3
MOV AL, 00H
4
OUT DX, AL
5
MOV DX, C8255
6
IN AL, DX
7
AND AL, 0FH
8
CMP AL, 0FH
9
JE KP_NONE
10
MOV AX, 1
11
RET
12
KP_NONE:
13
MOV AX, 0
14
RET
15
KEY_PRESSED ENDP

检测当前按下的按键

调用后 AX 中存储按下的键。当无键按下时,AX=10H

1
SCAN PROC
2
BEGIN:
3
CALL KEY_PRESSED
4
CMP AX, 0
5
JE SCAN_NO_KEY
6
7
CALL DELAY
8
CALL KEY_PRESSED
9
CMP AX, 0
10
JE SCAN_NO_KEY
11
12
MOV CH, 0FEH
13
MOV CL, 0
14
COLUMN:
15
MOV AL, CH
16
MOV DX, A8255
17
OUT DX, AL
18
MOV DX, C8255
19
IN AL, DX
20
L1:
21
TEST AL, 1
22
JNZ L2
23
MOV AL, 00H
24
JMP KCODE
25
L2:
26
TEST AL, 2
27
JNZ L3
28
MOV AL, 04H
29
JMP KCODE
30
L3:
31
TEST AL, 4
32
JNZ L4
33
MOV AL, 08H
34
JMP KCODE
35
L4:
36
TEST AL, 8
37
JNZ NEXT
38
MOV AL, 0CH
39
KCODE:
40
ADD AL, CL
41
JMP SCAN_FIN
42
NEXT:
43
INC CL
44
MOV AL, CH
45
TEST AL, 08H
46
JE SCAN_NO_KEY
47
ROL AL, 1
48
MOV CH, AL
49
JMP COLUMN
50
51
SCAN_NO_KEY:
52
MOV AX, 10H
53
SCAN_FIN:
54
RET
55
SCAN ENDP

简单使用流程

1
START PROC
2
MOV AX, DATA
3
MOV DS, AX
4
5
MOV AL, 81H
6
MOV DX, CON8255
7
OUT DX, AL ;; 初始化 8255
8
9
MOV AX, 0000H
10
LO:
11
CALL NUM_DISPLAY ;; 数码管显示
12
CALL SCAN ;; 扫描键盘输入
13
CMP AX, 10H ;; 检测是否有键按下
14
JE LO ;; 无键按下则继续循环
15
WAIT_UP:
16
CALL NUM_DISPLAY ;; 可在此时在数码管上显示数据
17
CALL KEY_PRESSED ;; 检测是否有键按下
18
CMP AX, 1 ;; 如有键按下
19
JE WAIT_UP ;; 则继续等待,即等待 KEY_UP
20
JMP LO ;; 用户释放按键,继续监听下一个按键事件
21
22
MOV AX, 4C00H
23
INT 21H
24
START ENDP