惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
罗磊的独立博客
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
Jina AI
Jina AI
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
C
Check Point Blog
GbyAI
GbyAI

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog
[微机实验/TD-PITE] 数码管显示实验 | Yesterday17's Blog
Yesterday17 · 2020-11-16 · via Yesterday17's Blog

ToC

  • 实验内容
  • 实验接线
  • 代码
    • 数字滚动
    • 持久显示
  • 实验效果
  • 选做实验
    • 选做实验 1-2
      • 说明
      • 实现
    • 选做实验 3
      • 说明
      • 实现
      • 效果
    • 选做实验 4
      • 说明
      • 实现

实验内容

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

  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