ImageVerifierCode 换一换
格式:DOC , 页数:22 ,大小:153KB ,
资源ID:4358014      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-4358014.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(微机原理课程设计打字练习计时.doc)为本站会员(hyngb9260)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

微机原理课程设计打字练习计时.doc

1、打字练习计时程序微 机 原 理 课 程 设 计 书院别 电气工程学院 专业 电气工程及其自动化 班级 题目 打字计时程序 学生 学号 同组者 2011 年 1 月 7 日打字练习计时程序目 录第一章 设计要求 11.1 设计任务 .11.2 设计要求 .11.3 设计目的 .1第二章 设计环境 1DOS 中断介绍 1第三章 课题设计 33.1 硬件设计 .33.2 软件设计 .33.3 系统运行过程描述 .43.4 设计中遇到的问题及解决方法 53.5 新增功能及其实现方法 5第四章 设计体会 6附录 6附录一 程序流程图 .6附录二 源程序 .8打字练习计时程序 第 1 页 共 20 页第一

2、章 设计要求1.1 设计任务利用 PC 机键盘和时间中断、字符显示实现打字练习程序。1.2 设计要求1) 自行编制键盘中断和时间中断处理程序,并保存原中断向量,程序运行时,使用自编的中断向量处理程序,程序退出时,恢复中断向量;2) 在缓冲区中预放了一些字母,程序运行时,可按照屏幕上显示的小写字母进行输入练习;3) 每输入完一行按回车键后,可显示出练习输入的时间。4)自行添加若干功能。1.3 设计目的熟悉与掌握有关键盘和时间的中断及字符显示技术。第二章 设计环境DOS 中断介绍使用 DOS 提供的程序控制硬件。优点是兼容性好,使用方便。DOS 是 IBM PC 系列微机的操作系统(现在的微机仍能

3、运行 DOS,而且新的操作系统也能继续提供几乎所有的 DOS 功能调用)负责管理系统的所有资源,协调微机的操作,其中包括大量可供用户调用的服务程序。DOS 的功能调用不依赖于具体的硬件系统。所有的 DOS 系统功能调用都是利用软件中断指令 INT 21H 来实现的。也打字练习计时程序 第 2 页 共 20 页就是说,在程序中需要调用 DOS 功能的时候,只要使用一条 INT 21H 指令即可。INT 21H 是一个具有 90 多个子功能的中断服务程序,这些子功能大致可以分为四类:设备管理、目录管理、文件管理和其他。其功能一览表可参见附录。为了方便用户使用这些子功能,INT 21H 对每一个子功

4、能都进行了编号称为功能号。这样,用户就能通过指定功能号来调用 INT 21H 的不同子功能。DOS 系统功能调用的方法如下:1) -功能号。2) 在其他寄存器中放入该功能所要求的人口参数。3) 在执行 INT 21H 指令。4) 分析出口参数。用户程序与 DOS、BIOS 和硬件的关系见图应 用程 序 DOS BIOS 硬 件打字练习计时程序 第 3 页 共 20 页第三章 课题设计3.1 硬件设计通过将从 8259A 的 INT 端与主 8259A 的 IRQ2 相连来实现两片 8259A 的级联,主 8259A 的 IRQ0 接收 8254 的 55ms 定时器中断,IRQ1 接收键盘中断

5、。主8259A 的 INT 端与 CPU 相连。3.2 软件设计在键盘上练习的打字例句及其地址表、计时单元等预先放在 DATA 数据段中。自编的中断程序 kbint 检测按键时产生的中断,并把按键的扫描码转换为ASCII 码存入缓存区 BUFFER(内存中的一个区域) ,这个工作和 EOM 09 类型的键盘中断例行程序所完成的工作大致相同,只是在解释各个键时作了简化,既只解释了可显示字符(入英文小写字母、数字及一些字符) ,其他特殊键(如组合键、双态键、功能键等)都未做解释,只作字符码 0 来处理。在主程序部分保存原有 09 类型的中段向量,设置自编例行程序的中断向量,设置中断屏蔽位,然后开中

6、断。当键盘中断处理后,主程序安排指令读取缓存区中的字符并显示在屏幕上。在主程序的末尾,利用 DOS 功能恢复原 09 类型的中断向量,然后返回 DOS。打字练习计时程序 第 4 页 共 20 页在显示键入的字符时,还应判断字符是否为回车符(0DH) 。如为回车符,说明一个句子输入完毕,此时调用显示时间的子程序显示出打字时间,然后顺序显示一个例句。如果所存放的例句都已显示完毕,则再次从第一个例句开始显示,直至键入某一个功能(如 Esc 键、Shift 键等)退出程序,结束打字练习。打字时间统计利用自编的定时器中断处理程序 Clint 来完成。每输入一个例句,计时一次。在此中断例行程序中,定时器中

7、断的次数记录在计数单元 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.程序运行开

8、始,设置堆栈段与数据段。然后调用定义过的宏定义,以显示一个用户欢迎和提示操作界面。2.清屏,调用显示动画的子程序,显示一段动画效果。3.关中断,然后保存 09H 和 1CH 中断向量到自设的单元中,用自定义的中断处理程序替换原中断。4.通过 ICW1 控制字允许 8259A 的 IRQ0 和 IRQ1 接收中断,开中断。5.调用 kbget 取字符,若队列为空,则一直循环等待字符输入。6.键盘中断产生后,在 kbint 中将有效输入字符存入队列。7.若输入无效,则退出程序;若输入有效,但对比例句输入有误,则显示红色字符,若输入正确,则正常显示字符。之后判断是否输入完一句,.若输入未完成,则继续

9、等待字符输入;若输入完成,则显示输入所用的时间。8 显示出输入字符的个数和错误的个数9.若五句都输入完成,则在显示错误个数后从第一句开始重新输入。10.在整个程序运行过程中开中断的时候,每 55ms 执行一次定时器中断,在 clint 中计时。打字练习计时程序 第 5 页 共 20 页3.4 设计中遇到的问题及解决方法1.统计输入错误个数时,发现如果例句未输完则错误个数显示正确,但是如果例句输完则错误个数总是少一个。检查发现当每次输完一句话时会按回车,当例句未输完时输的这个回车是错误的,最后输出错误个数时应该减一,而例句输完时输的这个回车是正确的,最后输出错误个数就不用减一。发现这个问题后我们

10、对程序进行适当修改,避免了错误。 2.加新功能 shift 键时,中断程编写完后,运行程序时只要一按 shift,屏幕上就会不停地出字符,当时吓了一跳赶紧关上了,然后仔细检查编写的中断程序没有发现问题,我开始怀疑原理有问题。但是我又重新看了一下整个程序,终于发现问题所在。在 kbget 里的 kbflag 是与 0 比较的,不是 0 的话返回。之前 kbflag 只有 0 和 80h 两个值,所以程序正确。而我改的中断程序中又赋予了kbflag 新的值,所以 kbget 中应该与 80h 比较,是 80h 的话返回。3.5 新增功能及其实现方法1.宏调用。在程序的开始定义了一个宏,先设置好形参

11、,在宏调用的时候把实参准备好即可。本功能的作用在于给用户问好,并提示应如何使用该软件。2.大写字符与上档字符输入功能。根据读取的扫描码可判别是否按下了shift 键,并把按动的状态记录在一个标志单元 kbflag 中。按下 right_shift 键kbflag 的第 0 位置 1,按下 left_shift 键,kbflag 的第 1 位置 1,放开左或右 shift键,kbflag 恢复为 0。当 kbflag 的第 0 位或第 1 位为 1 时,再按下数字键或字母键,则应被转换为上档符号或大写字符,为此应再设一个字符转换表 shiftab。当未按动 shift 键时,所有按键通过 sca

12、ntab 转换;当按下 shift 键时,按键应通过有相应上档符及大写字母的 shiftab 转换表。3.统计打字错误数和总数。定义了两个变量 length1(总数)和 length2(错误个数) ,每次调用 dispchar 或 dispchar1 后 length1 加一,每次 kbget 得到一个字符后与例句相同位置字符比较,不同则 length2 加一。通过将例句首址给 di,然后 di+length1 来确定与输入字符同位置的例句中的字符。4.错误字符红色显示。每次得到一个字符后与例句中相同位置比较,相同调用 dispchar 显示,不同调用 dispchar1 显示。Dispcha

13、r1 与 dispchar 不同之处就是其中的 bx=2,则显示红色。打字练习计时程序 第 6 页 共 20 页5.加入动画效果。在开始测试打字前,欣赏一段动画,有利于放松心情,取得更好的成绩。动画子程序原理:用 7 个字符构造了一个小汽车,将这 7 个字符的 ascii 码,每个字符显示的类型,相对行及相对列放到一个表中,通过plot 子程序能够将此小汽车画出。画出之后调用 dly 延时程序让小汽车显示,之后调用 erase 程序将小汽车擦除,就是让其显示成黑色。然后列数增加,再画出小汽车,再擦除。这样不断向前,看上去就是小汽车在移动,直到列数达到80,返回主程序。第四章 设计体会此次课程设

14、计让我感受颇多,从拿到课题开始,我就下定决心投入大量精力对待这项任务。之后查阅一些资料,对程序的每个细节有了更深入的了解,在反复看程序的过程中,大大加深了我对此程序的兴趣。之后又根据程序本身加了几个新功能,还算是比较顺利,遇到的问题都能自行解决,这也大大的增加了我的信心。通过此次课程设计,使我所学的知识得到了应用,全面的掌握了微型计算机与 dos 方式的工作原理、编程和使用方法。加深和巩固对理论知识的更好掌握,进一步建立计算机应用系统体概念,初步掌握 dos 开发方法,为以后进行实际的软件开发奠定良好的基础。打字练习计时程序 第 7 页 共 20 页附录附录一 程序流程图打字练习计时程序 第

15、8 页 共 20 页保存原中断向量 09H 到自设的单元中设置自定义处理程序的中断向量 09H保存原中断向量 1CH 到自设的单元中设置自定义处理程序的中断向量 1CH设置允许键盘和定时器中断设置显示方式为 8025显示提示信息在屏幕上显示例句初使化变量 count、sec、min、hours开始中断调用 kbget 检测并等待键盘中断的子程序kbflag=80h?(键盘输入的是控制键或功能键吗)调用 dispchar 显示该字符键入的字符为回车符 0DHAL换行符(0AH)调用 dispchar 显示回车换行符字符调用 disptime 显示打字时间显示回车换行符字符5 个例句都练习完了吗?

16、开始恢复原中断向量1CH、09H,返回操作系统结束NYNYY打字练习计时程序 第 9 页 共 20 页附录二 源程序MENU MACRO OP1,OP2,OP3 ;菜单显示宏定义MOV AH,02HMOV BH,00HMOV DH,OP1MOV DL,OP2INT 10HMOV AH,09HLEA DX,OP3MOV BH,0MOV BL,0A4HINT 21HENDMSTACK SEGMENT PARA STACK stackDB 256 DUP(0)TOP LABEL WORDSTACK ENDSDATA SEGMENT PARA PUBLIC dataBUFFER DB 16H DUP(

17、0)BUFPT1 DW 0BUFPT2 DW 0KBFLAG DB 0PROMPT DB *please practise typing*,0DH,0AH,$SCANTAB DB 0,0,1234567890-=,8,0DB qwertyuiop,0DH,0DB asdfghjkl;,0,0,0,0DB zxcvbnm,./,0,0,0DB ,0,0,0,0,0,0,0,0,0,0,0,0,0DB 789-456+1230.EVEN SHIFTAB DB 0,0,!#$%小汽车的字符图形表 DB 52H,7,0,0 DB 0B1H,7,0,1 DB 0DBH,7,0,1 DB 0DBH,7,0

18、,1 DB 4FH,7,1,0 DB 4FH,7,0,-3 DB 2,7,-2,1 CHAR DW ? POINTER DW ? LINE DB ? COL DB ? DATA ENDSCODE SEGMENT打字练习计时程序 第 11 页 共 20 页ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKMAIN PROC FARSTART:MOV AX,STACKMOV SS,AXMOV SP,OFFSET TOPPUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXCALL QINGMENU 05D,15D,ZK

19、MENU 07H,15D,NOMENU 09D,15D,MEGMENU 11D,15D,MEG1MENU 13D,15D,MEG2MENU 15D,15D,MEG3MENU 17D,15D,MEG4MOV AH,01H INT 21HCMP AL,0DHJE SPEED3CMP AL,20HJE EXTEXT: CALL QICHEMOV AH,4CHINT 21HSPEED3: MOV AH,35HMOV AL,09HINT 21HMOV OLDCS9,ESMOV OLDIP9,BXPUSH DSMOV DX,SEG KBINTMOV DS,DXMOV DX,OFFSET KBINTMOV

20、AL,09HMOV AH,25H打字练习计时程序 第 12 页 共 20 页INT 21HPOP DSMOV AH,35HMOV AL,1CHINT 21HMOV SAVE_LC,BXMOV SAVE_LC+2,ESPUSH DSMOV DX,SEG CLINTMOV DS,DXMOV DX,OFFSET CLINTMOV AL,1CHMOV AH,25HINT 21HPOP DSIN AL,21HAND AL,11111100BOUT 21H,ALMOV AH,0MOV AL,4INT 10HFIRST: MOV DX,OFFSET PROMPTMOV AH,9INT 21HMOV SI,0

21、NEXT: MOV LENGTH1,0MOV LENGTH2,0MOV DX,SADDRSIMOV AH,09HINT 21HMOV COUNT,0MOV SEC,0MOV MIN,0MOV HOURS,0STI打字练习计时程序 第 13 页 共 20 页FOREVER:CALL KBGETTEST KBFLAG,80HJNZ ENDINTMOV DI,SADDRSIADD DI,LENGTH1CMP DI,ALJZ M1PUSH AXCALL DISPCHAR1INC LENGTH2JMP M2M1: PUSH AXCALL DISPCHARM2: POP AXINC LENGTH1CMP

22、AL,0DHJNZ FOREVERMOV AL,0AHCALL DISPCHARCALL DISPTIMELEA DX,STRING1MOV AH,09HINT 21HDEC LENGTH1MOV AX,LENGTH1CALL BINDEC LEA DX,STRING2MOV AH,09HINT 21HMOV AL,0DHCMP DI,ALJZ M3DEC LENGTH2M3: MOV AX,LENGTH2CALL BINDEC LEA DX,CRLF MOV AH,09H INT 21H 打字练习计时程序 第 14 页 共 20 页ADD SI,2CMP SI,5*2JNE NEXTJMP

23、FIRSTENDINT: CLIPUSH DSMOV DX,SAVE_LCMOV AX,SAVE_LC+2MOV DS,AXMOV AL,1CHMOV AH,25HINT 21HPOP DSPUSH DSMOV DX,OLDIP9MOV AX,OLDCS9MOV DS,AXMOV AL,09HMOV AH,25HINT 21HPOP DSSTIRETMAIN ENDPCLINT PROC NEARPUSH DSMOV BX,DATAMOV DS,BXLEA BX,COUNTINC WORD PTRBXCMP WORD PTRBX,18JNE RETURNCALL INCTADJ:CMP HOU

24、RS,12JLE RETURNSUB HOURS,12RETURN:POP DSSTI打字练习计时程序 第 15 页 共 20 页IRETCLINT ENDPINCT PROC NEARMOV WORD PTRBX,0ADD BX,2INC WORD PTRBXCMP WORD PTRBX,60JNE EXITCALL INCTEXIT: RETINCT ENDPDISPTIME PROC NEARMOV AX,MINCALL BINDECMOV BX,0MOV AL,:MOV AH,0EHINT 10HMOV AX,SECCALL BINDECMOV BX,0MOV AL,:MOV AH,0

25、EHINT 10HMOV BX,COUNTMOV AL,55DMUL BLCALL BINDECRETDISPTIME ENDPBINDEC PROC NEARMOV CX,100DCALL DECDIVMOV CX,10DCALL DECDIVMOV CX,1CALL DECDIVRETBINDEC ENDPDECDIV PROC NEAR打字练习计时程序 第 16 页 共 20 页MOV DX,0DIV CXMOV BX,1HADD AL,30HMOV AH,0EHINT 10HMOV AX,DXRETDECDIV ENDPKBGET PROC NEARPUSH BXCLIMOV BX,B

26、UFPT1CMP BX,BUFPT2JNZ KBGET2CMP KBFLAG,80HJZ KBGET3STIPOP BXJMP KBGETKBGET2: MOV AL,BUFFER+BXINC BXCMP BX,16JC KBGET3MOV BX,0KBGET3: MOV BUFPT1,BXPOP BXRETKBGET ENDPKBINT PROC FARPUSH BXPUSH AX;IN AL,60HPUSH AXIN AL,61HOR AL,80HOUT 61H,ALAND AL,7FHOUT 61H,AL;POP AX打字练习计时程序 第 17 页 共 20 页CMP AL,2AHJZ

27、KBINT5CMP AL,36HJZ KBINT6TEST AL,80HJNZ KBINT7TEST KBFLAG,03H JNZ KBINT9MOV BX,OFFSET SCANTABXLAT SCANTABCMP AL,0JNZ KBINT4MOV KBFLAG,80HJMP KBINT2KBINT5: OR KBFLAG,02HJMP KBINT2KBINT6: OR KBFLAG,01HJMP KBINT2KBINT9: MOV BX,OFFSET SHIFTABXLAT SHIFTABCMP AL,0JNZ KBINT4MOV KBFLAG,80HJMP KBINT2KBINT4:

28、MOV BX,BUFPT2MOV BUFFER+BX,ALINC BXCMP BX,16JC KBINT3MOV BX,0KBINT3: CMP BX,BUFPT1JZ KBINT2MOV BUFPT2,BXKBINT7: CMP AL,0AAHJZ KBINT8CMP AL,0B6HJZ KBINT8JMP KBINT2KBINT8: MOV KBFLAG,0KBINT2: CLIMOV AL,20H打字练习计时程序 第 18 页 共 20 页OUT 20H,ALPOP AXPOP BXSTIIRETKBINT ENDPDISPCHAR PROC NEARPUSH BXMOV BX,7MOV

29、 AH,0EHINT 10HPOP BXRETDISPCHAR ENDPDISPCHAR1 PROC NEARPUSH BXMOV BX,2MOV AH,0EHINT 10HPOP BXRETDISPCHAR1 ENDPQING PROC NEAR MOV AH,6 MOV AL,0 MOV CX,0 MOV DH,24 MOV DL,79 MOV BH,7 INT 10H MOV AH,02HMOV BH,00HMOV DH,00HMOV DL,00HINT 10HRET QING ENDP DLY PROC NEAR PUSH CX PUSH DX MOV DX,10000 DL1: MO

30、V CX,6801 DL2: LOOP DL2 DEC DX 打字练习计时程序 第 19 页 共 20 页JNZ DL1 POP DX POP CX RET DLY ENDP QICHE PROC NEAR MOV AH,0 MOV AL,02 INT 10H CALL QING LEA DI,CAR MOV DH,5 MOV DL,0 CALL MOVE RET QICHE ENDP MOVE PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AH,0FH INT 10H MOV CH,0 MOV CL,DI INC DI MOV C

31、HAR,CX MOV POINTER,DI MOV LINE,DH MOV COL,DL PLOT_NEXT: ADD DH,DI+2 ADD DL,DI+3 CMP DL,80 JB MOV_CRSR Pop DI Pop DX Pop CX Pop BX Pop AX RET MOV_CRSR: MOV AH,2 打字练习计时程序 第 20 页 共 20 页INT 10H MOV AL,DI MOV BL,DI+1 MOV AH,09 INT 10H ADD DI,4 LOOP PLOT_NEXT CALL DLY CALL ERASE JMP SHORT PLOT_NEXT MOVE ENDP ERASE PROC NEAR MOV CX,CHAR MOV DI,POINTER MOV DH,LINE MOV DL,COL ERASE_NEXT: ADD DH,DI+2 ADD DL,DI+3 MOV AH,2 INT 10H MOV AL,DI MOV BL,0 PUSH CX MOV CX,1 MOV AH,9 INT 10H POP CX ADD DI,4 LOOP ERASE_NEXT MOV CX,CHAR MOV DI,POINTER MOV DH,LINE INC COL MOV DL,COL RET ERASE ENDP CODE ENDSEND START

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报