汇编语言实现七段数码管显示控制实验

一 实验目的
1)掌握8255方式0的工作原理、初始化设置方法。
2)掌握I/O接口地址译码电路的工作原理及端口地址的计算方法。
3)掌握I/O端口的读写操作及编程方法。
4)掌握数码管显示数字的原理、数码管显示段控及位控的概念及编程方法。
5)掌握微机接口集成开发环境HQFC软件的使用方法。

二 实验原理图
在这里插入图片描述
在这里插入图片描述
三 代码实现

;参考代码
;七段数码管显示,8255控制寄存器端口地址28BH A口地址288H,C口地址28AH
;**************************************
;*           LED数码管实验            *
;*       动态循环显示“00-99*
;**************************************
data  segment
io8255c        equ 28ah     ;C口地址
io8255cs        equ 28bh    ;控制寄存器端口地址
io8255a        equ 288h     ;A口地址
led  db  3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;在数据段中存放09的字形码: 段码
buffer1   db   0, 0           ;存放要显示的个位和十位
bz       dw   ?             ;位码
data ends

code  segment
    assume cs:code,ds:data
start:    mov ax,data
    mov ds,ax
    mov dx,io8255cs            ;8255设为A口输出
    mov al,80h                ;A口0方式输出
    out dx,al
    mov di,offset buffer1      ;设di为显示缓冲区
;loop1:    mov cx,0300h               ;循环次数
loop1:    mov cx,030h               ;循环次数,延时

loop2:    mov bh,02         ;送位码02到bh
lll:    mov byte ptr bz,bh      ;按字节把位码送到bz中
    push di                 ;di进栈
    dec di                  ;di自减1,指向下一位数字的地址
    add di, bz               ;所要显示的数传给di
    mov bl,[di]                  ;bl为要显示的数
    pop di                      ;di出栈
    mov bh,0                   ;bh清零
    mov si,offset led            ;置led数码表偏移地址为SI
    add si,bx                    ;求出对应的led数码
    mov al,byte ptr [si]            ;把输出的数的地址传给al
    mov dx,io8255a               ;8255A的A口输出
    out dx,al
    mov al,byte ptr bz             ;位码选择相应的数码管亮
    mov dx,io8255c               ;8255设为C口输出
    out dx,al
    push cx                     ;cx进栈
        mov cx,100                 ;100传给CX
delay:    loop delay                  ;延时
    pop cx                       ;CX出栈
    mov al,00h                   ;al清零
    out dx,al
    
    mov bh,byte ptr bz             ;按位码送到bh中
    shr bh,1                      ;右移一位,显示十位的数码管数据
    jnz lll                        ;跳到lll显示
    loop loop2                  ;循环显示另一位
    mov  ax,word ptr [di]         ;把最后一个字传给ax
    cmp  ah,09                 ;将该字的高位与9比较
    jnz  set                    ;不等则跳转到set
    cmp  al,09                 ;将该字的低位与9比较
    jnz  set                    ;不等则跳转到set
    mov  ax,0000               ;ax置零
    mov  [di],al                 ;al为个位
    mov  [di+1],ah              ;ah为十位
    jmp  loop1
set:    mov  ah,01             ;1号功能调用,键盘键入
    int  16h
    jne  exit                   ;有键按下则转exit
    mov  ax,word ptr [di]        ;没有键入就把个位字传给ax
    inc  al                    ;al自增1 
    aaa                        ;将ax拆分,分为个位与十位,BCD码十进制调整
    mov [di],al                  ;al为个位
    mov [di+1],ah               ;ah中为十位
    jmp loop1                  ;循环loop1,继续循环显示
exit:    mov dx,io8255c          ;C口位选地址
    mov al,0                    ;关掉数码管显示
    out dx,al
    mov ah,4ch                  ;返回
    int 21h
code ends
end start

该程序是先设置好输出方式,输入一个数是数码管亮起来,然后设置好延时,在把显示的数据从00开始,送段码到A口,送位码到C口,将显示数据与9比较,拆分所需要显示的数的十位与个位,在相应的位上显示出来,通过移位,依次显示数字,最后循环显示00-99,直到键盘有输入停止返回,程序结束。

如:显示89,90,99的过程:首先,di调整到十位数8传给bl, di自减1,再加bz,依然指向十位数,置led数码表偏移地址为SI,SI与bl相加得到对应8的字形码偏移地址,把该地址传给al,然后A口输出,然后位码bz=02在C口输出到S1,S0,选择十位数码管S1显示8,延时,把位码01传给bh,bh右移一位成01,跳到lll。位码bh=01H传给bz,di自减等调整到个位数9,置led数码表偏移地址为SI,SI与bl相加得到对应9的字形码偏移地址,把该地址传给al,然后A口输出,然后位码bz=01H在C口输出到S1,S0,选择个位数码管S0显示9,延时,完成89的显示,十位个位与9比较,不是99,跳到set,判断有误按键按下,没有就把个位数传个ax,个位加1,此时,9+1=10,al=a,经aaa调整,al=0(个位),ah=9(十位),再把个位al传给[di],十位ah传给[di+1],回到loop1,延时,然后同上述过程显示十位数9,在显示个位数0,即90;同上述过程显示完99后,判断十位数,个位数是否为9,结果都是,然后ax置00,然后把个位,十位都置0,循环loop1,继续从00开始显示,没有按键按下,一直循环00-99.

四 流程图
在这里插入图片描述

  • 9
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来为你解答。首先,需要了解一下七段数码管的原理和控制方式,这里简单介绍一下: 七段数码管是由七个发光二极管组成,分别代表数字的不同部分,如下图所示: A --- F | | B | G | --- E | | C | | --- .DP D 其,A~G 分别代表七个发光二极管,.DP 代表小数点,每个二极管通过控制对应的引脚可以实现亮灭。 控制七段数码管的方法一般是通过多路复用器实现,即通过控制不同引脚的高低电平来选不同的数码管,再通过控制对应引脚的高低电平来实现数字的显示。 在汇编语言,可以通过向对应的端口写入数据来控制数码管的显示。根据七段数码管的原理,我们可以将要显示的数字转换为对应的七个二进制码,再通过控制对应的引脚来实现显示。 下面是汇编代码实现七段数码管不断显示 6789AB 的过程: ```assembly ; 定义端口地址,具体地址根据硬件设计而定 PORT equ 0x80 ; 定义数字对应的七段码表 CODE_TABLE db 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 ; 主程序入口 main: mov cx, 6 ; 设置循环次数,显示 6 个数字 mov si, offset CODE_TABLE + 6 ; 设置起始位置为 6,即显示数字 6 loop: mov al, [si] ; 从码表取出对应的七段码 out PORT, al ; 将七段码输出到端口,控制数码管显示 inc si ; 指向下一个数字的七段码 cmp si, offset CODE_TABLE + 12 ; 判断是否显示完 6 个数字 jne loop ; 如果没有,继续循环 mov si, offset CODE_TABLE + 1 ; 设置起始位置为 1,即显示数字 7 jmp loop ; 无限循环,不断显示 6789AB ``` 以上代码,通过 mov 指令将数字的七段码存储到 al 寄存器,再通过 out 指令将 al 寄存器的数据输出到端口,从而控制数码管显示。循环显示 6789AB 的过程,每次循环先显示 6 个数字,再从数字 7 开始循环显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值