实验六8255并行输入输出.docx
《实验六8255并行输入输出.docx》由会员分享,可在线阅读,更多相关《实验六8255并行输入输出.docx(10页珍藏版)》请在冰豆网上搜索。
实验六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口输出,并在数码管显示出来;如果预置的ASCI码不是数字(0~9),数码管显示E字母。
6-4动态显示:
在两个数码管上滚动循环显示不同的0〜f字符。
(即开始时两
个数码管显示01,12,23,34…f0,—直循环直至退出)
三、实验原理
(1)实验预备知识
dp
o-;;b
cdt*fgF
图八段式LED数码管的符号和引脚
寧型
共阳极诧码
共阴极代码
字型
共阳檢代码
共阴概牡码
0
COH
3FH
$
90H
CFH
1
F9H
06H
A
仙
77H
2
A4H
5BH
b
翻H
7CH
3
BOH
4FH
C
C6H
39H
&
99H
S6H
d
A1H
5EH
5
92H
SDIi
E
伽
75H
6
82H
7DH
¥
阳H
71H
7
F8II
D7H
灭
FFH
8
80H
7FH
(2)6-1流程图:
r
设置8255控制字
Y
将对应段码输
6-1源代码:
datasegment
ioport
equ0ec00h-0280h
io8255a
equioport+288h;8255A口地址
io8255b
equioport+28bh;8255控制寄存器端口地址
leddb
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;
段码
mesg1dbdataends
0dh,0ah,'Inputanum(0--9h):
',0dh,0ah,'$';
提示
codesegment
movds,ax
movdx,io8255b
使8255的A口为输出方式
assumecs:
code,ds:
datastart:
movax,data
movax,80h
outdx,al
sss:
movdx,offsetmesgl;
movah,09h
int21h
movah,01;
int21h
cmpal,'0';
jlexit;
cmpal,9;
jgexit;
subal,30h;
movbx,offsetled;bx
xlat;
movdx,io8255a;
outdx,al
jmpsss;
exit:
movah,4ch;
int21h
codeends
endstart
(3)6-2接线图:
显示提示信息
从键盘接收字符
是否小于0若是则退出
是否大于9若是则退出
将所得字符的ASCII码减30H
为数码表的起始地址
求出相应的段码
从8255的A口输出
转SSS
返回DOS
dr
7
3
0
■I
■I
a
d
d
IX
CL
Q
d
cs
PC0
PCI
LED2
388h^28Fhi
equ0ec00h-0280h
equioport+288h
equioport+28ah
equioport+28bh
6-2源代码:
datasegmentioportio8255aio8255cio8255k
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db5,6;存放要显示的个位和十位
位码
bzdw?
;
dataendsstackssegmentstackdb100dup⑺stacksendscodesegment
assumecs:
code,ds:
data,ss:
stacksstart:
movax,data
movds,ax
movax,stacks
movss,ax
movdx,io8255k;
moval,80houtdx,almovdi,offsetbuffer1;
loop2:
movbh,02
lll:
moval,0;
movdx,io8255a;
outdx,al
movbyteptrbz,bh
pushdidecdiadddi,bzmovbl,[di];bl
popdi
movbh,0
movsi,offsetled;
addsi,bx;
moval,byteptr[si]
movdx,io8255a;
outdx,al
moval,byteptrbz;
movdx,io8255a
outdx,almovcx,3000delay:
loopdelay;
movbh,byteptrbz
shrbh,1
jnzlll
movdx,0ffh
movah,06
int21h
jeloop2;
将8255设为A口输出
设di为显示缓冲区
送全灭断码
自8255A口输出
为要显示的数
置led数码表偏移地址为SI求出对应的led数码
自8255A的口输出
使相应的数码管亮
延时
有键按下则退出
movdx,io8255a
moval,0
outdx,al
movah,4ch
int21h
codeends
关掉数码管显示
返回
控制寄存器端口地址口地址
io8255kequioport+28bh
io8255cequioport+28ah
;8255
;8255C
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
dataends
stackssegmentstack
db100dup(?
)
stacksendscodesegment
assumecs:
code,ss:
stacks,ds:
datamainprocfarstart:
movax,stacks
movss,ax
movax,data
movds,ax
movdx,io8255k;设8255为C口输入,A口输出
moval,8bh;10001011
outdx,al
从C口输入一数据
inout:
movdx,io8255c
calldelay
inal,dx
cmpal,'0';
jlexit1;cmpal,9;
jgexit1;
movbx,offsetled;bxsubal,30hxlat;
movdx,io8255a;outdx,almovah,06;
movdl,Offh
int21h;
jneexit
jmpinout;
exit1:
moval,79h
movdx,io8255a
outdx,al
movah,06;
movdl,0ffh
int21h;
jneexit
jmpinout;
exit:
movah,4ch;
int21h
mainendp
是否小于0
若是则显示E
是否大于9
若是则显示E
为数码表的起始地址
求出相应的段码
从8255的A口输出
是否有键输入
是则退出
转inout
是否有键输入
是则退出
转inout
返回DOS
delayprocnear;延时子程序
movbx,2000ZZZ:
movcx,0ZZ:
loopZZdecbxjneZZZ
retdelayendp
codeends
endstart
6-3接线图:
s1dP
♦tt:
;
+5
r-ad9<1」sad寸红mrlad-ad3CMyLJd寸」丄mLJOLEd-£
寸s
■1k1►
“I1
XI
0
•
四、实验中遇到的问题及解决方案
(1)在实验初始,发现七段数码管的a不亮,排除故障发现是由于8255芯片的PA0不能输出高电平;
(2)在各个实验中,连线后发现数码管都没有反应,后来发现,只有在每次运行前运行一下演示实验,再运行自己的程序才出正确结果;
(3)在实验6-3中,初始时,数码管显示的数字是开关预置的数字,即若开关置为0000,0001,则数码管显示1,但是实验要求为预置的为ASCH码;检查代码,发现若直接用从C口输入的数据,则就是数值,达到实验要求还需对从C口输入的数据进行减30h的操作;
(4)上次实验总未完成部分(在in操作指令前未加延时程序)在这次的课时上实现,上次的实验结果是,若开关预置全1,则屏幕一直显示提示信息;若开关预置非全1,则开始会显示提示信息,片刻后不再提示,说明若不加延时,用in指令输入的会是0ffh,但片刻后,开关预置的数据会输入,程序不再提示;遗憾部分是,用到的延时程序是借用之前实验中的,没有改变CX数据以观察需加延时的最短时间;