微机实验报告4
姓 名:
专 业:
实验时间:
评定成绩:《微机实验及课程设计》实验报告 学号 08011309 东南大学 实验报告 实验六 8255 并行输入输出 李俊环 学 号: 08011309 自动化 实 验 室: 计算机硬件技术 2013年05月10日 报告时间: 2013年05月10日 审阅教师:
《微机实验及课程设计》
一. 实验目的
1)掌握 8255 方式 0 的工作原理及使用方法,利用直接输入输出进行控制显示;
2)掌握 8 段数码管的动态刷新显示控制;
3)分析掌握 8255 工作方式1时的使用及编程,进一步掌握中断处理程序的编写。
二. 实验内容
必做:
6-1、8段数码管静态显示: 编程从键盘输入一位十进制数字(0~9),在数码管上显示出来。
6-2、8段数码管动态显示:在两个数码管上同时显示不同的两位数字或字母,保持不变直至退出。(如56或7f,参考程序p69)
选做:
6-3 静态显示:用逻辑电平开关预置某个数字(0~9)的ASCII码,将该数据用8255的C口读入,并用A口输出,并在数码管显示出来;如果预置的ASCII码不是数字(0~9),数码管显示E字母。
6-4 动态显示:在两个数码管上滚动循环显示不同的0~f字符。(即开始时两个数码管显示01,12,23,34 ··f0,一直循环直至退出)
三.实验原理与接线
(1)8255 方式 0:简单输入输出
实验电路如图 3.7-1,8255C 口输入接逻辑电平开关 K0~K7,编程 A 口输出接 LED 显示电路 L0~L7; 用指令从 C 口输入数据,再从 A 口输出。
(2)编程将A 口 L0-L7控制成流水灯,流水间隔时间由软件产生;流水方向由 K0键在线控制,随时 可切换;流水间隔时间也可由 K4~K7 键编码控制,如 0000 对应停止,0001 对应 1 秒,1111 对应 15 秒,大键盘输入 ESC 键退出。
(3)8 段数码管静态显示:按图 3.7-2 连接好电路,将 8255 的 A 口 PA0~PA6 分别与七段数码管的段 码驱动输入端 a~g相连,位码驱动输入端 S1 接+5V(选中) ,S0、dp 接地(关闭) 。编程从键盘输
入一位十进制数字(0~9) ,在七段数码管上显示出来。
(4) 8 段数码管动态显示:按图 3.7-3 连接好电路,七段数码管段码连接不变,位码驱动输入端 S1、 S0接 8255 C口的 PC1、PC0。编程在两个数码管上显示“56” 。 (注意字符变换之间应使段位全灭,避免显示“影子”
七段数码管的字型代码表如表
3.7-1:
编辑提示:
1、实验台的七段数码管为共阴性,段码同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码的输入端高电平选中。
2、8255的A口、B口、C口和控制口的端口地址分别为288H~28BH。编程首先要设置控制字输出到控制口。
3、逻辑电平开关向上拨到“1”时输出高电平;向下拨到“0”时输出低电平。
4、动态显示时应先从A口输出段码,然后再从C口输出位码,然后应该延时一段时间才能看到数码管的显示。
其中段码需要查表
Led db 3fh,06h,…………71h
位码分别为:左边的数码管xxxxxx10
右边的数码管xxxxxx01
5、动态显示时为了使两个数码管的字符可以同时看到,应注意延时的时间。
6、注意字符变换之间应使段位全灭,避免影子。
实验接线图(静态显示)
PA0~PA6分别接数码管的a~g
PC0~PC7分别逻辑电平开关的K0~K7
位选端S1接+5V
位选端S0接地
数码管dp端接地
实验接线图(动态显示)
PA0~PA6分别接数码管的a~g
位选端S0 、S1接8255C口的PC0、PC1端
四.实验源程序(主要部分)和流程图
源程序:
6-1、8段数码管静态显示: 编程从键盘输入一位十进制数字(0~9),在数码管上显示出来。
data segment
ioport equ 0c800h-0280h
io8255a equ ioport+288h
io8255b equ ioport+28bh
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
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
start: mov ax,stacks
mov ss,ax
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
6-2、8段数码管动态显示:在两个数码管上同时显示不同的两位数字或字母,保持不变直至退出。(如或7f,参考程序p69)
56
data segment
ioport equ 0d400h-0280h ;tpc卡中设备的io地址
io8255a equ ioport+28ah ;8255C口地址
io8255b equ ioport+28bh ;8255控制寄存器端口地址
io8255c equ ioport+288h ;8255A口地址
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,stacks
mov ss,ax
mov ax,data
mov ds,ax
mov dx,io8255b ;将8255设为A口输出
mov al,80h
out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
loop2: mov bh,02
lll: mov byte ptr bz,bh
push di
dec di
add di, bz
mov bl,[di] ;bl为要显示的数
pop di
mov al,0
mov dx,io8255a
out dx,al
mov bh,0
mov si,offset led ;置led数码表偏移地址为SI
add si,bx ;求出对应的led数码
mov al,byte ptr [si]
mov dx,io8255c ;自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
选做:
6-3 静态显示:用逻辑电平开关预置某个数字(0~9)的ASCII码,将该数据用8255的C口读入,并用A口输出,并在数码管显示出来;如果预置的ASCII码不是数字(0~9),数码管显示E字母。
ioport equ 0d400h-0280h ;tpc卡中设备的io地址
io8255a equ ioport+288h ;8255A口地址
io8255b equ ioport+28bh ;8255控制寄存器端口地址
io8255c equ ioport+28ah ;8255C口地址
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ss:stacks
main proc far
start: mov ax,stacks
mov ss,ax
mov dx,io8255b ;设8255为C口输入,A口输出
mov al,8bh
out dx,al
inout: mov dx,io8255c ;从C口输入一数据
in al,dx
mov dx,io8255a ;从A口输出刚才自C口
out dx,al ;所输入的数据
mov dl,0ffh ;判断是否有按键
mov ah,06h
int 21h
jz inout ;若无,则继续自C口输入,A口输出
mov ah,4ch ;否则返回DOS
int 21h
main endp
code ends
end start
6-4 动态显示:在两个数码管上滚动循环显示不同的0~f字符。(即开始时两个数码管显示01,12,23,34 ··f0,一直循环直至退出)
data segment
ioport equ 0b800h-0280h
io8255a
io8255b
io8255c equ ioport+28ah equ ioport+28bh equ ioport+288h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buffer1 db 0,0 ;存放要显示的十位和个位
bz dw ? ;位码
data ends
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ds:data,ss:stacks
start: mov ax,stacks
mov ss,ax mov ax,data mov ds,ax mov dx,io8255b ;将8255设为A口输出 mov al,80h out dx,al
mov di,offset buffer1 ;设di为显示缓冲区
loop1: mov cx,0300h ;循环次数
loop2: mov bh,02
lll:
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,io8255c ;自8255A的口输出
out dx,al mov al,byte ptr bz ;使相应的数码管亮 mov dx,io8255a out dx,al push cx mov cx,0ffffh ;如果显示过快,可更改cx值为最大0ffffh
delay: loop delay ;延时
pop cx
mov bh,byte ptr bz
shr bh,1
jnz lll
loop loop2 ;
mov ax,word ptr [di]
cmp ah,09
jnz set
cmp al,09
jnz set
mov ax,0000
mov [di],al
mov [di+1],ah
jmp loop1
set: mov ah,01
int 16h
jne exit ;
mov ax,word ptr [di]
inc al
aaa
mov [di],al ;al
mov [di+1],ah ;ah
jmp loop1
exit: mov dx,io8255a
mov al,0 ;
out dx,al
mov ah,4ch ;
int 21h
code ends
end start
流程图:
循环延时 有键按下则转exit 为十位 中为个位 关掉数码管显示 返回DOS
五. 实验结果以及遇到的问题和解决办法
实验六的目的主要是通过实验对芯片8255的工作机理有了更加清楚地认识,对其实现中断控制有了一定的了解。必做和选作一共四个实验,感觉是相通的,逐步递进,参考书本上面的程序,进行编程接线,但过程中也出现了一些小问题,例如后面实验数字转变的速度处理的不是很好,但是最后都解决验收了。本次实验了解计算机内部芯片工作机理,为整个硬件架构体系的了解奠定了一定的基础。