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

一 实验目的
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.

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值