微机原理课程设计打字练习计时.docx
- 文档编号:24543408
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:27
- 大小:103.38KB
微机原理课程设计打字练习计时.docx
《微机原理课程设计打字练习计时.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计打字练习计时.docx(27页珍藏版)》请在冰豆网上搜索。
微机原理课程设计打字练习计时
微机原理课程设计书
院别电气工程学院
专业电气工程及其自动化
班级
题目打字计时程序
学生
学号
同组者
2011年1月7日
目录
第一章设计要求1
1.1设计任务1
1.2设计要求1
1.3设计目的1
第二章设计环境1
DOS中断介绍1
第三章课题设计3
3.1硬件设计3
3.2软件设计3
3.3系统运行过程描述4
3.4设计中遇到的问题及解决方法5
3.5新增功能及其实现方法5
第四章设计体会6
附录6
附录一程序流程图6
附录二源程序8
第一章设计要求
1.1设计任务
利用PC机键盘和时间中断、字符显示实现打字练习程序。
1.2设计要求
1)自行编制键盘中断和时间中断处理程序,并保存原中断向量,程序运行时,使用自编的中断向量处理程序,程序退出时,恢复中断向量;
2)在缓冲区中预放了一些字母,程序运行时,可按照屏幕上显示的小写字母进行输入练习;
3)每输入完一行按回车键后,可显示出练习输入的时间。
4)自行添加若干功能。
1.3设计目的
熟悉与掌握有关键盘和时间的中断及字符显示技术。
第二章设计环境
DOS中断介绍
使用DOS提供的程序控制硬件。
优点是兼容性好,使用方便。
DOS是IBMPC系列微机的操作系统(现在的微机仍能运行DOS,而且新的操作系统也能继续提供几乎所有的DOS功能调用)负责管理系统的所有资源,协调微机的操作,其中包括大量可供用户调用的服务程序。
DOS的功能调用不依赖于具体的硬件系统。
所有的DOS系统功能调用都是利用软件中断指令INT21H来实现的。
也就是说,在程序中需要调用DOS功能的时候,只要使用一条INT21H指令即可。
INT21H是一个具有90多个子功能的中断服务程序,这些子功能大致可以分为四类:
设备管理、目录管理、文件管理和其他。
其功能一览表可参见附录。
为了方便用户使用这些子功能,INT21H对每一个子功能都进行了编号——称为功能号。
这样,用户就能通过指定功能号来调用INT21H的不同子功能。
DOS系统功能调用的方法如下:
1)AH->功能号。
2)在其他寄存器中放入该功能所要求的人口参数。
3)在执行INT21H指令。
4)分析出口参数。
用户程序与DOS、BIOS和硬件的关系见图
第三章课题设计
3.1硬件设计
通过将从8259A的INT端与主8259A的IRQ2相连来实现两片8259A的级联,主8259A的IRQ0接收8254的55ms定时器中断,IRQ1接收键盘中断。
主8259A的INT端与CPU相连。
3.2软件设计
在键盘上练习的打字例句及其地址表、计时单元等预先放在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/18.2=count*55ms
此式中,18.2是计算机系统产生的一个时间中断,每秒18.2次
3.3系统运行过程描述
1.程序运行开始,设置堆栈段与数据段。
然后调用定义过的宏定义,以显示一个用户欢迎和提示操作界面。
2.清屏,调用显示动画的子程序,显示一段动画效果。
3.关中断,然后保存09H和1CH中断向量到自设的单元中,用自定义的中断处理程序替换原中断。
4.通过ICW1控制字允许8259A的IRQ0和IRQ1接收中断,开中断。
5.调用kbget取字符,若队列为空,则一直循环等待字符输入。
6.键盘中断产生后,在kbint中将有效输入字符存入队列。
7.若输入无效,则退出程序;若输入有效,但对比例句输入有误,则显示红色字符,若输入正确,则正常显示字符。
之后判断是否输入完一句,.若输入未完成,则继续等待字符输入;若输入完成,则显示输入所用的时间。
8显示出输入字符的个数和错误的个数
9.若五句都输入完成,则在显示错误个数后从第一句开始重新输入。
10.在整个程序运行过程中开中断的时候,每55ms执行一次定时器中断,在clint中计时。
3.4设计中遇到的问题及解决方法
1.统计输入错误个数时,发现如果例句未输完则错误个数显示正确,但是如果例句输完则错误个数总是少一个。
检查发现当每次输完一句话时会按回车,当例句未输完时输的这个回车是错误的,最后输出错误个数时应该减一,而例句输完时输的这个回车是正确的,最后输出错误个数就不用减一。
发现这个问题后我们对程序进行适当修改,避免了错误。
2.加新功能shift键时,中断程编写完后,运行程序时只要一按shift,屏幕上就会不停地出字符,当时吓了一跳赶紧关上了,然后仔细检查编写的中断程序没有发现问题,我开始怀疑原理有问题。
但是我又重新看了一下整个程序,终于发现问题所在。
在kbget里的kbflag是与0比较的,不是0的话返回。
之前kbflag只有0和80h两个值,所以程序正确。
而我改的中断程序中又赋予了kbflag新的值,所以kbget中应该与80h比较,是80h的话返回。
3.5新增功能及其实现方法
1.宏调用。
在程序的开始定义了一个宏,先设置好形参,在宏调用的时候把实参准备好即可。
本功能的作用在于给用户问好,并提示应如何使用该软件。
2.大写字符与上档字符输入功能。
根据读取的扫描码可判别是否按下了shift键,并把按动的状态记录在一个标志单元kbflag中。
按下right_shift键kbflag的第0位置1,按下left_shift键,kbflag的第1位置1,放开左或右shift键,kbflag恢复为0。
当kbflag的第0位或第1位为1时,再按下数字键或字母键,则应被转换为上档符号或大写字符,为此应再设一个字符转换表shiftab。
当未按动shift键时,所有按键通过scantab转换;当按下shift键时,按键应通过有相应上档符及大写字母的shiftab转换表。
3.统计打字错误数和总数。
定义了两个变量length1(总数)和length2(错误个数),每次调用dispchar或dispchar1后length1加一,每次kbget得到一个字符后与例句相同位置字符比较,不同则length2加一。
通过将例句首址给di,然后di+length1来确定与输入字符同位置的例句中的字符。
4.错误字符红色显示。
每次得到一个字符后与例句中相同位置比较,相同调用dispchar显示,不同调用dispchar1显示。
Dispchar1与dispchar不同之处就是其中的bx=2,则显示红色。
5.加入动画效果。
在开始测试打字前,欣赏一段动画,有利于放松心情,取得更好的成绩。
动画子程序原理:
用7个字符构造了一个小汽车,将这7个字符的ascii码,每个字符显示的类型,相对行及相对列放到一个表中,通过plot子程序能够将此小汽车画出。
画出之后调用dly延时程序让小汽车显示,之后调用erase程序将小汽车擦除,就是让其显示成黑色。
然后列数增加,再画出小汽车,再擦除。
这样不断向前,看上去就是小汽车在移动,直到列数达到80,返回主程序。
第四章设计体会
此次课程设计让我感受颇多,从拿到课题开始,我就下定决心投入大量精力对待这项任务。
之后查阅一些资料,对程序的每个细节有了更深入的了解,在反复看程序的过程中,大大加深了我对此程序的兴趣。
之后又根据程序本身加了几个新功能,还算是比较顺利,遇到的问题都能自行解决,这也大大的增加了我的信心。
通过此次课程设计,使我所学的知识得到了应用,全面的掌握了微型计算机与dos方式的工作原理、编程和使用方法。
加深和巩固对理论知识的更好掌握,进一步建立计算机应用系统体概念,初步掌握dos开发方法,为以后进行实际的软件开发奠定良好的基础。
附录
附录一程序流程图
附录二源程序
MENUMACROOP1,OP2,OP3;菜单显示宏定义
MOVAH,02H
MOVBH,00H
MOVDH,OP1
MOVDL,OP2
INT10H
MOVAH,09H
LEADX,OP3
MOVBH,0
MOVBL,0A4H
INT21H
ENDM
STACKSEGMENTPARASTACK'stack'
DB256DUP(0)
TOPLABELWORD
STACKENDS
DATASEGMENTPARAPUBLIC'data'
BUFFERDB16HDUP(0)
BUFPT1DW0
BUFPT2DW0
KBFLAGDB0
PROMPTDB'*pleasepractisetyping*',0DH,0AH,'$'
SCANTABDB0,0,'1234567890-=',8,0
DB'qwertyuiop[]',0DH,0
DB'asdfghjkl;',0,0,0,0
DB'zxcvbnm,./',0,0,0
DB'',0,0,0,0,0,0,0,0,0,0,0,0,0
DB'789-456+1230.'
EVEN
SHIFTABDB0,0,'!
@#$%^&*()_+',0,0
DB'QWERTYUIOP{}',0DH,0
DB'ASDFGHJKL:
"',0,0,0
DB'ZXCVBNM<>?
',0,0,0
DB'',26DUP(0)
EVEN
OLDCS9DW?
OLDIP9DW?
STR1DB'AbcDefGhiJklMnoPqrStuVwxyZ.'
DB0DH,0AH,'$'
STR2DB'Therearesomenewspapersonthetable.'
DB0DH,0AH,'$'
STR3DB'Therearesomecloudsinthesky.'
DB0DH,0AH,'$'
STR4DB'Shealwayseatsherlunchatnoon.'
DB0DH,0AH,'$'
STR5DB'Idonotlikeautumnandwinter.'
CRLFDB0DH,0AH,0AH,'$'
COLONDB':
','$'
EVEN
STRING1DB0DH,0AH,'THELENGTHOFTHESENTENCEIS:
','$'
STRING2DB0DH,0AH,'THEWRONGNUMBERSARE:
','$'
LENGTH1DW0
LENGTH2DW0
SADDRDWSTR1,STR2,STR3,STR4,STR5
COUNTDW0
SECDW0
MINDW0
HOURSDW0
SAVE_LCDW2DUP(?
)
ZKDB"HELLOTEACHER..WELCOMETOTEST$"
NODB"DATE:
2011/1/1$"
MEGDB"PRESSENTERKEYTOCONTINUE.......$"
MEG1DB"**********************************$"
MEG2DB"PRODUCER:
LvangSunweifeng$"
MEG3DB"NUMBER:
200800190133200800190175$"
MEG4DB"HOPETHATWEPLAYHAPPY!
$"
BUFADB200
DB?
DB200DUP(0)
BUFBDB200DUP(?
)
CARDB7;小汽车的字符图形表
DB52H,7,0,0
DB0B1H,7,0,1
DB0DBH,7,0,1
DB0DBH,7,0,1
DB4FH,7,1,0
DB4FH,7,0,-3
DB2,7,-2,1
CHARDW?
POINTERDW?
LINEDB?
COLDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
MAINPROCFAR
START:
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVES,AX
CALLQING
MENU05D,15D,ZK
MENU07H,15D,NO
MENU09D,15D,MEG
MENU11D,15D,MEG1
MENU13D,15D,MEG2
MENU15D,15D,MEG3
MENU17D,15D,MEG4
MOVAH,01H
INT21H
CMPAL,0DH
JESPEED3
CMPAL,20H
JEEXT
EXT:
CALLQICHE
MOVAH,4CH
INT21H
SPEED3:
MOVAH,35H
MOVAL,09H
INT21H
MOVOLDCS9,ES
MOVOLDIP9,BX
PUSHDS
MOVDX,SEGKBINT
MOVDS,DX
MOVDX,OFFSETKBINT
MOVAL,09H
MOVAH,25H
INT21H
POPDS
MOVAH,35H
MOVAL,1CH
INT21H
MOVSAVE_LC,BX
MOVSAVE_LC+2,ES
PUSHDS
MOVDX,SEGCLINT
MOVDS,DX
MOVDX,OFFSETCLINT
MOVAL,1CH
MOVAH,25H
INT21H
POPDS
INAL,21H
ANDAL,11111100B
OUT21H,AL
MOVAH,0
MOVAL,4
INT10H
FIRST:
MOVDX,OFFSETPROMPT
MOVAH,9
INT21H
MOVSI,0
NEXT:
MOVLENGTH1,0
MOVLENGTH2,0
MOVDX,SADDR[SI]
MOVAH,09H
INT21H
MOVCOUNT,0
MOVSEC,0
MOVMIN,0
MOVHOURS,0
STI
FOREVER:
CALLKBGET
TESTKBFLAG,80H
JNZENDINT
MOVDI,SADDR[SI]
ADDDI,LENGTH1
CMP[DI],AL
JZM1
PUSHAX
CALLDISPCHAR1
INCLENGTH2
JMPM2
M1:
PUSHAX
CALLDISPCHAR
M2:
POPAX
INCLENGTH1
CMPAL,0DH
JNZFOREVER
MOVAL,0AH
CALLDISPCHAR
CALLDISPTIME
LEADX,STRING1
MOVAH,09H
INT21H
DECLENGTH1
MOVAX,LENGTH1
CALLBINDEC
LEADX,STRING2
MOVAH,09H
INT21H
MOVAL,0DH
CMP[DI],AL
JZM3
DECLENGTH2
M3:
MOVAX,LENGTH2
CALLBINDEC
LEADX,CRLF
MOVAH,09H
INT21H
ADDSI,2
CMPSI,5*2
JNENEXT
JMPFIRST
ENDINT:
CLI
PUSHDS
MOVDX,SAVE_LC
MOVAX,SAVE_LC+2
MOVDS,AX
MOVAL,1CH
MOVAH,25H
INT21H
POPDS
PUSHDS
MOVDX,OLDIP9
MOVAX,OLDCS9
MOVDS,AX
MOVAL,09H
MOVAH,25H
INT21H
POPDS
STI
RET
MAINENDP
CLINTPROCNEAR
PUSHDS
MOVBX,DATA
MOVDS,BX
LEABX,COUNT
INCWORDPTR[BX]
CMPWORDPTR[BX],18
JNERETURN
CALLINCT
ADJ:
CMPHOURS,12
JLERETURN
SUBHOURS,12
RETURN:
POPDS
STI
IRET
CLINTENDP
INCTPROCNEAR
MOVWORDPTR[BX],0
ADDBX,2
INCWORDPTR[BX]
CMPWORDPTR[BX],60
JNEEXIT
CALLINCT
EXIT:
RET
INCTENDP
DISPTIMEPROCNEAR
MOVAX,MIN
CALLBINDEC
MOVBX,0
MOVAL,':
'
MOVAH,0EH
INT10H
MOVAX,SEC
CALLBINDEC
MOVBX,0
MOVAL,':
'
MOVAH,0EH
INT10H
MOVBX,COUNT
MOVAL,55D
MULBL
CALLBINDEC
RET
DISPTIMEENDP
BINDECPROCNEAR
MOVCX,100D
CALLDECDIV
MOVCX,10D
CALLDECDIV
MOVCX,1
CALLDECDIV
RET
BINDECENDP
DECDIVPROCNEAR
MOVDX,0
DIVCX
MOVBX,1H
ADDAL,30H
MOVAH,0EH
INT10H
MOVAX,DX
RET
DECDIVENDP
KBGETPROCNEAR
PUSHBX
CLI
MOVBX,BUFPT1
CMPBX,BUFPT2
JNZKBGET2
CMPKBFLAG,80H
JZKBGET3
STI
POPBX
JMPKBGET
KBGET2:
MOVAL,[BUFFER+BX]
INCBX
CMPBX,16
JCKBGET3
MOVBX,0
KBGET3:
MOVBUFPT1,BX
POPBX
RET
KBGETENDP
KBINTPROCFAR
PUSHBX
PUSHAX
;
INAL,60H
PUSHAX
INAL,61H
ORAL,80H
OUT61H,AL
ANDAL,7FH
OUT61H,AL
;
POPAX
CMPAL,2AH
JZKBINT5
CMPAL,36H
JZKBINT6
TESTAL,80H
JNZKBINT7
TESTKBFLAG,03H
JNZKBINT9
MOVBX,OFFSETSCANTAB
XLATSCANTAB
CMPAL,0
JNZKBINT4
MOVKBFLAG,80H
JMPKBINT2
KBINT5:
ORKBFLAG,02H
JMPKBINT2
KBINT6:
ORKBFLAG,01H
JMPKBINT2
KBINT9:
MOVBX,OFFSETSHIFTAB
XLATSHIFTAB
CMPAL,0
JNZKBINT4
MOVKBFLAG,80H
JMPKBINT2
KBINT4:
MOVBX,BUFPT2
MOV[BUFFER+BX],AL
INCBX
CMPBX,16
JCKBINT3
MOVBX,0
KBINT3:
CMPBX,BUFPT1
JZKBINT2
MOVBUFPT2,BX
KBINT7:
CMPAL,0AAH
JZKBINT8
CMPAL,0B6H
JZKBINT8
JMPKBINT2
KBINT8:
MOVKBFLAG,0
KBINT2:
CLI
MOVAL,20H
OUT20H,AL
POPAX
POPBX
STI
IRET
KBINTENDP
DISPCHARPROCNEAR
PUSHBX
MOVBX,7
MOVAH,0EH
INT10H
POPBX
RET
DISPCHARENDP
DISPCHAR1PROCNEAR
PUSHBX
MOVBX,2
MOVAH,0EH
INT10H
POPBX
RET
DISPCHAR1ENDP
QINGPROCNEA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 打字 练习 计时
![提示](https://static.bdocx.com/images/bang_tan.gif)