目的与任务
1、理解可编程并行接口8255的基本工作原理;
2、熟悉8255的初始化编程方法;
3、掌握8255方式0的工作原理及使用。
基本原理
数码管由8255端口B和端口C联合控制,端口负责控制某个数码管中的那些段码的显示和小数点的显示(PB7)。端口C的PC4,PC5,PC6发送的信号通过译码后,负责选择6个数码管中的1个显示,即某时刻只有1个数码显示,如果要让几个同时显示,则采用来回扫描显示的方法,且当某个数码管显示时,必须要有一定的延时,约在100ms左右,太短显示不明显(发光不够),太长会产生闪烁。
数码管显示的数字与8255A端口B的输出的对应关系:
显示数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
B口输出 | 3FH | 06H | 5BH | 4FH | 66H | 6DH | 7DH | 07H | 7FH | 6FH |
内容
先搞懂38译码器的原理就好。
PC6PC5PC4 | 101 | 100 | 011 | 010 | 001 | 000 |
---|---|---|---|---|---|---|
数码管选择 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 |
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的地址分配:
A口 300H
B口 301H
C口 302H
控制寄存器端口 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