汇编课程设计论文.docx
《汇编课程设计论文.docx》由会员分享,可在线阅读,更多相关《汇编课程设计论文.docx(21页珍藏版)》请在冰豆网上搜索。
汇编课程设计论文
摘要
本次课程设计是做一个数字式秒表,主要是利用8253作为定时器,为秒表提供定时脉冲,使用7段码显示器作为秒表时间显示,用键盘控制秒表,进行一些功能的使用。
关键字
8253模块,8255模块,7段码显示器,秒表,键盘显示。
(一)引言
该系统是一个模拟的数字式秒表,具有秒表的一些基本功能,如暂停计时,继续计时,存储前八名的成绩,再按序显示出来,或是用后来的成绩覆盖前面的成绩。
(二)工作原理
了解了可编程并行接口芯片8255的内部结构、工作方式、初始化编程后对其的应用。
利用8253的定时器输出为秒表提供定时脉冲,7段码显示器作为秒表时间显示,用键盘控制秒表的工作过程。
实验原理图
图5可编程并行接口8255电路
(三)硬件设计
(1)实验连线
Ø8255模块的SWR、SRD分别连到ISA总线接口模块的IOWR、IORD。
Ø8255模块的数据(AD0~AD7)、地址线(A0~A7)分别连到ISA总线接口模块的数据(LAD0~QD7)、地址线(LA0~LA7)。
Ø8255模块选通线CE连到ISA总线接口模块的IOY0。
Ø8255的PA0~PA7连到键盘显示模块的KD0~KD7;8255的PB0~PB3连到键盘显示模块的KL1~KL4;8255的PC0~PC3连到键盘显示模块KH1~KH4。
(2)键盘的设计
键盘的接口一般分为独立式和矩阵式。
独立式按键就是各按键相互独立、每个按键各接一根输入线,一根输入线上的按键是否按下不会影响其他输入线上的工作状态。
因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下了。
独立式按键电路配置灵活,软件结构简单。
但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂。
故此种键盘适用于按键较少或操作速度较高的场合。
若采用此方式,,各按键开关均采用上拉电阻,这是为了保证在按键断开时,各IO口线有确定的高电平。
当然如输入口线内部已有上拉电阻,则外电路的上拉电阻可省去。
矩阵式键盘适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上,一个4*4的行、列结构可以构成一个含有16个按键的键盘。
很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多的I/O口。
行、列线分别接到按键的两端。
行线通过上拉电阻接到+5V上。
平时无按键时,行、列线处于高电平状态,而当有键按下时,行、列线将导通,因此行线电平状态将由与此行线相连的列线电平决定。
按键的识别一般采用扫描法。
让所有的列线处于低电平,当有键按下时,按键所在的行电平将被拉成低电平,根据此行电平的变化,便能判定此行有键被按下。
为了进一步判定到底哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。
PA0
︱
PA7
8255
PB0CEPB1
PB2
PB3
驱动
电路
IOY0
(3)I/O接口卡硬件设计
I/O接口硬件卡设计时,ISA总线与接口芯片间的接口电路并不复杂,仅涉及到ISA总线中部分信号线(8位数据线D7~D0、10根地址线A9~A0和
、
、AEN、RST等控制信号),如下图所示。
图28255接口卡硬件原理图
(四)软件设计
(1)主程序流程图如下:
开机
初始化
调用键盘初始化程序
N
有键按下吗?
Y
转转转转转
至至至至至
GMAPR
处处处处处
理理理理理
程程程程程
序序序序序
返回DOS
(2)开始比赛程序框图:
清显示缓冲区,使之显示
清ms时间常数单元、名
次单元、显示记录数单元
建立比赛开始和可存储标志
返回
(3)名次存储程序框图:
读标志寄存器
N
可存储吗?
Y
将显示缓冲区的秒和0.1秒所对应
的单元内容送相应记录的显示缓冲区
将名次单元加1
建立记录标志
N
记录满8个吗?
Y
清可存储标志
返回
(4)显示成绩程序框图:
读标志寄存器
N
可记录吗?
Y
取记录数
将相应的记录值送显示缓冲区
记录数加1
N
记录数>名次数吗?
Y
将记录数清0
返回
(5)比赛结束及返回DOS程序框图:
(6)中断程序框图:
保护现场
ms时间常数加1
N
到100ms否?
Y
将0.1秒单元加1
N
满1秒否?
Y
将秒单元加1,清0.1秒单元
N
满10秒否?
Y
将10秒单元加1,清秒单元
N
满60秒否?
Y
清100秒单元
清比赛和可存储标志
调用6位LED动态显示程序
送中断结束命令
恢复现场
中断返回
(五)源程序
inttypeequ08h;设置中断类型码
p8253ctrlequ43h;8253的控制口
p8253ctoequ40h;8253的数据口
p8255ctlequ0e803h;8255的控制口
rowportequ0e801h
colportequ0e802h
segportequ0e800h;段选
bitportequ0e801h;位选
cntoequ11930;用来计算频率
.modelsmall
.data;数据段
strdb36dup(?
);定义一个数组用来存放前八个成绩
flagdb0;定义标志位
mcdb1;定义名次
numdb1
pointdwstr;定义指针
point2dwstr;定义指针
countdb0;用来计时,初始化为0
buffdb0,0,0,0;初始化数据缓冲区
buff2db0,0,0,0;初始化数据缓冲区
bitdb1;位码置1
messdb'0-开始比赛1-记录成绩2-显示成绩3-退出返回DOS4-比赛结束5-暂停计时:
',0dh,0ah,'$'
dsegdb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h;数据‘0’~‘9’
asctabdb"0123456789ABCDEF"
.code;代码段
.startup;开始
movah,9
leadx,mess
int21h
moval,36h;写8253的方式字
movdx,p8253ctrl
outdx,al
movax,cnto;
movdx,p8253cto;写初值
outdx,al
moval,ah
outdx,al
moval,81h;8255初始化
movdx,p8255ctl
outdx,al
moval,inttype;DOS调用,读取中断向量
movah,35h
int21h
pushes;将es,bx,ds入栈保护
pushbx
pushds
movax,@data
moves,ax
movdx,offsetintp;取intp的偏移量
movax,segintp;取intp的段地址
movds,ax
moval,inttype;设置inttpye的新中断向量
movah,25h
int21h
popds;将ds出栈
inal,21h;CPU开中断(开IR0)
andal,0feh
out21h,al
sti
ab:
callbutton
cmpal,'3';如果为F,则退出
jzfp
cmpal,'1';如果为1,且标志位D0位为1,D2为1,则可保存成绩
jzmp
cmpal,'2'
jzpp
cmpal,'4';比赛结束,即可以重新开始比赛
jzap
cmpal,'5';暂停计时
jzpap
cmpal,'0'
jnzab
ORflag,05h;如果按键为B,则置标志位最后一位为1
jmpab
mp:
;存储的代码
testflag,04h;先判断是否还能存储,不能则跳到ab,否则继续
jzab
moval,mc;将第一位的名次先放到buff,然后一起放入数组
movbuff,al
leasi,buff
movdi,point
movcx,4
cld
repmovsw
cmpmc,8;如果名次到了8个,则将标志位置零,然后就不能存储了。
jzgo3
incmc
addpoint,4
jmpab
go3:
andflag,0fah
leabx,str
movpoint,bx
jmpab
pp:
andflag,0feh
cmpnum,9;判断是否按过8次,是退出,否则继续
jzab
incnum
leadi,buff
movsi,point2
movcx,4
cld
repmovsw
addpoint2,4
jmpab
ap:
pushbx
andflag,0;对标志和名次及num都进行初始化,以便比赛重新开始
movmc,1
movnum,1
leabx,str
movpoint,bx
movpoint2,bx
movbuff,0
movbuff+1,0
movbuff+2,0
movbuff+3,0
popbx
jmpab
pap:
andflag,0feh
jmpab
fp:
cli;关中断
popdx;出栈
popds
moval,inttype;设置新的中断向量
movah,25h
int21h
.exit0;主程序结束
intp:
pushsi
pushdi
pushax
pushbx
pushcx
pushdx
testflag,01h;判断标志位D0是否为1,为1开始,否则不计数
jziexit
inccount;次数加1
cmpcount,10;将count和100比较
jnziexit;若count不等于100,则转iexit
movcount,0;否则count置0
incbuff+3;秒的地位加1
cmpbuff+3,10;将秒的地位和10相比较
jnziexit;若秒的地位不等于10,则转iexit
incbuff+2;否则向秒的高位进1
movbuff+3,0;秒的地位置0
cmpbuff+2,10;秒的高位和6相比
jnziexit;若不为6,则转iexit
incbuff+1;否则分的地位加1
movbuff+2,0;将秒的高位置0
cmpbuff+1,6;分的地位和10相比
jnziexit;若不等则转iexit
;incbuff;否则分的高位加1
movbuff+1,0;分的地位置0
andflag,0feh
;cmpbuff,6;分的高位和6比较
;jnziexit;不等则转iexit
;movbuff,0;将分的高位和0比较
iexit:
leabx,dseg;去数据表的首地址
leasi,buff;取缓冲区的首地址
agi:
moval,[si];将si的内容送给al
xlat;将ASCII码转换成数据
movah,al
movdx,bitport
moval,bit
outdx,al
cmpal,04h;判断是否为第二位,是则加上点,否则继续
jnzq1
andah,07fh
q1:
moval,ah
movdx,segport;取相应的段和位
outdx,al
movcx,8000h;延时
delay:
loopdelay
incsi;缓冲区地址加1
shlbit,1;将位加1
cmpbit,10h;将bit和10h相比
jnzagi;不等于则循环
movbit,1;否则将bit置1
moval,0
movdx,bitport
outdx,al
moval,20h;将8259偶口中的数据输出
out20h,al
popdx
popcx
popbx
popax
popdi
popsi
iret
buttonprocnear
next:
movdx,rowport
moval,0
outdx,al
incdx
abb:
inal,dx
andal,0fh
cmpal,0fh
jzabb
movcx,8000h
delayy:
loopdelayy
movbh,00;首行号
movbl,0;列号
movcx,4
movah,0feh
again:
moval,ah
movdx,rowport
outdx,al
incdx
inal,dx
andal,0fh
cmpal,0fh
jnzab1
addbh,4
shlah,1
loopagain
jmpnext
ab1:
movcx,4
ab3:
shral,1
jcab2
jmpab4
ab2:
incbl
loopab3
ab4:
addbh,bl
moval,bh
leabx,asctab
xlat
pushax
movdl,al
movah,2
int21h
movdx,rowport
moval,0
outdx,al
incdx
AB5:
inal,dx
andal,0fh
cmpal,0fh
jnzAB5
movcx,000h
delay2:
loopdelay2
popax
ret
buttonendp
end
(六)软、硬件测试
测试环境(软、硬件)、过程、故障排除等
(七)结论
对系统作一个全面的评价:
有何特点、存在的问题、改进意见等
(八)结束语
通过课程设计,你有何体会,学到了什么?
(九)参考文献