实验六---8255并行输入输出

实验六---8255并行输入输出
实验六---8255并行输入输出

实验六---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数据以观察需加延时的最短时间;

相关主题
相关文档
最新文档