《微机原理与接口技术课程设计打字练习程序.doc》由会员分享,可在线阅读,更多相关《微机原理与接口技术课程设计打字练习程序.doc(19页珍藏版)》请在三一办公上搜索。
1、 信息科学与技术学院 微机原理与接口技术课程设计课 题 名 称: 打 字 练 习 程 序 学 生 姓 名: 学 号: 专业 、年级: 指 导 教 师: 时 间: 1、题目及要求:1.1、题目:打字练习程序 1.2、要求: 1)、缓冲区中预放了一些字母2)、运行时,可按照屏幕上显示的字母输入练习3)、当按结束,可显示出练习输入的时间,并且能显示出正确率。4)、要求界面美观。2、功能设计: 2.1、功能模块:主程序模块-主要是随机产生字符并将字符送入缓冲区,调用其他子程序和宏设置窗口及时间、字符总数和正确个数。打字结果计算与显示模块( UseTimeAndOut,RightRata_out)-主要
2、计算所用时间及正确率并输出。设置字符颜色模块(clew_char)-主要设置打字时缓冲区字符和打字区字符的颜色,包括错误时字符的颜色显示。字符满行处理模块(isFullLine)-主要功能是当字符输入满行时进行换行。输出模块(OutTime,btod_out)-输出程序运行时的时间。统计模块(Tongji)-统计字符个数和正确个数并记录时间。宏的作用: 清屏(Clear)- 用于按要求清理屏幕(不同颜色),以便产生想要的窗口。 设置光标位置(SETGB)-用于移动光标位置,以便按要求输出。读光标位置(READGB)-用于读取当前光标位置。提示(Tishi)-用于输出提示语句。2.2、功能图:3
3、、详细设计:3.1、设计方法: 该课程设计只是应用了些简单的函数调用,中断,宏调用。其中随机产生字符的实现是通过调用中断(ah=2ch,int 10)取系统时间的1/100 来得到一组随机数,把这些随机数当做指针,然后取指针对应的字符表中相应的字符,来得到一串字符。在把结果显示到屏幕上时将数据拆分后输出到屏幕上。如123在屏幕上显示时必须一个一个输出,还有在输出小数点时也采取了相应的办法。在计算时间上记录系统在打字开始和结束时的时间,然后相减得到。在打字时通过比较记录正确个数,最终除以总个数得到正确率。在打字过程中还通过设置字符属性来区分正确和错误字符的不同。3.2、各功能模块及流程图 输出正
4、确率模块 计算打字时间并输出模块 数据打印输出模块记录当前时间和 改变字符颜色模块 正确个数及已打个数模块 3.3重点难点及解决办法: 刚开始看到这个题目的时候,我感觉这个题目还是很简单的,在数据区直接存放一串字符,接着输入字符与已有字符做比较,记录正确个数和总的字符个数,然后二者一除就得到正确率了, 至于打字时间就是取两次系统时间,结束和开始时间相减便得到了。当我着手做时我才发现这并不是我想象的那样。我遇到的第一个问题就是怎么把字符串显示在屏幕上指定的位置及在打字时怎么看到自己在打那个字符(我们不可能去数吧!),经过查阅资料我学到了用光标定位和设置字符的颜色来解决这一问题。其次我遇到的问题是
5、怎么才能在屏幕上正确的显示信息,当要在屏幕上显示 12:21:23,12.2%,123这些时我该怎么解决呢?我最终的解决办法是将字符拆开一个一个输出。在本程序中已知字符串我采用了随机产生,在随机产生时我遇到的问题是产生的字符由于程序运行时间太短而都是同一字符,后来我通过延时解决了这个问题。4、总结: 通过多次的实践,使我深切的体会到培养动手能力的重要性,程序设计是一门实践性很强的东西,不仅要学好书本知识,那是远远不够的,还必须随时把所学知识投入实际应用之中,在此过程中多参照些相关资料,只有这样,才能达到学习的目的,才能学好一门编程语言。这次实践中,我感觉到自己掌握的只是太匮乏了,太不深刻了,当
6、用到某个知识点时,经常是脑子了有个印象,而确切的却想不起来,幸亏还可以查阅资料要不就什么也不会了。通过这次实践,我觉的必须很熟练的掌握专业知识,才能很顺畅的编程,才能提高效率,考虑问题也会更全面,编写的程序也会很健壮。5、参考文献: 1 IBM-PC汇编语言程序设计 沈美明 清华大学出版社 2001年8月第2版 2 IBM-PC汇编语言程序设计例题习题集沈美明 清华大学出版社 1991年6月第1版 3 微机系统和接口应用技术朱世鸿 著 清华大学出版社 2006年9月第1版 6、附: 源程序;-COLORCHAR MACRO char,color push ax push bx push cx
7、push dx mov ah,9h;在光标位置显示字符和字符属性 mov al,char;AL字符 mov bh,0;显示页 mov bl,color;字符属性 mov cx,1;字符重复个数 int 10h mov ah,03h;读光标位置 ;DH:DL=行:列 mov bh,0;显示页号 int 10h mov ah,02;置光标位置 inc dl;列 int 10h pop dx pop cx pop bx pop axENDM;-BACKCHAR MACRO char,color mov ah,02h; mov dl,08h;退格 int 21h COLORCHAR char,colo
8、rENDM;-CLEAR MACRO alz,bhz,chz,clz,dhz,dlz;清屏窗口 push ax push bx push cx push dx mov al,alz;上卷行数 mov bh,bhz;卷入行属性 mov ch,chz;左上角行数 mov cl,clz;左上角列数 mov dh,dhz;左下角行数 mov dl,dlz;左下角列数 mov ah,06h int 10h pop dx pop cx pop bx pop axENDM;-;-SETGB MACRO bhz,dhz,dlz;设置光标位置 push ax push bx push cx push ax mo
9、v bh,bhz;显示页号 mov dh,dhz;行 mov dl,dlz;列 mov ah,2;置光标位置 int 10h pop dx pop cx pop bx pop axENDM;-READGB MACRO bhz;读光标位置 push ax push bx push cx push dx mov bh,bhz;显示页号 mov ah,03h;读光标位置 int 10h mov gbattr0,dh;记录光标行 mov gbattr1,dl;记录光标列 pop dx pop cx pop bx pop axENDM;-LINEFULL MACRO lmax,lact push ax
10、push bx push cx push dx mov ax,lact cmp ax,0 jz LFEXIT mov dx,0 cwd mov bx,lmax div bx cmp dx,0 jz LNFU jmp LFEXITLNFU: mov FullFlag,1LFEXIT: pop dx pop cx pop bx pop axENDM;-TISHI MACRO row,col,addrr push ax push dx SETGB 0,row,col;设置光标位置 mov ah,09h lea dx,addrr int 21h pop dx pop axENDM;-data segm
11、ent addrr db 400 dup($) addrr1 db abcdefghijklmnopqrstuvwxyz0123456789$ addrr2 db 400 dup($) Anumber dw 0 ;总字符个数 Rnumber dw 0 ;正确字符个数 LineMax dw 0 ;满行的字符数 LineAct dw 0 ;当前行字符数 FullFlag db 0 ;满行标志FullFlag=1满行,FullFlag=0未满 gbattr db 2 dup(0) ;存放字符所在行列 Stime db 3 dup(0) temp db 5 dup(0) ts1 db Stime:$
12、ts2 db Rrate:$ ts3 db Total Use-Time:$ ts4 db Total Characters:$ ts5 db Correct-Reta:$ ts6 db Press any key to end!$ ts7 db An ESC Jian KeYi SuiShi TuiChu!$ ts8 db *DaZi LianXi*$data endscode segment assume ds:data,cs:codestart: mov ax,data mov ds,ax;- mov di,0 ;随机产生字符 mov bx,65 zifu: mov ah,2ch int
13、 21h mov al,dl cbw mov si,ax cmp si,35 ja zifu mov al,addrr1si mov addrrdi,al inc di dec bx push di push si mov di,400hAa1: mov si,0ffffhAa2: dec si jnz Aa2 dec di jnz Aa1 pop si pop di cmp bx,0 jnz zifu ;- CLEAR 0,57h,0,10,23,69 CLEAR 0,17H,3,12,22,66 CLEAR 0,70h,4,14,22,64 CLEAR 0,25H,12,14,14,64
14、CLEAR 0,70h,13,18,13,35 CLEAR 0,70H,13,43,13,60;- SETGB 0,0,30 ;输出上面提示语句 CLEAR 0,25h,0,28,0,49 CLEAR 0,25h,2,23,2,54 CLEAR 0,57h,1,14,1,64 mov ah,09h lea dx,ts8 int 21h SETGB 0,2,24 mov ah,09h lea dx,ts7 int 21h ;- SETGB 0,4,14 mov di,0 mov cx,0ffffhAD: mov dl,addrrdi ;装载字符 cmp dl,$ jz A2 push dx mo
15、v bp,di CALL isFullLine pop dx mov ah,02h int 21h inc di loop ADA2: mov ah,2ch ;取系统时间 int 21h mov Stime0,ch mov Stime1,cl mov Stime2,dh SETGB 0,15,14 CALL TONGJI mov cx,0ffffh mov di,0hAS: cmp addrrdi,$ jnz ASnt00 jmp AENDASnt00: mov bp,di CALL isFullLine mov bp,di CALL clew_char ;改变字符颜色;=reinput: ;
16、输入字符开始打字 READGB 0 mov ah,01 int 21h cmp al,27 ;是否退出 jnz al27nt jmp exit;-al27nt: cmp al,0dh jnz al0dnt SETGB 0,gbattr0,gbattr1 jmp reinputal0dnt: cmp al,08 jnz ASnext cmp gbattr1,14 jnz ASnz SETGB 0,gbattr0,gbattr1 jmp reinputASnz: mov ah,02h mov dl, int 21h mov ah,02h mov dl,08h int 21h dec di dec
17、Anumber push ax mov al,addrr2di cmp al,addrrdi jnz AS1nt dec RnumberAS1nt: pop ax CALL TONGJI mov bp,di CALL clew_char ;改变字符颜色 jmp reinput ;-;= ASnext: inc Anumber CALL TONGJI mov addrr2di,al cmp al,addrrdi jnz AER inc Rnumber CALL TONGJIA3: inc di loop AS1 ;直接跳太远AS1: jmp ASAEND: jmp exitAER: mov te
18、mp1,al BACKCHAR temp1,74h jmp A3exit: CLEAR 0,07,8,16,17,63 CLEAR 0,57,10,20,15,59 TISHI 11,24,ts3 call UseTimeAndOut TISHI 12,24,ts4 mov bx,Anumber call btod_out TISHI 13,24,ts5 call RightRata_out TISHI 14,30,ts6 mov ah,08 int 21h mov ah,4ch int 21h;-RightRata_out proc near ;输出正确率 push ax push bx p
19、ush cx push dx mov ax,Rnumber;正确字符个数 mov cx,100 mul cx div Anumber ;字符总数 mov bx,ax CALL btod_out push dx mov ah,02h mov dl,. int 21h pop dx mov ax,dx mul cx div Anumber mov bx,ax CALL btod_out mov ah,2h mov dl,% int 21h pop dx pop cx pop bx pop ax retRightRata_out endp;-UseTimeAndOut proc near ;计算打字
20、时间并输出 mov ah,2ch int 21h sub dh,Stime2 jns SecUnBlow jz SecUnBlow add dh,60 dec clSecUnBlow: sub cl,Stime1 jns MinUnBlow jz SecUnBlow add cl,60 dec chMinUnBlow: sub ch,Stime0 CALL OutTime retUseTimeAndOut endp;-OutTime proc near ;显示时间ch:cl:dh mov al,ch cbw mov bx,ax CALL btod_out mov ah,02h mov dl,:
21、 int 21h mov al,cl cbw mov bx,ax CALL btod_out mov ah,02h mov dl,: int 21h mov al,dh cbw mov bx,ax CALL btod_out retOutTime endp;-TONGJI proc near ;记录当前时间和正确个数及已打个数 push ax push bx push cx push dx READGB 0 SETGB 0,13,20 CLEAR 0,70h,13,18,13,35 mov ah,09h lea dx,ts1 int 21h mov ah,2ch int 21h call Us
22、eTimeAndOut SETGB 0,13,45 mov ah,09h lea dx,ts2 int 21h mov ax,Rnumber mov bx,ax call btod_out mov ah,2h mov dl,/ int 21h mov ax,Anumber mov bx,ax call btod_out SETGB 0,gbattr0,gbattr1 pop dx pop cx pop bx pop ax retTONGJI endp;-btod_out proc near ;输出BX中内容 把数据打印输出 push ax push cx push dx push bp mov
23、 ax,bx mov si,3rota1: mov bl,10 div bl mov tempsi,ah and ax,00ffh dec si cmp si,0 jnz rota1 mov bp,1 mov si,1rota2: mov dl,tempsi add dl,0 cmp dl,0 jz btodeal mov bp,0btrt1: mov ah,02h int 21hbtrt2: inc si cmp si,3 jna rota2;- 全部为0时输出一个0 cmp bp,1 jnz RT mov ah,2h int 21h;- jmp RTbtodeal: cmp bp,1 jz
24、 btrt2 jmp btrt1RT: pop bp pop dx pop cx pop ax retbtod_out endp ;-isFullLine proc near ;满行后换行 push ax push bx mov ah,gbattr0 mov al,gbattr1 mov LineMax,51 ;满行时为51个字符 mov LineAct,bp LINEFULL LineMax,LineAct ;判断是否满行 mov bl,FullFlag ;满行时为FullFlag= 1 cmp bl,0 jz isfexit READGB 0 ;读光标位置 add gbattr0,1 su
25、b gbattr1,51 SETGB 0,gbattr0,gbattr1;设置光标位置 mov FullFlag,0 ;满行标志置0isfexit: mov gbattr0,ah ;记录光标当前位置 mov gbattr1,al pop bx pop ax retisFullLine endp;-clew_char proc near ;改变字符颜色 push ax push bx push cx push dx push si READGB 0 mov ax,bp mov bl,51 div bl mov dh,4 mov dl,14 add dh,al add dl,ah mov temp
26、0,dh mov temp1,dl SETGB 0,temp0,temp1 COLORCHAR addrrbp,70h cmp bp,0 jz resetgb cmp temp1,14 jz clew2 sub temp1,1clew1: mov bx,bp dec bx SETGB 0,temp0,temp1 COLORCHAR addrrbx,5eh jmp resetgbclew2: sub temp0,1 add temp1,50 jmp clew1resetgb: SETGB 0,gbattr0,gbattr1 pop si pop dx pop cx pop bx pop ax retclew_char endp;-code ends end start