实验目的
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
运行结果:
暂停仿真效果: