打字计时练习程序设计微机原理课程设计.docx
- 文档编号:25615112
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:32
- 大小:51.17KB
打字计时练习程序设计微机原理课程设计.docx
《打字计时练习程序设计微机原理课程设计.docx》由会员分享,可在线阅读,更多相关《打字计时练习程序设计微机原理课程设计.docx(32页珍藏版)》请在冰豆网上搜索。
打字计时练习程序设计微机原理课程设计
摘要
微机原理对于我们自动化的学生来说是一门非常重要的基础课程,它与以往的课程不太相同,它的实践性非常的强,其课程设计目的在于综合运用所学知识,全面掌握微型计算机与DOS方式的工作原理、编程和使用方法。
加强我们的自身解决问题的能力,通过对题目的了解,进而对基本编程方法更加熟悉,使我们可以更加熟练的使用汇编语言,来实现基本的功能。
对于打字程序的设计,需考虑到计算机内各种数制之间的转换,考虑到界面等问题,对于程序的编写、调用应灵活运用。
关键词:
汇编语言DOS调用子程序调用打字计时器
打字计时练习程序设计
1设计任务
初始条件
设计一个打字计时练习程序,在屏幕实现,并显示正确率及计时。
要求完成的主要任务
1.在缓冲区中预放一些字母,运行时,可按照屏幕上显示的字母输入练习。
2.按某个键开始练习,每输入完一行按回车键后,可显示出练习的时间及正确率。
设计目的
熟悉与掌握有关键盘和时间的中断及字符显示技术。
设备环境
在本设计中,所用到的设备环境如下所示:
A.计算机一台;
B.MFPCI98集成实验环境;
2方案比较与认证
2.1在缓冲区中预放一些字母的方法及比较
一是在数据段中预先存放一字符串,在程序运行时直接按顺序提取这一字符串;
二是在缓冲区中预先存放字符串后,再在程序运行时随机提取字母进行显示。
方案比较:
第一种方法显示的始终是同一组字符串,对于练习来说过于单一,对练习打字得不到很好的效果。
第二种方法在显示时是在缓冲区预存的字符串中随机选取,因此具有随机性能够很好的起到练习的效果,但同时程序更为复杂。
为了实现“在缓冲区中预放一些字母”这一功能,采用了第二种方法。
显示出练习的时间的方法及比较
一是在输入过程中无时间显示,只有当输入完了按回车后才能显示练习所用的时间;
二是在练习的过程中始终有时间显示,即显示系统时间。
方案比较:
第一种方法现实出的一段练习后的时间,第二种方法中一直有时间显示,整体效果会更好,同时,第二种方法基本包括了第一种方法,因此,选择方法二。
3软件设计方案
软件设计思想
在键盘上练习的打字例句及其地址表、计时单元等预先放在DATA数据段中。
自编的中断程序kbint检测按键时产生的中断,并把按键的扫描码转换为ASCII码存入缓存区BUFFER(内存中的一个区域),这个工作和EOM09类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,既只解释了可显示字符(入英文小写字母、数字及一些字符),其他特殊键(如组合键、双态键、功能键等)都未做解释,只作字符码0来处理。
在主程序部分保存原有09类型的中段向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中断。
当键盘中断处理后,主程序安排指令读取缓存区中的字符并显示在屏幕上。
在主程序的末尾,利用DOS功能恢复原09类型的中断向量,然后返回DOS。
在显示键入的字符时,还应判断字符是否为回车符(0DH)。
如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序显示出打字时间,然后顺序显示一个例句。
如果所存放的例句都已显示完毕,则再次从第一个例句开始显示,直至键入某一个功能(如Esc键、Shift键等)退出程序,结束打字练习。
打字时间统计利用自编的定时器中断处理程序Clint来完成。
每输入一个例句,计时一次。
在此中断例行程序中,定时器中断的次数记录在计数单元count中,当count的计数值为18时,sec计数单元加1,当sec计数值打到60时,min计数单元加1.因为输入完一个句子无论如何也不会到达小时级,所以对hours计数值的调整判断,实际上只起到退出定时器的作用。
加入一个显示菜单程序,使得原来的程序更具有观赏性;
显示时间的子程序disptime分别将各计时单元的二进制数转换为十进制数,并以min:
sec:
msec的形式出来。
其中msec是有count中的计数值转换成的:
Count*1s/=count*55ms
此式中,是计算机系统产生的一个时间中断,每秒次
程序流程图
主程序流程图
N
Y
Y
N
段地址初始化
产生随机字符串
打开窗口
字符等于81?
宏调用清屏
缓冲区中字符是否输入完毕
屏幕上显示结果
退出打字状态
结束
开始
装载字符串输出
键盘打字输入字符
图3-1主程序流程图
其他子程序原理及流程图
打字结果计算与显示模块(UseTimeAndOut,RightRata_out)-----主要计算所用时间及正确率并输出。
设置字符颜色模块(clew_char)-----主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。
字符满行处理模块(isFullLine)-----主要功能是当字符输入满行时进行换行。
输出模块(OutTime,btod_out)-----输出程序运行时的时间。
统计模块(Tongji)-----统计字符个数和正确个数并记录时间。
宏的应用:
清屏(Clear)-----用于按要求清理屏幕(不同颜色),以便产生想要的窗口。
设置光标位置(SETGB)-----用于移动光标位置,以便按要求输出。
读光标位置(READGB)-----用于读取当前光标位置。
提示(Tishi)-----用于输出提示语句。
(1)随机数产生原理:
随机产生字符的实现是通过调用中断(ah=2ch,int10)取系统时间的1/100来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符来得到一串字符。
在把结果显示到屏幕上时将数据拆分后输出到屏幕上。
(2)记录当前时间和正确个数及打个数:
光标置位
提示时间输出
输出正确率
清屏
结束
开始
图3-2记录当前时间和正确个数及打个数部分流程图
(3)正确率输出模块流程图:
输入统计正确字符个数
计算正确率
整数部分输出
小数点输出
小数部分输出
%输出
结束
开始
图3-3正确率输出部分流程图
(4)计算打字时间及输出模块
N
Y
Y
Y
Y
N
提取打字结束时系统时间
结束时间与stime[2]做差
一分钟进位(dh+60)
SF=1
ZF=0
Cl-1
Cl-stime[1]
SF=1
ZF=0
一小时进位(dh+60)
Ch-1
Ch-stime[1]
输出
N
N
结束
开始
图3-4记录当前时间和正确个数及打个数部分流程图
开始
(5)数据打印输出:
N
Y
N
Y
N
N
N
Y
Y
输出BX中内容
Bl/10,屏蔽ax高位
判断指针si是否为0
将temp[si]内容送入dl,dl+’0’+’’
ZF=1
dl与’0’进行比较
ZF=0
Si+1,si与3进行比较
jia
dp=0
输出字符
AF=1
ZF=1
ZF=0
bp与1进行比较
Si-1
输出字符
bp与1进行比较
结束
图3-5记录当前时间和正确个数及打个数部分流程图
(6)改变字符颜色:
所谓属性是指字符的颜色、背景颜色、是否闪烁、有没有底线等性质。
在彩色显示卡(CGA/EGA/VGA等)的文字模式中,颜色是用4个位表示,故可以表现出16种颜色,如下表:
表3-1颜色对应的代码
二进制数
颜色
二进制数
颜色
0000
黑色
1000
灰色
0001
蓝色
1001
淡蓝色
0010
绿色
1010
淡绿色
0011
青色
1000
淡青色
0100
红色
1100
淡红色
0101
紫红色
1101
淡紫红色
0110
棕色
1110
黄色
0111
银色
1111
白色
在彩色显示器里,如CGA、EGA、VGA等,常用一个字节(8个位)来表示文字颜色和背景颜色,通常以第0~3位表示文字本身颜色;第4~6位表示背景颜色,背景颜色只有上表左栏的8种而已;第7个位,表示是否闪烁,0表示不闪烁,1表示闪烁。
改变字符颜色部分流程图:
N
N
Y
读取光标位置
对bp进行除法处理
处理得出光标的置位值
设置光标属性,光标置位
bp与0进行比较
temp[0]-1,temp[1+50]
设置光标及字符属性
bp-1
temp[1]-1
temp[1]与14进行比较
ZF=0
ZF=0
Y
结束
开始
图3-6改变字符颜色部分
4程序调试及问题分析
4.1调试记录
进入调试程序软件MFPCI98,在新建文件内输入源程序,生成汇编源文件,汇编成功,无错误。
之后连连接程序,生成可执行文件,在运行该文件,或使用人机交互方式直接进行“编译&连接&运行”如下图4-1所示。
图4-1生成可执行文件
按照要求进行输入,如下图4-2所示,可随时显示时间和正确率。
图4-2进行字符输入
最后当按下ESC键时,退出程序,并显示时间和正确率,按下任何键之后,就可以随时退出程序,如下图4-3所示。
图4-3最终结果显示
4.2调试中出现的问题
出现问题:
在程序开始运行之后,会出现一大段的时间没有界面显示,导致以为程序无法运行?
问题分析:
在运行后,等待一个较长的时间,就可以正常运行。
原因应该是缓冲区内字符随机选取会需要很长一段时间。
结束语
本次课程设计与以往有很大不同,需要原创性、创新性,以前有参考资料提示按照书本要求做就可以得到数据,本次课程设计要求我们首先要读懂源程序,软件硬件相关知识都要具备,然后根据要求和想法添加程序功能以完善。
所以没有雷同,答案各式各样,从分调动了我们的积极性和创造力。
它使我们对课本以及以前学过的知识有了一个更好的总结与理解,也让我们知道了如何学以致用。
之前从模拟电路课程设计还是到电工实习,还有这次微机课程设计使自己更清楚了实践的重要性,不管我们学到什么,懂得多少,要是拿不出知识来解决实际问题,说什么都没用。
在每次课程设计后,自己都觉得有一个不小的进步,虽然有些方面自己做不出,但可以从老师和其他同学那里学到更好更多的东西,他们从另一个方面透析了自己的困难,这是很重要的,它让我学会了怎样学习别人的长处并把它变成自己的长处。
通过多次的实践,使我深切的体会到培养动手能力的重要性,程序设计是一门实践性很强的东西,不仅要学好书本知识,那是远远不够的,还必须随时把所学知识投入实际应用之中,在此过程中多参照些相关资料,只有这样,才能达到学习的目的,才能学好一门编程语言。
这次实践中,我感觉到自己掌握的只是太匮乏了,太不深刻了,当用到某个知识点时,经常是脑子了有个印象,而确切的却想不起来,幸亏还可以查阅资料要不就什么也不会了。
通过这次实践,我觉的必须很熟练的掌握专业知识,才能很顺畅的编程,才能提高效率,考虑问题也会更全面,编写的程序也会很完善。
参考文献
[1]《微机原理与接口技术》周佩玲电子工业出版社2005年4月第一版
[2]《IBM-PC汇编语言程序设计》沈美明清华大学出版社2001年8月第2版
[3]《IBM-PC汇编语言程序设计例题习题集》沈美明清华大学出版社1991年6月第1版
[4]《微机系统和接口应用技术》朱世鸿清华大学出版社2006年9月第1版
[5]《IBM-PC80×86汇编语言程序设计》,王保恒,国防科技大学出版社,1992
附录
源程序
;---------------------------------------------
COLORCHARMACROchar,color
pushax
pushbx
pushcx
pushdx
movah,9h;在光标位置显示字符和字符属性
moval,char;AL字符
movbh,0;显示页
movbl,color;字符属性
movcx,1;字符重复个数
int10h
movah,03h;读光标位置;DH:
DL=行:
列
movbh,0;显示页号
int10h
movah,02;置光标位置
incdl;列
int10h
popdx
popcx
popbx
popax
ENDM
;---------------------------------------
BACKCHARMACROchar,color
movah,02h;
movdl,08h;退格
int21h
COLORCHARchar,color
ENDM
;---------------------------------------
CLEARMACROalz,bhz,chz,clz,dhz,dlz;清屏窗口
pushax
pushbx
pushcx
pushdx
moval,alz;上卷行数
movbh,bhz;卷入行属性
movch,chz;左上角行数
movcl,clz;左上角列数
movdh,dhz;左下角行数
movdl,dlz;左下角列数
movah,06h
int10h
popdx
popcx
popbx
popax
ENDM
;---------------------------------------
;------------------------------------------
SETGBMACRObhz,dhz,dlz;设置光标位置
pushax
pushbx
pushcx
pushax
movbh,bhz;显示页号
movdh,dhz;行
movdl,dlz;列
movah,2;置光标位置
int10h
popdx
popcx
popbx
popax
ENDM
;-------------------------------------------
READGBMACRObhz;读光标位置
pushax
pushbx
pushcx
pushdx
movbh,bhz;显示页号
movah,03h;读光标位置
int10h
movgbattr[0],dh;记录光标行
movgbattr[1],dl;记录光标列
popdx
popcx
popbx
popax
ENDM
;-------------------------------------------
LINEFULLMACROlmax,lact
pushax
pushbx
pushcx
pushdx
movax,lact
cmpax,0
jzLFEXIT
movdx,0
cwd
movbx,lmax
divbx
cmpdx,0
jzLNFU
jmpLFEXIT
LNFU:
movFullFlag,1
LFEXIT:
popdx
popcx
popbx
popax
ENDM
;------------------------------------------
TISHIMACROrow,col,addrr
pushax
pushdx
SETGB0,row,col;设置光标位置
movah,09h
leadx,addrr
int21h
popdx
popax
ENDM
;------------------------------------------
datasegment
addrrdb400dup('$')
addrr1db'abcdefghijklmnopqrstuvwxyz09$'
addrr2db400dup('$')
Anumberdw0;总字符个数
Rnumberdw0;正确字符个数
LineMaxdw0;满行的字符数
LineActdw0;当前行字符数
FullFlagdb0;满行标志FullFlag=1满行,FullFlag=0未满
gbattrdb2dup(0);存放字符所在行列
Stimedb3dup(0)
tempdb5dup(0)
ts1db'Stime:
$'
ts2db'Rrate:
$'
ts3db'TotalUse-Time:
$'
ts4db'TotalCharacters:
$'
ts5db'Correct-Reta:
$'
ts6db'Pressanykeytoend!
$'
ts7db'AnESCJianKeYiSuiShiTuiChu!
$'
ts8db'***DaZiLianXi***$'
dataends
codesegment
assumeds:
data,cs:
code
start:
movax,data
movds,ax
;----------------------------------------------
movdi,0;随机产生字符
movbx,65
zifu:
movah,2ch
int21H
moval,dl
cbw
movsi,ax
cmpsi,35
jazifu
moval,addrr1[si]
movaddrr[di],al
incdi
decbx
pushdi
pushsi
movdi,400h
Aa1:
movsi,0ffffh
Aa2:
decsi
jnzAa2
decdi
jnzAa1
popsi
popdi
cmpbx,0
jnzzifu
;------------------------------------------
CLEAR0,77h,0,10,23,69
CLEAR0,37H,3,12,22,66
CLEAR0,70h,4,14,22,64
CLEAR0,25H,12,14,14,64
CLEAR0,70h,13,18,13,35
CLEAR0,70H,13,43,13,60
;------------------------------------------
SETGB0,0,30;输出上面提示语句
CLEAR0,25h,0,28,0,49
CLEAR0,25h,2,23,2,54
CLEAR0,57h,1,14,1,64
movah,09h
leadx,ts8
int21h
SETGB0,2,24
movah,09h
leadx,ts7
int21h
;---------------------------------------------
SETGB0,4,14
movdi,0
movcx,0ffffh
AD:
movdl,addrr[di];装载字符
cmpdl,'$'
jzA2
pushdx
movbp,di
CALLisFullLine
popdx
movah,02h
int21h
incdi
loopAD
A2:
movah,2ch;取系统时间
int21h
movStime[0],ch
movStime[1],cl
movStime[2],dh
SETGB0,15,14
CALLTONGJI
movcx,0ffffh
movdi,0h
AS:
cmpaddrr[di],'$'
jnzASnt00
jmpAEND
ASnt00:
movbp,di
CALLisFullLine
movbp,di
CALLclew_char;改变字符颜色
;==========================================
reinput:
;输入字符开始打字
READGB0
movah,01
int21h
cmpal,81;是否退出
jnzal27nt
jmpexit
;------------------------------------------
al27nt:
cmpal,0dh
jnzal0dnt
SETGB0,gbattr[0],gbattr[1]
jmpreinput
al0dnt:
cmpal,08
jnzASnext
cmpgbattr[1],14
jnzASnz
SETGB0,gbattr[0],gbattr[1]
jmpreinput
ASnz:
movah,02h
movdl,''
int21h
movah,02h
movdl,08h
int21h
decdi
decAnumber
pushax
moval,addrr2[di]
cmpal,addrr[di]
jnzAS1nt
decRnumber
AS1nt:
popax
CALLTONGJI
movbp,di
CALLclew_char;改变字符颜色
jmpreinput
;------------------------------------------
;==========================================
ASnext:
incAnumber
CALLTONGJI
movaddrr2[di],al
cmpal,addrr[di]
jnzAER
incRnumber
CALLTONGJI
A3:
incdi
loopAS1
AS1:
jmpAS
AEND:
jmpexit
AER:
movtemp[1],al
BACKCHARtemp[1],74h
jmpA3
exit:
CLEAR0,07,8,16,17,63
CLEAR0,57,10,20,15,59
TISHI11,24,ts3
callUseTimeAndOut
TISHI12,24,ts4
movbx,Anumber
callbtod_out
TISHI13,24,ts5
callRightRata_out
TISHI14,30,ts6
movah,08
int21h
movah,4ch
int21h
;---------------------------------------------------
RightRata_outprocnear;输出正确率
pushax
pushbx
pushcx
pushdx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 打字 计时 练习 程序设计 微机 原理 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)