实验四.docx
《实验四.docx》由会员分享,可在线阅读,更多相关《实验四.docx(11页珍藏版)》请在冰豆网上搜索。
![实验四.docx](https://file1.bdocx.com/fileroot1/2022-12/13/026eca3a-7a21-447a-a30c-723da21ee79e/026eca3a-7a21-447a-a30c-723da21ee79e1.gif)
实验四
实验四七段数码管显示实验
一、实验目的
掌握数码管显示数字的原理。
二、实验内容
1.静态显示:
数码管为共阴极,通过BCD码译码驱动器CD4511驱动,其输入端A~D输入4位BCD码,位码输入低电平选中。
按图4-1连接好电路,将8255的A口PA0~PA3与七段数码管LED1的BCD码驱动输入端A1~D1相连,8255的A口PA4~PA7与七段数码管LED2的BCD码驱动输入端A2~D2相连,8255的B口PB0~PB3与七段数码管LED3的BCD码驱动输入端A3~D3相连,8255的B口PB4~PB7与七段数码管LED4的BCD码驱动输入端A4~D4相连,8255的C口PC0~PC3分别与七段数码管LED4~LED4的位驱动输入端DG1~DG4相连。
编程从键盘上每输入4个0~9数字,在七段数码管LED4~LED4上依次显示出来。
图4-1
2.动态显示:
数码管为共阴极,段码采用相同驱动,输入端加高电平,选中的数码管对应段点亮,位码采用同相驱动,位码输入端低电平选中,按图4-2连接好电路,图中只画了2个数码管,实际是8个数码管,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~g相连(32TCI0模块上的J1连32LED8模块J2),8255的C口的PC0~PC7接七段数码管的段码驱动输入(32TCI0模块上的J3连32LED8模块J1),跳线器K1连2和3。
编程在8个数码管上显示“12345678”。
按任意键推出运行。
图4-2
三、编程提示
1.由于DVCC卡使用PCI总线,所以分配的IO地址每台微机可能都不用,编程时需要了解当前的微机使用那段IO地址并进行处理。
2.对实验内容1,七段数码管字型代码与输入的关系如下表:
显示字型
g
e
f
d
c
b
a
输入DCBA
0
0
1
1
1
1
1
1
0000
1
0
0
0
0
1
1
0
0001
2
1
0
1
1
0
1
1
0010
3
1
0
0
1
1
1
1
0011
4
1
1
0
0
1
1
0
0100
5
1
1
0
1
1
0
1
0101
6
1
1
1
1
1
0
1
0110
7
0
0
0
0
1
1
1
0111
8
1
1
1
1
1
1
1
1000
9
1
1
0
1
1
1
1
1001
3.对实验内容1,七段数码管字型代码与输入的关系如下表:
四、参考流程图
1.实验内容一的参考流程图
图4-3
2.实验内容二的参考流程图
图4-4
五、参考程序
1.内容一的参考程序
源程序清单如下:
datasegment
ioportequ0c400h-0280h
io8255aequioport+288h
io8255bequioport+289h
io8255cequioport+28ah
io8255kequioport+28bh
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1db0dh,0ah,'Inputanum(0--9),otherkeyisexit:
',0dh,0ah,'$'
bzdb?
czdb04h
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255k;使8255的A口为输出方式
movax,80h
outdx,al
sss0:
movsi,offsetbz
movcx,04h
sss1:
movdx,offsetmesg1;显示提示信息
movah,09h
int21h
movah,01;从键盘接收字符
int21h
cmpal,'0';是否小于0
jlexit;若是则退出
cmpal,'9';是否大于9
jgexit;若是则退出
subal,30h;将所得字符的ASCII码减30H
mov[si],al;存入显示缓冲区
incsi;显示缓冲区指针加1
deccx;判断输入满4个数字吗?
jnzsss1;不满继续
movsi,offsetbz;从显示缓冲区取第一个数字的BCD码
moval,[si]
andal,0fh;屏蔽高四位暂存AL
incsi;显示缓冲区指针加1
movah,[si];取第二个数字的BCD码到AH
salah,4h;右移4次到高四位
addal,ah;两个BCD码合并成一个字节
movbl,al;暂存入BL
incsi
moval,[si];取第三个数字的BCD码
andal,0fh
incsi
movah,[si];取第四个数字的BCD码到AH
salah,4h
addah,al
moval,ah
movdx,io8255a;从8255的A口输出(后两个数字)
outdx,al
moval,bl
movdx,io8255b;从8255的B口输出(前两个数字)
outdx,al
moval,0f0h
movdx,io8255c;从8255的C口输出位码
outdx,al
movdl,0ffh
movah,06
int21h
jesss0;有键按下则退出
exit:
movah,4ch;返回
int21h
codeends
endstart
2.内容二的参考程序
源程序清单如下:
datasegment
ioportequ0C400h-0280h
io8255cequioport+28ah
io8255kequioport+28bh
io8255aequioport+288h
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db01h,02h,03h,04h,05h,06h,07h,08h;存放要显示的十位和个位
condb?
;位码
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255k;将8255设为A口C口输出
moval,80h
outdx,al
loop2:
moval,08h;设置数码管位计数器初值到CON
movbyteptrcon,al
movsi,offsetbuffer1;置显示缓冲器指针SI
movah,7fh;置位码初值
disp0:
movcx,0ffffh
movbl,ds:
[si];取显示缓冲区显示值存BX
movbh,0h
pushsi
movdx,io8255c;位码从C口输出
moval,ah
outdx,al
movdx,io8255a
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
outdx,al;段码从A口输出
disp1:
loopdisp1;延时
movcx,0ffffh
disp2:
loopdisp2
rorah,01h;位码右移1位
popsi
incsi;显示缓冲区指针加1
moval,byteptrcon
decal
movbyteptrcon,al
jnzdisp0;数码管位计数器减1为0吗?
,不为0继续
movdx,io8255a;为0,关数码管显示
moval,0
outdx,al
movdl,0ffh
movah,06
int21h
jeloop2;有键按下则退出
movah,4ch;返回
int21h
codeends
endstart
4.实验总结:
在这次的试验中,我们主要做的是验证性试验,首先我们将编写好的程序执行了一遍,但是发现输出的结果不是预想的,出现这个问题的原因是什么的,经过一番的思考后,发现是高低位的问题,后来通过调整线序,经过一番的调整后,结果输出正确了。
后来在经过研究代码后,发现不用调整连线顺序也可以解决问题,于是我就仔细的看代码,后来修改了代码,问题也同样解决了。
在本次的实验中我学会了解决问题的途径是多种的,我们应该学会变通,当然也增加了我阅读汇编程序的能力,锻炼了我的动手能力。