微机原理课程设计打字计时练习.doc
课程设计任务书学生姓名: 专业班级: 电气0805班 指导教师: 工作单位: 自动化学院 题 目: 打字计时练习 初始条件:掌握汇编语言程序设计方法,所设计的程序运行后可通过键盘控制,满足系统功能,并实现该系统设计方案。在DOS,windows,汇编软件环境下运行。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1. 程序运行后,键盘输入不同进行不同处理:a) ENTER表示开始,ESC表示退出,SPACE表示重新开始,打字过程中的按ENTER表示暂停并显示时间,再按ENTER表结束暂停b)统计打字的正确率,在打字练习时,如果输入正确,则字符为绿色,输入错误则为红色。2. 课程设计说明书应包括:a)设计任务及要求b)方案比较及认证c)程序设计基本思想,程序流程图,部分源程序及注解d)调试记录及结果分析e)参考资料f)附录:全部源程序清单g)总结时间安排:2011年元月07日-元月09日 选题、查阅资料和方案设计2011年元月10日-元月14日 编程2011年元月15日-元月16日 调试程序,改进与提高2011年元月17日 撰写课程设计报告(有调试过程及结果的截屏)2011年元月18日 答辩和交课程设计报告指导教师签名: 2011 年 元 月 6 日系主任(或责任教师)签名: 年 月 日摘 要在IBM-PC系统中,驻留的ROM中有8KB的BIOS。它实现对系统中种种常用设备的输入输出操作的管理。其中的16H中断调用即为键盘输入输出中断调用,实现从键盘输入字符到AL寄存器、读键盘缓冲区字符到AL寄存器、读取特殊功能键的状态等功能。微机原理及接口技术是计算机和自动化电气等专业重要的基础专业课程之一,不但有较高的理论水平,而且还要求能够将理论应用于实践,提高动手能力。本次课程设计的主要目的是提高实践能力,包括机器语言的使用,与8086配套的芯片的端口编程手段,ROM及BIOS所能提供的内部程序的功能和调用方法,以及中断处理程序和设备驱动程序的设计方法。本程序是一个在键盘上练习打字并能统计时间的程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间。通过它练习英文打字练习,并能够统计时间。程序运行时,使用自编的中断向量处理程序。 目 录1 方案比较及认证12 打字计时练习程序设计过程 2 21 程序设计基本思想 222 程序流程图32. 3 部分原程序及注解 43 调用记录及结果分析 64 总结体会8参考文献9附录:打字计时练习程序10打字计时练习设计一个打字计时练习的程序,在缓冲区中预放了一些字母,运行时,可按照屏幕上显示的字母输入练习,每输入完一行按回车键后,可显示出练习输入的时间.1 方案比较及认证方案一:采用调用时间中断向量来记录打字练习的时间,在输入ENTER键时,显示完成当前句子所用的时间。在显示键入的字符时,还应判断是否为回车符,说明一个句子输入完毕,此时调用显示时间子程序显示出打字时间,然后顺序显示下一个语句。如果所放的例句都已显示完毕,则再次从第一个例句开始显示,直到键入某一功能键退出程序,结束打字练习。方案二:在计时的基础上,采用光标定位程序来实现缓冲区数据和输出数据的比较,从而在显示打字时间的同时显示的正确率。在显示键入的字符时,先判断是否是相应的功能键,如是则完成相应的功能,不是功能键,则和上一行相应位置的字符比较,采用不同的子程序分别统计正确个数,和总打字数,并用不同的颜色显示输入正确的字符和不正确的字符。综合考虑,第二种方案功能比较完善,故采用第二种方案进行设计。2 打字计时练习程序设计过程2.1程序设计基本思想在键盘上练习的打字例句及其地址表等预先放在DATA数据段中。在宏定义部分定义光标定位程序MOVTO,字符输出程序OUPUT等,以便在程序运行时,能够准备定位光标到指定位置,以便进行比较,同时能够便捷地将打字例句显示在键面上。程序运行时,键面上出现提示,按ANYKEY开始打字,按ESC退出。输入ESC则出现提示,按SPACE重新开始,按ESC退出界面。如输入SPACE则将字符统计和计时都清零并重新开始计时,光标定位至打字入口。如输入ESC则退出打字界面。如开始打字,则调用OUTPUT将缓冲区的打字例句输出到界面上,然后将光标定位到打字部位,然取输入的字符和ENTER过行比较,如是ENTER,则打字暂停,并显示当前打字所用的时间,再按ENTER则继续打字。否则和上一行的相应位置的字过行比较,如果正确,则字符设为绿色;错误,则显示字符为红色,并用相应的变量记录打字的正确个数和输入的总字符数,并显示在界面上。设置一行为47个字符,满47个后自动换行。如果所存放的例句都已练习完毕,则相当于输入ESC,界面上出现提示,按ANYKEY开始打字,按ESC退出。开始判断是否是ESC键显示预设的句子读取键入字符,存有输入字符数的寄存器加1判断键入字符是否与输出序列一致存有正确数的寄存器加1判断本段字符是否 输入完毕结束NYNY2.2程序流程图2.3部分源程序及注解光标定位子程序:PRINT MACRO P1,P2 ;输出“*”到光标位置显示字符及其属性PUSH AXPUSH BXPUSH CXMOV AH, 09HMOV AL, P1MOV BH, 0 ;BH=显示页MOV BL, P2MOV CX, 1 ; CX=字符重复总次数INT 10HPOP CXPOP BXPOP AXENDM在程序中,此宏定义程序用来清屏。计时子程序TIME PROCPUSH AXPUSH DXMAIN:MOV AH, 2INT 1AH ;读实时钟CMP DH, SECONTJNE GETJMP NEXTGET:开始DH=0?秒COUNT3COUNT3+1分COUNT4COUNT4+1COUNT30COUNT3=60?COUNT4=60?时COUNT5COUNT55+1COUNT40结束NYYYNN MOV SECONT,DHINC COUNT3MOV AX, COUNT3CMP AX, 60JNE NEXT MOV COUNT3, 0INC COUNT4MOV AX, COUNT4CMP AX, 60JNE NEXTMOV COUNT4, 0INC COUNT5NEXT:POP DXPOP AXRETTIMEENDP3调试记录及结果分析在微机原理实验平台开发环境中编辑程序,经汇编,连接,和调试后,结果如下按照提示,按下ENTER后,出现如下界面练习打字过程显示如下图所示按下ESC后的界面如下总结体会到这一刻为止,微机课设就接近尾声了,有兴奋,也有惶恐,兴奋任务终于完成了,同时也很担心,自己还站在汇编语言的门口,只是一个初学者。在课程设计的过程中,深刻地觉得汇编语言真的是很神奇,不过这也从侧面说明自己对汇编语言了解的不多。我一直觉得微机原理与接口技术是一门佶屈聱牙的课程,然而通过两周的翻阅资料和摸索,我发现它并不是那么难,任何一个计算机系统都是一个复杂的整体,学习计算机原理是要涉及到整体的每一部分。只要弄清楚各部分原理,就能较好的理解计算机的工作原理,从而通过编程来达到自己的目的。 由于身体原因,这门课的理论课我只上了一半,所以刚开始着手课程设计的时候,我什么也看不懂,经过很多次的尝试,终于能够看懂程序,并对程序的功能进行改进。看着自己的设想一点一点的变成汇编语言并运行出来时,心里真的很高兴,同时也更加投入到程序的编辑和完善。但是自己掌握的东西毕竟有限,最后还是不能完全实现自己的设想,所以,在以后的生活中,我们要加强对汇编语言的学习。总之,这次课程设计让人受益匪浅,使我我更加深入地理解了微机原理课程上讲到的各种芯片的功能,以及中断调用,同时加深了对于主要芯片的应用的认识,同时也更加清楚了汇编程序的编写过程和运行过程。这不仅加深和巩固了我们的课本知识,而且增强了我们自己动脑,自己动手的能力。参考文献1楼顺天.微机原理与接口技术M. 北京:科学出版社,20062周明德.微机原理与接口技术. 北京:人民邮电出版社,20093马维华.微机原理与接口技术. 北京:科学出版社,20054马瑞芳.王会燃等.微机原理与接口技术要点与解题. 西安:西安交通大学出版社,20065牟琦.聂建平等.微机原理与接口技术. 北京:清华大学出版社,2006附录:打字计时练习程序LF EQU 0AHCR EQU 0DH ;宏定义部分PRINT MACRO P1,P2 ;输出“*”光标位置显示字符及其属性 BH=显示页,BL=属性,AL=字符,CX=字符重复总次数PUSH AXPUSH BXPUSH CXMOV AH, 09HMOV AL, P1MOV BH, 0 MOV BL, P2MOV CX, 1INT 10HPOP CXPOP BXPOP AXENDMMOVTO MACRO P1,P2 ;移动光标到指定位置PUSH AXPUSH DXMOV AH, 2MOV DH, P1 ;行MOV DL, P2 ;列INT 10HPOP DXPOP AXENDMOUTPUT MACRO MSG,P1,P2,P3 ;输出字符串LOCAL DIFFER, EXITOFPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV DH, P2MOV DL, P3MOV BH, 0 MOV BL, P1 MOV DI, 0DIFFER:MOV AH, 02HINT 10HMOV CL, MSG DICMP CL, '$'JE EXITOF MOV AH, 9 MOV AL, MSG DI MOV CX, 1 INT 10H INC DI INC DL JMP DIFFEREXITOF: POP DI POP DX POP CX POP BX POP AX ENDM DATA SEGMENT ;显示窗口内容MSG1 DB 'PRESS "ANY KEY" TO START!$' MSG2 DB 'PRESS "ESC" TO END! $' MSG3 DB 'THE PASSED TIME:$' MSG4 DB 'THE RATE OF CORRECT:$' MSG5 DB 'PRESS "BACKSPACE" TORESTART!$' MSG6 DB 'PRESS " ESC" TO OUT! $'MSG7 DB 'ABCDEFG HIJKLMN OPQRST UVWXYZ NOW YOU SEE,I CAN$'MSG8 DB 'EVERY ONCEIN A WHILE I AWAKEN TO REALITY THAT00$'MSG9 DB 'I AM ALL I HAVE GOT.IT IS FAR MORE MPRESSIVE.$'MSG10 DB 'WHEN THE OTHERS DISCOVER YOUR GOOD.BELIEVE IT O$'SECONT DB 0 COUNT0 DW 0 ;为了记录正确的字符数COUNT1 DW 0 ;字符总个数COUNT2 DW 0 ;为了到行尾时自动翻行的控制COUNT3 DW 0;秒COUNT4 DW 0;分COUNT5 DW 0;时COUNT6 DB 2DATA ENDSSTACK SEGMENT DW 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, SS:STACK, DS:DATA;*START PROC FAR PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX CALL SHUCHU_TISHI ;输出提示信息LZ:MOV AH, 1 ;带回显的键盘输入INT 21HMOV BL, AL ;AL=输入的字符CMP AL,1BH ;判断是否要退出打字练习程序 JE TZD_1 MOV DH,2 MOV DL,1JMP LOOP1TZD_1: ;跳转点到“EXIT”JMP TZD_2 LOOP1:MOVTO DH,DL PRINT '',0 INC DL CMP DL,69 JB LOOP1 开始打字练习*DAZIRUKOU:MOV DL, 1 ;显示正确率*DAZI1:PUSH DX MOV DH, 1MOV DL, 1OUTPUT MSG7,10,DH,DLADD DH,3OUTPUT MSG8,10,DH,DLADD DH,3OUTPUT MSG9,10,DH,DLADD DH,3OUTPUT MSG10,10,DH,DLMOV AH, 0INT 1AH ;读时钟PRACTISE: MOV DH, 22MOV DL, 0OUTPUT MSG4, 9, DH, DLMOV DH, 22MOV DL,25MOVTO DH, DLMOV AX, COUNT0CALL BINDECMOV AH, 2MOV DL, '/'INT 21HMOV AX, COUNT1 CALL BINDECPOP DXJMP PRESS;*PRESS: CALL TIME ;调用时间 MOVTO DH, DLMOV AH, 01H ;读缓冲区字符INT 16HJNE KEY ;测试有无键盘按下JMP PRESSKEY:MOV AH, 00INT 16HCMP AL,CR ;如果是回车就暂停并显示当前时间JE PAUSEJMP ISESCPAUSE: ;输入是回车就结束暂停 CALL NEXT4PUSH DXMOV AH, 06HMOV DL, 0FFHINT 21HPOP DXCMP AL, CRJNE PAUSE MOV DX,COUNT2 INC DL MOV DH,COUNT6 MOVTO DH,DLISESC: CMP AL, 1BH JE TZD_2 JMP ISEQUALTZD_DAZI2:JMP DAZI1TZD_2: JMP SKIP1TZD_DAZI1: ;跳转点,到“打字”JMP TZD_DAZI2ISEQUAL: MOV BL, ALCMP AL, 19HJB WRONGCMP AL, 7FHJA WRONGINC COUNT2INC COUNT1 ;是上面的字符,则COUNT1加1SUB DH, 1MOVTO DH, DLMOV AH, 8 ;读得光标处字符送到AL中INT 10HCMP AL, BLJE EQUALMOV AL, BLMOV BL, 12JMP UNEQUALWRONG:TZD_DAZI0:JMP TZD_DAZI1EQUAL:INC COUNT0MOV AL, BLMOV BL, 10UNEQUAL:ADD DH ,1MOVTO DH, DLMOV AH, 9MOV CX, 1INT 10HINC DLMOV AX, COUNT2CMP AL, 47JB TZD_DAZI0MOV AH, COUNT6CMP AH, 9ja SKIP1SUB AX, 47MOV COUNT2, AXADD COUNT6,3ADD DH,3MOV DL,1MOVTO DH,DLREFLESH: ;满一行后自动刷新(47个字符)MOV AH, 7INT 21HPRACTISE1: JMP LOOP1PRACTISE0:JMP PRACTISESKIP1: MOV DH, 16 MOV DL, 28 OUTPUT MSG5, 10, DH, DL ADD DH, 2 OUTPUT MSG6, 10, DH, DL JMP RESTARTPRACTICE:JMP LZRESTART: MOV AH, 00 INT 16H ;从键盘读字符 CMP AL, 20HMOV SECONT, 0 MOV COUNT0, 0 MOV COUNT1, 0 MOV COUNT2, 0 MOV COUNT3, 0 MOV COUNT4, 0 MOV COUNT5, 0 MOV COUNT6, 2 JE PRACTICE CMP AL, 1BH JE EXITNONE:NOP JMP RESTARTEXIT: MOV AH, 0MOV AL, 3INT 10H MOV AH, 4CH INT 21H RETSTART ENDP;输出提示信息*SHUCHU_TISHI PROC ADD DH, 15 ADD DL, 5 OUTPUT MSG1, 5, DH, DL ADD DH, 2 ADD DL, 2 OUTPUT MSG2, 5, DH, DL RETSHUCHU_TISHI ENDP;将2进制数转换成10进制数*BINDEC PROC NEAR MOV CX,10D ;显示十位CALL DECDIV MOV CX,1 ;显示个位CALL DECDIV RET BINDEC ENDP DECDIV PROC NEAR ;转化成字符显示MOV DX, 0 DIV CX MOV BX ,0 ADD AL,30H ;转换成ASCIIMOV AH,0EH INT 10H ;显示一个字符MOV AX,DX RET DECDIV ENDP;*时间*TIME PROCPUSH AXPUSH DXMAIN:MOV AH, 2INT 1AH ;读实时钟CMP DH, SECONTJNE GETJMP NEXTGET: MOV SECONT, DHINC COUNT3MOV AX, COUNT3CMP AX, 60JNE NEXTMOV COUNT3, 0INC COUNT4MOV AX, COUNT4CMP AX, 60JNE NEXTMOV COUNT4, 0INC COUNT5NEXT:POP DXPOP AXRETTIMEENDPNEXT4 PROCMOV DH, COUNT6MOV DL, 48OUTPUT MSG3, 9, DH, DL add DL, 21MOVTO DH, DLMOV AX, COUNT5CALL BINDECMOV AH, 2MOV DL, ':'INT 21HMOV AX, COUNT4CALL BINDECMOV AH, 2MOV DL, ':'INT 21HMOV AX, COUNT3CALL BINDECRETNEXT4 ENDP;* CODE ENDS END START