实验六---8255并行输入输出
![实验六---8255并行输入输出](https://img.360docs.net/img27/14mvc41pxrilevl39w5uo69my7ts83fa-71.webp)
![实验六---8255并行输入输出](https://img.360docs.net/img27/14mvc41pxrilevl39w5uo69my7ts83fa-a2.webp)
实验六---8255并行输入输出
东南大学
《微机实验及课程设计》
实验报告
实验六 8255并行输入输出
姓名:学号:
专业:测控技术与仪器实验室: 516
同组人员:评定成绩:
一、实验目的
1)掌握8255方式0的工作原理及使用方法,利用直接输入输出进行控制显示;
2)掌握8段数码管的动态刷新显示控制;
二、(1)实验内容(必做)
6-1、8段数码管静态显示:编程从键盘输入一位十进制数字(0~9),在数码管上显示出来。
6-2、8段数码管动态显示:在两个数码管上同时显示不同的两位数字或字母,保持不变直至退出。(如56或7f)
(2)实验内容(必做一题,选做一题)
6-3 静态显示:用逻辑电平开关预置某个数字(0~9)的ASCII码,将该数据用8255的C口读入,并用A口输出,并在数码管显示出来;如果预置的ASCII 码不是数字(0~9),数码管显示E字母。
6-4 动态显示:在两个数码管上滚动循环显示不同的0~f字符。(即开始时两个数码管显示01,12,23,34 ··f0,一直循环直至退出)
三、实验原理
(1)实验预备知识
图 八段式LED 数码管的符号和引脚
(2) 6-1流程图:
N
Y
将对应段码输
结
6-1源代码:
data segment
ioport equ 0ec00h-0280h
io8255a equ ioport+288h ;8255A口地址
io8255b equ ioport+28bh ;8255控制寄存器端口地址
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码mesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$';提示data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255b ;使8255的A口为输出方式
mov ax,80h
out dx,al
sss: mov dx,offset mesg1 ;显示提示信息
mov ah,09h
int 21h
mov ah,01 ;从键盘接收字符
int 21h
cmp al,'0' ;是否小于0
jl exit ;若是则退出
cmp al,'9' ;是否大于9
jg exit ;若是则退出
sub al,30h ;将所得字符的ASCII码减30H mov bx,offset led ;bx为数码表的起始地址
xlat ;求出相应的段码
mov dx,io8255a ;从8255的A口输出
out dx,al
jmp sss ;转SSS
exit: mov ah,4ch ;返回DOS
int 21h
code ends
end start
(3)6-2接线图:
6-2源代码:
data segment
ioport equ 0ec00h-0280h
io8255a equ ioport+288h
io8255c equ ioport+28ah
io8255k equ ioport+28bh
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位
bz dw ? ;位码
data ends
stacks segment stack
db 100 dup(?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
start: mov ax,data
mov ds,ax
mov ax,stacks
mov ss,ax
mov dx,io8255k ;将8255设为A口输出
mov al,80h
out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
loop2: mov bh,02
lll: mov al,0 ;送全灭断码
mov dx,io8255a ;自8255A口输出
out dx,al
mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di] ;bl为要显示的数
pop di
mov bh,0
mov si,offset led ;置led数码表偏移地址为SI add si,bx ;求出对应的led数码
mov al,byte ptr [si]
mov dx,io8255a ;自8255A的口输出
out dx,al
mov al,byte ptr bz ;使相应的数码管亮
mov dx,io8255a
out dx,al
mov cx,3000
delay: loop delay ;延时
mov bh,byte ptr bz
shr bh,1
jnz lll
mov dx,0ffh
mov ah,06
int 21h
je loop2 ;有键按下则退出
mov dx,io8255a
mov al,0 ;关掉数码管显示
out dx,al
mov ah,4ch ;返回
int 21h code ends end start
(4)6-3流程图: Y N N Y
6-3源代码: data segment
ioport equ 0ec00h-0280h ;tpc 卡中设备的io 地址 io8255a equ ioport+288h ;8255A 口地址
io8255k equ ioport+28bh ;8255控制寄存器端口地址 io8255c equ ioport+28ah ;8255C 口地址
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
开
设置8255控制字,C
从C 口输
是否属
将对应段码
将E 对应段
是否有
结
data ends
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ss:stacks,ds:data
main proc far
start: mov ax,stacks
mov ss,ax
mov ax,data
mov ds,ax
mov dx,io8255k ;设8255为C口输入,A口输出 mov al,8bh ;1000 1011
out dx,al
inout: mov dx,io8255c ;从C口输入一数据
call delay
in al,dx
cmp al,'0' ;是否小于0
jl exit1 ;若是则显示E
cmp al,'9' ;是否大于9
jg exit1 ;若是则显示E
mov bx,offset led ;bx为数码表的起始地址 sub al,30h
xlat ;求出相应的段码
mov dx,io8255a ;从8255的A口输出
out dx,al
mov ah,06 ;是否有键输入
mov dl,0ffh
int 21h ;是则退出
jne exit
jmp inout ;转inout
exit1: mov al,79h
mov dx,io8255a
out dx,al
mov ah,06 ;是否有键输入
mov dl,0ffh
int 21h ;是则退出
jne exit
jmp inout ;转inout
exit: mov ah,4ch ;返回DOS
int 21h
main endp
delay proc near ;延时子程序
mov bx,2000
ZZZ: mov cx,0
ZZ: loop ZZ
dec bx
jne ZZZ
ret
delay endp
code ends
end start
6-3接线图:
四、实验中遇到的问题及解决方案
(1)在实验初始,发现七段数码管的a不亮,排除故障发现是由于8255芯片的PA0不能输出高电平;
(2)在各个实验中,连线后发现数码管都没有反应,后来发现,只有在每次运行前运行一下演示实验,再运行自己的程序才出正确结果;
(3)在实验6-3中,初始时,数码管显示的数字是开关预置的数字,即若开关置为0000,0001,则数码管显示1,但是实验要求为预置的为ASCⅡ码;
检查代码,发现若直接用从C口输入的数据,则就是数值,达到实验要求还需对从C口输入的数据进行减30h的操作;
(4)上次实验总未完成部分(在in操作指令前未加延时程序)在这次的课时上实现,上次的实验结果是,若开关预置全1,则屏幕一直显示提示信息;
若开关预置非全1,则开始会显示提示信息,片刻后不再提示,说明若不加延时,用in指令输入的会是0ffh,但片刻后,开关预置的数据会输入,程序不再提示;遗憾部分是,用到的延时程序是借用之前实验中的,没
有改变CX数据以观察需加延时的最短时间;