数码管实验

目的与任务
1、理解可编程并行接口8255的基本工作原理;
2、熟悉8255的初始化编程方法;
3、掌握8255方式0的工作原理及使用。
基本原理
数码管由8255端口B和端口C联合控制,端口负责控制某个数码管中的那些段码的显示和小数点的显示(PB7)。端口C的PC4,PC5,PC6发送的信号通过译码后,负责选择6个数码管中的1个显示,即某时刻只有1个数码显示,如果要让几个同时显示,则采用来回扫描显示的方法,且当某个数码管显示时,必须要有一定的延时,约在100ms左右,太短显示不明显(发光不够),太长会产生闪烁。

数码管显示的数字与8255A端口B的输出的对应关系:

显示数字0123456789
B口输出3FH06H5BH4FH66H6DH7DH07H7FH6FH

在这里插入图片描述
内容
先搞懂38译码器的原理就好。

PC6PC5PC4101100011010001000
数码管选择Y5Y4Y3Y2Y1Y0

1、编写程序,在1个数码管上显示某个数字如‘6’等;

code segment
assume cs:code
BEG:
mov dx,303H
mov al,10000000B
out dx,al

mov dx,302h
mov al,00010000B	;C口译码到Y1
out dx,al

mov dx,301H
mov al,06H  ;B口输出显示1
out dx,al 

mov ah,4CH
int 21H
CODE ENDS
END BEG

在这里插入图片描述

2、编写程序,在一个数码管上显示连续变化的数字,从0变化到9;

1.快速版
code segment
assume cs:code
BEG:mov dx,303H	
mov al,10000000B 
out dx,al
mov dx,302h
mov al,01010000B
out dx,al
aa:mov dx,301H	
mov al,3FH
call def
mov al,06H
call def
mov al,5BH
call def
mov al,4FH
call def
mov al,66H
call def
mov al,6DH
call def
mov al,7DH
call def
mov al,07H
call def
mov al,7FH
call def
mov al,6FH
call def
JMP aa
def proc 
mov si,0000FH
p2:mov di,8000H
p1:dec di
jnz p1
dec si
jnz p2
ret
def  endp
mov ah,4CH
int 21H
CODE ENDS
END BEG


2.解释一下下:
code segment
assume cs:code
BEG:
mov dx,303H	;初始化
mov al,10000000B ;80H
out dx,al

mov dx,302h
mov al,01010000B	;C口译码到Y5
out dx,al

mov dx,301H		;B口输出0123456789
mov al,3FH
out dx,al
CALL DELAY


mov dx,301H
mov al,06H
out dx,al
CALL DELAY

mov dx,301H
mov al,5BH
out dx,al
CALL DELAY

mov dx,301H
mov al,4FH
out dx,al
CALL DELAY

mov dx,301H
mov al,66H
out dx,al
CALL DELAY

mov dx,301H
mov al,6DH
out dx,al
CALL DELAY

mov dx,301H
mov al,7DH
out dx,al
CALL DELAY

mov dx,301H
mov al,07H
out dx,al
CALL DELAY

mov dx,301H
mov al,7FH
out dx,al
CALL DELAY

mov dx,301H
mov al,6FH
out dx,al
CALL DELAY

JMP BEG

DELAY  proc near          ; 循环延时子程序
      push cx
      push bx
      mov cx,100
  d1: mov bx,8000
  d2: dec bx
      jnz d2		;bx不等于0则继续循环
      loop d1		;循环cx次
      pop bx
      pop cx
      ret
DELAY  endp

mov ah,4CH
int 21H
CODE ENDS
END BEG

在这里插入图片描述

3、编写程序,利用6个数码管显示123456数字.

code segment
assume cs:code
BEG:
mov dx,303H	;初始化
mov al,10000000B ;80H
out dx,al

a1:
mov dx,302h
mov al,01010000B	;C口译码到Y5
out dx,al
mov dx,301H		
mov al,06H
out dx,al
CALL DELAY
jmp a2

a2:
mov dx,302h
mov al,01000000B	;C口译码到Y4
out dx,al
mov dx,301H		
mov al,5BH
out dx,al
CALL DELAY
jmp a3

a3:
mov dx,302h
mov al,00110000B	;C口译码到Y3
out dx,al
mov dx,301H		
mov al,4FH
out dx,al
CALL DELAY
jmp a4

a4:
mov dx,302h
mov al,00100000B	;C口译码到Y2
out dx,al
mov dx,301H		
mov al,66H
out dx,al
CALL DELAY
jmp a5

a5:
mov dx,302h
mov al,00010000B	;C口译码到Y1
out dx,al
mov dx,301H		
mov al,6DH
out dx,al
CALL DELAY
jmp a6

a6:
mov dx,302h
mov al,00000000B	;C口译码到Y0
out dx,al
mov dx,301H		
mov al,7DH
out dx,al
CALL DELAY
jmp a1

DELAY  proc         ; 循环延时子程序
	MOV SI,0000FH
	P2:MOV DI,8000H
	P1:DEC DI
	JNZ P1
	DEC SI
	JNZ P2
    RET
DELAY  endp

mov ah,4CH
int 21H
CODE ENDS
END BEG

在这里插入图片描述

可编程并行接口8255的地址分配:
A300H 
B301H
C302H
控制寄存器端口	     303H

J5与数码管扩展板连接。

在这里插入图片描述
8255四个端口
404H ~ 407H

Data  segment
PortA equ 404H    ;8255的PA口地址
   xz db 88h,83h,0c6h,0a1h    ;定义a~d的显示代码
s     db "Display a b c d at the same time. Press any key to exit...",0dh,0ah,"$"    ;程序功能提示
Data  ends
Code  segment
      assume cs:code,ds:data
Start:mov ax,data 
      mov ds,ax 
      mov dx,offset s    ;显示提示
      mov ah,9
      int 21h
      mov dx, PortA+3
      mov al,80H 
      out dx,al         ;PA、PB口初始化为基本输出方式
L0:   lea si,xz
      mov ah,08h        ;置位选初值,从左边开始显示
L1:   push ax
      mov al,[si]       ;显示数字
      mov dx,PortA
      out dx,al
      mov al,ah
      mov dx,PortA+1
      out dx,al
      call de;         延时
      mov ah,0bh
      int 21h ;        检测有无按键,返回AL=0FFh(有按键)0(无按键)
      cmp al,0FFh
      jz Exit
      inc si;        准备显示下一数字
      pop ax
      shr ah,1;        选择下一数码管
      cmp ah,0;   判断是否显示完"d"
      jnz l1
      jmp l0
 Exit:mov ah,4ch          ; 结束程序
      int 21h
   de  proc near          ; 循环延时子程序
      push cx
      push bx
      mov cx,100
  d1: mov bx,8000
  d2: dec bx
      jnz d2		;bx不等于0则继续循环
      loop d1		;循环cx次
      pop bx
      pop cx
      ret
  de  endp
Code  ends
      end Start



再来一个一样的
在这里插入图片描述

Data  segment
PortA equ 404H ; 8255的PA口地址
   xz db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;定义0~9的显示代码,这里共阳极,我们一般用共阴极
s   db "Display 0~9 . Press any key to exit ...",0dh,0ah,"$"    ;程序功能提示
Data  ends

Code  segment
      assume cs:code,ds:data
Start:mov ax,data 
      mov ds,ax 
      
      mov dx,offset s    ;显示提示
      mov ah,9
      int 21h

      mov dx, PortA+3	;控制口407H
      mov al,80H 
      out dx,al         ;PA、PB口初始化为基本输出方式
      
   L0:lea si,xz
   
   L1:mov al,[si]       ;显示数字
      mov ah,0fh        ;置位选初值,四个数码管同时显示 ah=0000 0000b
      mov dx,PortA
      out dx,al
      
      mov al,ah
      mov dx,PortA+1	;B口输出al=0000 0000b
      out dx,al
      
      call de           ;延时
      
      mov ah,0bh		;0bh字符功能调用检测输入状态
      int 21h   	 ; 检测有无按键,返回AL=0FFh(有按键)0(无按键)
      cmp al,0FFh	
      jz Exit
      
      inc si             ;准备显示下一数字
      
      cmp si,10         ;判断是否显示完 "F"
      jnz L1			;没到F则继续循环,否则重新开始
      jmp L0
      
 Exit:mov ah,4ch         ; 结束程序
      int 21h
      
  de  proc near          ; 循环延时子程序
      push cx
      push bx
      mov cx,100
  d1: mov bx,8000
  d2: dec bx
      jnz d2		;bx不等于0则继续循环
      loop d1		;循环cx次
      pop bx
      pop cx
      ret
  de  endp
  
Code  ends
      end Start








最后送你666
在这里插入图片描述

Data  segment
      PortA equ 404H ; 8255的PA口地址
s      db "Display 6 circularly from right to left. Press any key to exit...",0dh,0ah,"$"    ;程序功能提示
Data  ends

Code  segment
      assume cs:code,ds:data
Start:mov ax,data 
      mov ds,ax 
      
      mov dx,offset s    ;显示提示
      mov ah,9
      int 21h
      
      mov dx, PortA+3	;控制口407h
      mov al,80H 
      out dx,al;       PA、PB口初始化为基本输出方式
      
      mov ah,11h	;置位选初值,右边数码管先显示
      
      mov al,82h	;显示数字"6"(因加反向器,PA0~PA6要取反) 82h=1000 0010b
      mov dx,PortA		;A口输出段码6
      out dx,al
      
  L0: mov al,ah        ;把ah=0001 0001b送入al,得ax=0001 0001 0001 0001b,压入堆栈
      push ax
      
      mov dx,PortA+1	;b口输出al=0001 0001b
      out dx,al
      
      call de;         延时
      
   LA:mov ah,0bh		;0bh字符功能调用检测输入状态
      int 21h         ;   检测有无按键,返回AL=0FFh(有按键)0(无按键)
      cmp al,0FFh
      jz Exit			;有按键则退出,实现任意键退出
      
      pop ax			;从堆栈中弹出ax=0001 0001 0001 0001b
      rol ah,1			; 选择下一数码管  循环左移一位ah=0010 0010b
      jmp L0
      
 Exit:mov ah,4ch          ; 结束程序
      int 21h
      
  de  proc near        ; 循环延时子程序
      push cx
      push bx
      mov cx,7fH
  d1: mov bx,6000
  d2: dec bx
      jnz d2
      loop d1
      pop bx
      pop cx
      ret
  de  endp
  
Code  ends
      end Start





  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值