8086汇编程序:多位数码管动态扫描显示2023

实验目的

1.掌握8255A和8086CPU接口方法,掌握8255A的工作方式和编程原理。

2.掌握多位数码管动态扫描显示的工作原理和编程方法。

实验内容

设计8255A 与多位共阴极数码管接口电路,实现在四位LED共阴极数码管上显示数字2023

8255A工作在方式0基本输入输出方式

8255A方式控制字

D7

D6

D5

D4

D3

D2

D1

D0

1

A口方式

A口IO

C口高4位IO

B口方式

B口IO

C口低4位IO

硬件线路连接

在Proteus软件中绘制硬件电路图。8255A片上地址:PA端口地址为70H、PB端口地址72H、PC端口地址为74H、控制端口地址为76H

共阴极数码管段码表

数值

dp

g

f

e

d

c

b

a

0

0

0

1

1

1

1

1

1

3F

1

0

0

0

0

1

1

0

0

06

2

0

1

0

1

1

0

1

1

5B

3

0

1

0

0

1

1

1

1

4F

4

0

1

1

0

0

1

1

0

66

5

0

1

1

0

1

1

0

1

6D

6

0

1

1

1

1

1

0

1

7D

7

0

0

0

0

0

1

1

1

07

8

0

1

1

1

1

1

1

1

7F

9

0

1

1

0

1

1

1

1

6F

A

0

1

1

1

0

1

1

1

77

B

0

1

1

1

1

1

1

1

7F

C

0

0

1

1

1

0

0

1

39

D

0

1

0

1

1

1

1

0

5E

E

0

1

1

1

1

0

0

1

79

F

0

1

1

1

0

0

0

1

71

程序代码 

DATA SEGMENT
;共阴极数码管段码表
	SEGTAB DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH,
	;显示字符  0    1    2    3    4    5    6    7    8    9  
		   DB 77H, 7CH, 39H, 5EH, 79H, 71H, 00H
	;显示字符  A    B    C    D    E    F   空

	OUTBUFF	DB 2,0,2,3	;显示字符             
DATA ENDS

STACK SEGMENT
S DB 100 DUP(0)

TOP EQU $-S
STACK ENDS

;声明端口地址
A_PORT    	EQU	70H
B_PORT    	EQU	72H
C_PORT    	EQU	74H
CRTL_PORT   EQU	76H

CODE SEGMENT
	ASSUME CS:CODE,DS:DATA,SS:STACK
START:
	MOV AX, DATA
	MOV DS, AX
	
	MOV AL, 10000000B	;8255A初始化
	OUT CRTL_PORT, AL	;写入控制字

LOOP1:	
	CALL DISP
	JMP  LOOP1			;无条件循环
	MOV AH, 4CH
	INT 21H  

;显示函数 子程序    
DISP  PROC

AGAIN:	
	MOV  CL, 0FEH		;位选, 第一位显示      
	LEA  SI, OUTBUFF 	;获取被显示字符的偏移地址

LEDDISP:
	MOV  AL, CL	   
	OUT  C_PORT, AL		;C口输出AL的内容,选中第一个数码管

	LEA  BX, SEGTAB		;获取段码表的偏移地址
	MOV  AL, [SI]       ;取出被显示的字符    
	XLAT				;换码[BX+AL]->[AL]   		
	OUT  B_PORT, AL		;换码后, AL内存的内容就是 数组SEGTAB[OUTBUFF]  
	
PUSH CX             ;延时程序
	MOV CX, 100
	Delay: LOOP Delay	
	
POP CX              ;延时结束 要POP CX
	MOV  AL, 0     	    ;清零操作
	OUT  B_PORT, AL   
	
CMP  CL, 0F7H		;比较指令,判断是否循环左移
	JE  NEXT
	INC SI
	ROL CL, 1			;1111 1110 不带进位的循环左移 P106
	
	JMP  LEDDISP

NEXT:RET
DISP ENDP

CODE ENDS
    END START

 
 

运行结果:

暂停仿真效果:

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的6个LED数码管动态显示实验的汇编代码,你可以将其复制到汇编IDE中进行编辑和烧录: ``` .equ F_CPU = 16000000 .equ BAUD = 9600 .equ MYUBRR = F_CPU/16/BAUD-1 .def ledPort = PORTB .def ledDir = DDRB .def digitPort = PORTD .def digitDir = DDRD .cseg .org 0x0000 jmp main .org 0x001C reti .org 0x0032 sbi ledPort, 0 ; 6个数码管共阳极接在PB0~PB5 out digitPort, r24 ; 数字0~5的段码输出到PD0~PD5 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 push r26 push r27 ldi r18, 0x05 ; 从右往左逐个显示数字 ldi r19, 0x00 ; 低位数码管的段码地址 ldi r20, 0x01 ; 高位数码管的段码地址 ldi r21, 0x3F ; 数码管的段码数组 ldi r22, 0x37 ldi r23, 0x06 ldi r24, 0x5B ldi r25, 0x4F ldi r26, 0x66 ldi r27, 0x6D .loop: ldi r20, 0x01 ; 高位数码管的段码地址 ldi r21, 0x3F ; 数码管的段码数组 ldi r22, 0x37 ldi r23, 0x06 ldi r24, 0x5B ldi r25, 0x4F ldi r26, 0x66 ldi r27, 0x6D mov r17, r18 ldi r18, 0x05 sub r18, r17 ; 将数字拆分成6个数字显示 cpi r18, 0x01 brne .num1 ldi r19, 0x00 rjmp .display .num1: cpi r18, 0x02 brne .num2 ldi r19, 0x01 rjmp .display .num2: cpi r18, 0x03 brne .num3 ldi r19, 0x02 rjmp .display .num3: cpi r18, 0x04 brne .num4 ldi r19, 0x03 rjmp .display .num4: cpi r18, 0x05 brne .num5 ldi r19, 0x04 rjmp .display .num5: ldi r19, 0x05 .display: ldi r16, 0x00 out digitDir, r16 ; 数码管的段码地址输出到PD0~PD5 out digitPort, r19 ; 数码管的段码地址输出到PD0~PD5 lsl r18 brcs .digit2 ldi r21, 0x3F rjmp .digit .digit2: ldi r21, 0x06 .digit: out digitDir, r21 ; 数码管的段码输出到PD0~PD6 out digitPort, r22 ; 数码管的段码输出到PD0~PD6 out digitPort, r23 ; 数码管的段码输出到PD0~PD6 out digitPort, r24 ; 数码管的段码输出到PD0~PD6 out digitPort, r25 ; 数码管的段码输出到PD0~PD6 out digitPort, r26 ; 数码管的段码输出到PD0~PD6 out digitPort, r27 ; 数码管的段码输出到PD0~PD6 ldi r16, 0x10 out digitDir, r16 ; 数码管的段码地址输出到PD4~PD7 cpi r18, 0x10 brne .loop pop r27 pop r26 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 reti main: ; 初始化 ldi ledDir, 0x3F ; PB0~PB5输出 ldi digitDir, 0xFF ; PD0~PD7输出 ldi r17, 0x00 ; 数码管关闭状态 out digitPort, r17 ; 数码管关闭 ; 开启定时器0 ldi r16, 0x00 ; 定时器0计数器初始值 out TCNT0, r16 ldi r16, 0x03 ; 定时器0时钟选择为F_CPU/64 out TCCR0B, r16 ; 开启定时器0的比较匹配中断 ldi r16, 0x02 ; 定时器0的比较匹配A中断 sbi TIMSK0, r16 ; 开启全局中断 sei ; 主循环 loop: rjmp loop ; 定时器0的比较匹配A中断服务程序 TIMER0_COMPA_vect: push r16 push r17 in r16, SREG push r16 ; 数码管动态扫描 sbi ledPort, 0 ; 打开低位数码管 cbi ledPort, r18 ; 关闭高位数码管 ldi r16, 0x01 lsl r16, r18 cpi r18, 0x05 breq .delay out TCNT0, r16 ; 设置下一个数码管显示时间 rjmp .exit .delay: ldi r16, 0x7F ; 最后一个数码管显示时间稍长 out TCNT0, r16 ; 切换到下一个数字 inc r18 cpi r18, 0x06 breq .reset rjmp .exit .reset: ldi r18, 0x00 ; 重新从数字0开始显示 .exit: ldi r17, 0x3F ; 数码管关闭状态 out digitPort, r17 ; 数码管关闭 cbi ledPort, 0 ; 关闭数码管显示 pop r16 out SREG, r16 pop r17 pop r16 reti ``` 这个程序会将数字从0到999999在6个数码管上以动态效果显示,每个数字显示的时间为1秒。你可以根据需要调整延时时间和数字的范围。注意,在汇编语言中,需要手动配置定时器和中断等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国无红豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值