实验八 数码管显示实验
1. 实验内容
基础部分
- 用一片 8255 接口芯片的 A 口和 B 口分别连接数码管段码接口(ABCDEFG、Dp)和位码接口(X1~X6)。编写程序实现以下两种显示方式:
使六位数码管从右到左逐位显示移动的数字 0 到 9,即数字 0 从最右端移动到最左端,数字 1 从最右端移动到最左端,….,数字 9 从最右端移动到最左端,循环上述过程;
使六位数码管从左到右稳定显示数字“123456”。
扩展部分
- 编写数码管显示子程序,可实现 1 个或多个数码管的稳定显示,使用入口参数定义拟显示的位置和显示的内容。使用该子程序,重新完成基础实验 1 和 2。
- 在数码管上显示学号后六位,并使用 6 个开关控制对应数码管的亮灭(例如,开关为 1 点亮,为 0 熄灭)。
- 在左侧的三个数码管上显示“123”,每隔 1 秒钟(可用软件延时,也可用 8254定时)“123”向右移动一位(循环) 。
2. 连线
3. 实验代码
基础部分:
1
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255MODE EQU 0606H
DATA SEGMENT
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX, P8255MODE
MOV AL, 80H ; A,B口输出
OUT DX, AL
MOV DX, P8255A
MOV AL, 00H
OUT DX, AL
MOV DX, P8255B
MOV AL, 00H
OUT DX, AL
LEA BX, TAB
MOV SI, 0
MOV AL, 11011111B ; 从最右侧数码管开始
MAIN:
MOV DX, P8255A ; 选择数码管
OUT DX, AL
ROR AL, 1
PUSH AX
MOV DX, P8255B
MOV AL, [BX+SI]
OUT DX, AL
CALL DELAY
POP AX
CMP AL, 01111111B ; 已经移至最左侧(多循环移动了一位)
JZ INIT_POS
JMP MAIN
INIT_POS: ; 初始化数码管位置
MOV AL, 11011111B
INC SI
CMP SI, 10 ; 已经显示到9(多加了一次)
JZ INIT_DIGIT
JMP MAIN
INIT_DIGIT: ; 初始化数码管数字
MOV SI, 0
JMP MAIN
DELAY:
PUSH CX
MOV CX, 0FFFFH
LOOP $
POP CX
RET
CODE ENDS
END START
2
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255MODE EQU 0606H
DATA SEGMENT
TAB: DB 06H,5BH,4FH,66H,6DH,7DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX, P8255MODE
MOV AL, 80H
OUT DX, AL
LEA BX, TAB
MOV SI, 0
MOV AL, 11111110B ; 从最左侧数码管开始
MAIN:
MOV DX, P8255A ; 选择数码管
OUT DX, AL
ROL AL, 1
PUSH AX
MOV DX, P8255B
MOV AL, [BX+SI]
OUT DX, AL
CALL DELAY
POP AX
INC SI
CMP SI, 6
JZ RESET
JMP MAIN
RESET:
MOV SI, 0
MOV AL, 11111110B
JMP MAIN
DELAY:
PUSH CX
MOV CX, 0FFH
LOOP $
POP CX
RET
CODE ENDS
END START
扩展部分:
1-1 略
1-2
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255MODE EQU 0606H
PUBLIC POS
DATA SEGMENT
TAB DB 06H,5BH,4FH,66H,6DH,7DH
POS DB 11111110B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX, P8255MODE
MOV AL, 80H
OUT DX, AL
LEA BX, TAB
MAIN:
MOV POS, 11111110B
MOV SI, 0
CALL DISPLAY_LEDS
JMP MAIN
DISPLAY_LEDS:
MOV CX, 6
D1: CALL SHOW_DIGIT
ROL POS, 1
INC SI
LOOP D1
RET
SHOW_DIGIT:
MOV DX, P8255A
MOV AL, POS
OUT DX, AL
MOV DX, P8255B
MOV AL, [SI+BX]
OUT DX, AL
CALL DELAY
RET
DELAY:
PUSH CX
MOV CX,0FFH
LOOP $
POP CX
RET
CODE ENDS
END START
2
C口 PC0-PC7 接 K0-K7
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255MODE EQU 0606H
PUBLIC POS
DATA SEGMENT
TAB DB 5BH,3FH,3FH,6DH,06H,7DH
POS DB 11111110B
SSS DB 00100000B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX, P8255MODE
MOV AL, 89H ; A、B口输出,C口输入
OUT DX, AL
LEA BX, TAB
MAIN:
MOV POS, 11111110B ; 从最左侧数码管开始
MOV SSS, 00100000B ; 从最左侧开关开始
MOV SI, 0
CALL DISPLAY_LEDS
JMP MAIN
DISPLAY_LEDS:
MOV CX, 6
D1: CALL SHOW_DIGIT
ROL POS, 1
ROR SSS, 1
INC SI
LOOP D1
RET
SHOW_DIGIT:
MOV DX, P8255A
MOV AL, POS
OUT DX, AL
MOV DX, P8255C ; 读开关状态
IN AL, DX
MOV DX, P8255B
AND AL, SSS ; 判断当前位置开关状态
JZ OFF
MOV AL, [BX+SI]
OUT DX, AL
JMP EXITT
OFF:
MOV AL, 00H
OUT DX, AL
EXITT:
CALL DELAY
RET
DELAY:
PUSH CX
MOV CX,0FFH
LOOP $
POP CX
RET
CODE ENDS
END START
3
定时器接线按照代码自行推知
P8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255MODE EQU 0606H
P8254A EQU 06C0H
P8254B EQU 06C2H
P8254C EQU 06C4H
P8254MODE EQU 06C6H
PUBLIC POS
DATA SEGMENT
TAB DB 06H,5BH,4FH
POS DB 11111110B
INIP DB 11111110B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA AX, MIR7 ; 取中断入口地址
MOV SI, 003CH ; 中断矢量地址
MOV [ES:SI], AX ; 填IRQ7的偏移矢量确定地址
MOV AX, CS ; 段地址
MOV SI, 003EH
MOV [ES:SI], AX ; 填IRQ7的段地址矢量
CLI
MOV DX, P8255MODE
MOV AL, 81H
OUT DX, AL
LEA BX, TAB
MOV DX, P8254MODE
MOV AL, 36H
OUT DX, AL
MOV DX, P8254A
MOV AL, 00H ; 定时器初值4800H
OUT DX, AL
MOV AL, 48H
OUT DX, AL
MOV AL, 11H
OUT 20H, AL
MOV AL, 08H
OUT 21H, AL
MOV AL, 04H
OUT 21H, AL
MOV AL, 07H
OUT 21H, AL
MOV AL, 2FH
OUT 21H, AL
STI
MAIN:
MOV CL, INIP
MOV POS, CL
MOV SI, 0
CALL DISPLAY_LEDS
JMP MAIN
DISPLAY_LEDS:
MOV CX, 3
D1: CALL SHOW_DIGIT
ROL POS, 1
CMP POS, 10111111B ; 最右侧(多移动了一位)
JNZ EXI
MOV POS, 11111110B ; 下一个数码位置初始化至最左侧
EXI:
INC SI
LOOP D1
RET
SHOW_DIGIT:
MOV DX, P8255A
MOV AL, POS
OUT DX, AL
MOV DX, P8255B
MOV AL, [BX+SI]
OUT DX, AL
CALL DELAY
RET
MIR7:
ROL INIP, 1
CMP INIP, 10111111B ; 最右侧(多移动了一位)
JNZ EXITI
MOV INIP, 11111110B ; 起始数码(1)位置初始化至最左侧
EXITI:
IRET
DELAY:
PUSH CX
MOV CX,0FFH
LOOP $
POP CX
RET
CODE ENDS
END START