实验八 数码管显示实验


实验八 数码管显示实验

1. 实验内容

基础部分

  • 用一片 8255 接口芯片的 A 口和 B 口分别连接数码管段码接口(ABCDEFG、Dp)和位码接口(X1~X6)。编写程序实现以下两种显示方式:
  1. 使六位数码管从右到左逐位显示移动的数字 0 到 9,即数字 0 从最右端移动到最左端,数字 1 从最右端移动到最左端,….,数字 9 从最右端移动到最左端,循环上述过程;

  2. 使六位数码管从左到右稳定显示数字“123456”。

扩展部分

  1. 编写数码管显示子程序,可实现 1 个或多个数码管的稳定显示,使用入口参数定义拟显示的位置和显示的内容。使用该子程序,重新完成基础实验 1 和 2。
  2. 在数码管上显示学号后六位,并使用 6 个开关控制对应数码管的亮灭(例如,开关为 1 点亮,为 0 熄灭)。
  3. 在左侧的三个数码管上显示“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

文章作者: Mathison2020
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mathison2020 !
  目录