ToC

实验内容

使七段共阴极数码管显示如下内容:

  1. 从右到左逐位显示移动的数字 0~9。即一开始是 0 从右到左移动,然后是 1,然后是 2,以此类推。最后在 9 移动完后返回 0,继续循环。
  2. 使六位数码管从左到右显示稳定的数字 123456

实验接线

照着书上连就可以了。在这个实验中,PC 甚至可以不连(笑)

代码

数字滚动

A8255 EQU 0600H

B8255 EQU 0602H

C8255 EQU 0604H

CON8255 EQU 0606H

SSEG SEGMENT STACK

DW 0, 0, 0, 0

SSEG ENDS

DATA SEGMENT

TBL:

DB 3FH ;; 0

DB 06H ;; 1

DB 5BH ;; 2

DB 4FH ;; 3

DB 66H ;; 4

DB 6DH ;; 5

DB 7DH ;; 6

DB 07H ;; 7

DB 7FH ;; 8

DB 6FH ;; 9

SEQ:

DB 00011111B ;; POS 0

DB 00101111B ;; POS 1

DB 00110111B ;; POS 2

DB 00111011B ;; POS 3

DB 00111101B ;; POS 4

DB 00111110B ;; POS 5

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:SSEG

START PROC

MOV AX, DATA

MOV DS, AX

MOV AL, 10001001B ;; A B OUT, C IN

MOV DX, CON8255

OUT DX, AL

MOV AX, 0000H

LO:

CALL PUT

CALL DELAY

INC AL

CMP AL, 6

JNE LO

MOV AL, 0

INC AH

CMP AH, 10

JNE LO

MOV AH, 0

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

;; NUM: AH

;; POS: AL

PUT PROC

PUSH AX

;; SELECT POS

LEA BX, SEQ

PUSH AX

MOV AH, 0

MOV SI, AX

;; OUTPUT POS

MOV DX, A8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

;; SELECT NUM

LEA BX, TBL

MOV AL, AH

MOV AH, 0

MOV SI, AX

;; OUTPUT DATA

MOV DX, B8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

RET

PUT ENDP

DELAY PROC

MOV CX, 0FFFFH

LOOP $

MOV CX, 0FFFFH

LOOP $

RET

DELAY ENDP

CODE ENDS

END START

持久显示

A8255 EQU 0600H

B8255 EQU 0602H

C8255 EQU 0604H

CON8255 EQU 0606H

SSEG SEGMENT STACK

DW 0, 0, 0, 0

SSEG ENDS

DATA SEGMENT

TBL:

DB 3FH ;; 0

DB 06H ;; 1

DB 5BH ;; 2

DB 4FH ;; 3

DB 66H ;; 4

DB 6DH ;; 5

DB 7DH ;; 6

DB 07H ;; 7

DB 7FH ;; 8

DB 6FH ;; 9

SEQ:

DB 00011111B ;; POS 0

DB 00101111B ;; POS 1

DB 00110111B ;; POS 2

DB 00111011B ;; POS 3

DB 00111101B ;; POS 4

DB 00111110B ;; POS 5

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:SSEG

START PROC

MOV AX, DATA

MOV DS, AX

MOV AL, 10001001B ;; A B OUT, C IN

MOV DX, CON8255

OUT DX, AL

MOV AX, 0000H

LO:

MOV AX, 0105H

CALL PUT

CALL DELAY

MOV AX, 0204H

CALL PUT

CALL DELAY

MOV AX, 0303H

CALL PUT

CALL DELAY

MOV AX, 0402H

CALL PUT

CALL DELAY

MOV AX, 0501H

CALL PUT

CALL DELAY

MOV AX, 0600H

CALL PUT

CALL DELAY

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

;; NUM: AH

;; POS: AL

PUT PROC

PUSH AX

;; SELECT POS

LEA BX, SEQ

PUSH AX

MOV AH, 0

MOV SI, AX

;; OUTPUT POS

MOV DX, A8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

;; SELECT NUM

LEA BX, TBL

MOV AL, AH

MOV AH, 0

MOV SI, AX

;; OUTPUT DATA

MOV DX, B8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

RET

PUT ENDP

DELAY PROC

MOV CX, 0FFH

LOOP $

RET

DELAY ENDP

CODE ENDS

END START

实验效果

这里就只展示数字滚动的效果好了(

选做实验

选做实验 1-2

说明

编写显示子程序,实现一个或多个数码管的稳定显示。使用入口参数定义拟显示的位置和显示的内容。

利用(1)实现的子程序,重新完成基本实验 1)和 2)。

实现

这部分其实在上面的实验里已经实现了,就是这个 PUT 函数。它可以将 AH 的数字显示在 AL 的位置上。

;; NUM: AH

;; POS: AL

PUT PROC

PUSH AX

;; SELECT POS

LEA BX, SEQ

PUSH AX

MOV AH, 0

MOV SI, AX

;; OUTPUT POS

MOV DX, A8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

;; SELECT NUM

LEA BX, TBL

MOV AL, AH

MOV AH, 0

MOV SI, AX

;; OUTPUT DATA

MOV DX, B8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

RET

PUT ENDP

选做实验 3

说明

在数码管上显示学号后 6 位,并使用 6 个开关控制对应数码管的亮灭。

实现

通过开关控制就可以了,只需要多连一个 8255 即可。

A8255 EQU 0600H

B8255 EQU 0602H

C8255 EQU 0604H

CON8255 EQU 0606H

SSEG SEGMENT STACK

DW 0, 0, 0, 0

SSEG ENDS

DATA SEGMENT

TBL:

DB 3FH ;; 0

DB 06H ;; 1

DB 5BH ;; 2

DB 4FH ;; 3

DB 66H ;; 4

DB 6DH ;; 5

DB 7DH ;; 6

DB 07H ;; 7

DB 7FH ;; 8

DB 6FH ;; 9

SEQ:

DB 00011111B ;; POS 0

DB 00101111B ;; POS 1

DB 00110111B ;; POS 2

DB 00111011B ;; POS 3

DB 00111101B ;; POS 4

DB 00111110B ;; POS 5

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:SSEG

START PROC

MOV AX, DATA

MOV DS, AX

MOV AL, 10001001B ;; A B OUT, C IN

MOV DX, CON8255

OUT DX, AL

MOV AX, 0000H

;; DISPLAY 181117

LO:

MOV AX, 0105H

CALL PUT_COND

MOV AX, 0804H

CALL PUT_COND

MOV AX, 0103H

CALL PUT_COND

MOV AX, 0102H

CALL PUT_COND

MOV AX, 0101H

CALL PUT_COND

MOV AX, 0700H

CALL PUT_COND

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

;; NUM: AH

;; POS: AL

PUT_COND PROC

PUSH AX

MOV BX, 1

MOV CL, AL

SHL BL, CL

MOV DX, C8255

IN AL, DX

TEST BL, AL

JZ PUT_EXIT

POP AX

PUSH AX

CALL PUT

CALL DELAY

PUT_EXIT:

POP AX

RET

PUT_COND ENDP

;; NUM: AH

;; POS: AL

PUT PROC

PUSH AX

;; SELECT POS

LEA BX, SEQ

PUSH AX

MOV AH, 0

MOV SI, AX

;; OUTPUT POS

MOV DX, A8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

;; SELECT NUM

LEA BX, TBL

MOV AL, AH

MOV AH, 0

MOV SI, AX

;; OUTPUT DATA

MOV DX, B8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

RET

PUT ENDP

DELAY PROC

MOV CX, 0FFH

LOOP $

RET

DELAY ENDP

CODE ENDS

END START

效果

注意左下角的开关(

选做实验 4

说明

在左侧的三个数码管上显示 123,每隔 1 秒钟向右移动一位(循环)。

实现

这里用到的是 8254 延时,不过实验的时候 8254 好像出了什么状况不大行。因此以下代码仅供参考。

A8255 EQU 0600H

B8255 EQU 0602H

C8255 EQU 0604H

CON8255 EQU 0606H

C008254 EQU 0640H

C018254 EQU 0642H

C028254 EQU 0644H

CON8254 EQU 0646H

SSEG SEGMENT STACK

DW 0, 0, 0, 0

SSEG ENDS

DATA SEGMENT

TBL:

DB 3FH ;; 0

DB 06H ;; 1

DB 5BH ;; 2

DB 4FH ;; 3

DB 66H ;; 4

DB 6DH ;; 5

DB 7DH ;; 6

DB 07H ;; 7

DB 7FH ;; 8

DB 6FH ;; 9

SEQ:

DB 00011111B ;; POS 0

DB 00101111B ;; POS 1

DB 00110111B ;; POS 2

DB 00111011B ;; POS 3

DB 00111101B ;; POS 4

DB 00111110B ;; POS 5

POS DB 05

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:SSEG

START PROC

;; INIT 8255

MOV AL, 10001001B

MOV DX, CON8255

OUT DX, AL

;; MIR6

MOV AX, OFFSET MIR6

MOV SI, 38H

MOV [SI], AX

MOV AX, CS

MOV SI, 3AH

MOV [SI], AX

MOV AX, DATA

MOV DS, AX

;; INIT 8259

CLI

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

;; INIT 8254

MOV DX, CON8254

MOV AL, 00110110B

OUT DX, AL

MOV DX, C008254

MOV AL, 00H

OUT DX, AL

MOV AL, 48H

OUT DX, AL

MOV AX, 0000H

LO:

MOV AH, 01H

MOV AL, POS

CALL PUT_PRE

CALL PUT

CALL DELAY

INC AH

DEC AL

CALL PUT_PRE

CALL PUT

CALL DELAY

INC AH

DEC AL

CALL PUT_PRE

CALL PUT

CALL DELAY

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

MIR6:

DEC AX

DEC POS

CMP POS, 0

JGE MIR6_END

ADD POS, 6

MIR6_END:

IRET

PUT_PRE PROC

CMP AH, 0

JGE SKIP_AH

ADD AH, 10

SKIP_AH:

CMP AL, 0

JGE FIN_PRE

ADD AL, 6

FIN_PRE:

RET

PUT_PRE ENDP

;; NUM: AH

;; POS: AL

PUT PROC

PUSH AX

;; SELECT POS

LEA BX, SEQ

PUSH AX

MOV AH, 0

MOV SI, AX

;; OUTPUT POS

MOV DX, A8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

;; SELECT NUM

LEA BX, TBL

MOV AL, AH

MOV AH, 0

MOV SI, AX

;; OUTPUT DATA

MOV DX, B8255

MOV AL, [BX+SI]

OUT DX, AL

POP AX

RET

PUT ENDP

DELAY PROC

MOV CX, 0FFH

LOOP $

RET

DELAY ENDP

DELAY_LONG PROC

MOV CX, 0FFFFH

LOOP $

MOV CX, 0FFFFH

LOOP $

MOV CX, 0FFFFH

LOOP $

MOV CX, 0FFFFH

LOOP $

RET

DELAY_LONG ENDP

CODE ENDS

END START