2秒表.docx
《2秒表.docx》由会员分享,可在线阅读,更多相关《2秒表.docx(21页珍藏版)》请在冰豆网上搜索。
![2秒表.docx](https://file1.bdocx.com/fileroot1/2023-2/3/f3b6fa66-34f6-475a-a6d5-62e4472dfc3c/f3b6fa66-34f6-475a-a6d5-62e4472dfc3c1.gif)
2秒表
目录
摘要------------------------------------------------------------3
一、设计内容与要求----------------------------------------------3
二、设计原理---------------------------------------------------3
2.1原理概述-------------------------------------------------3
2.2延时原理-------------------------------------------------3
2.3显示字符及字符串原理-------------------------------------3
2.4压缩BCD转为ASCII原理-----------------------------------4
2.5动态扫描键盘原理-----------------------------------------4
三、程序流程图-------------------------------------------------4
3.1主程序流程图---------------------------------------------4
3.2压缩BCD转ASCII码子程序流程图---------------------------6
3.3延时子程序流程图-----------------------------------------7
四、程序代码及效果图-------------------------------------------8
4.1程序代码------------------------------------------------8
4.2效果图--------------------------------------------------13
4.3效果说明------------------------------------------------13
五、程序调试--------------------------------------------------14
5.1取键值部分程序调试--------------------------------------14
5.2延时程序调试--------------------------------------------14
5.3效果图形调试--------------------------------------------14
5.4加颜色调试-----------------------------------------------14
5.5总体调试-------------------------------------------------14
六、设计心得--------------------------------------------------14
七、参考资料----------------------------------------------------15
摘要
本设计用软件实现了电子秒表的功能。
在运用汇编语言这个工具下在PC机上实现的,并且在实现基本功能的基础上我们为秒表加框,做了修饰,并在其下方动态显示“STOPWATCH!
”字样。
启动停止等按键数字采用彩色字,两侧边框着色,这样使得秒表显得美观。
关键词:
电子秒表(stopwatch),8086,汇编语言
一、设计内容与要求
设计要求:
1.具有秒和百分之一秒计时,并显示在屏幕中央
2.秒表具有启/停
3.秒表具有复位功能
在此基础上,我们为秒表加框,加色,动态显示“STOPWATCH!
”,
二、设计原理
2.1原理概述
在main程序控制的前提下,我们用INT16H的1号功能和0号功能实现键值的输入,通过调用延时程序实现百分之一秒的定时,通过INT10H的2号功能实现光标定位,通过INT21H的2号功能实现字符的输出,通过调用INT21H的9号功能实现字符串的输出。
2.2延时原理
计算机在执行指令时,各种操作都按照指令执行,但在想顺序控制器那样由计算机发出指令控制外部设备时,由于外部设备所具有的机械惯性或其他原因,需要在计算机发出命令后有规律的延迟或等待一段时间。
这类延迟可以用硬件演示完成,但在本次设计中,没有硬件定时器的支持,只能靠软件实现延时,即通过可控制的循环来占用CPU的时间来实现延时,这种延时方法不够精确,且会占用大量的CPU资源,使CPU的效率降低,因此,编制延时程序应尽量采用较少的指令,节约存储器。
我们发现运行秒表程序后,PC机的速度明显变慢。
本设计的技术参数不可能与实际的秒表相比,延时函数名为TIME,是长延时程序。
运用内外两层循环,外循环由AX中的数值来控制,内循环用CX中的数值来控制。
实现不同延时的控制,AX和CX值需要通过反复比较调试确定,我们确定AX的值为0093H,CX的值为0FFFCH。
2.3显示字符及字符串原理
我们显示字符和字符串的子程序没有使用课本上的函数,而是运用老师刚讲的宏定义来实现,由于我们还要显示图形,所以这样的做法显得必要而且更恰当。
我们的设计中的显示均先定位光标后显示完成的。
定位光标用INT10H的2号功能,DH中存的中行号,DL中存的是列号,BH中存页号。
整个屏幕有24行79列,对应的16进制为:
左上角为(0,0),右下角为(18,4F)。
显示彩色字符用INT10H的9号功能,AL中存放要显示字符的ASCII码。
显示字符串用INT21H的9号功能,DX中存要显示的字符串的偏移地址。
由于要显示的字符和字符串较多和出于程序的精简考虑,我们把显示字符定义为DISCHAR宏,显示字符串定义为DISSTRING宏。
2.4压缩BCD转为ASCII原理
本段程序是参考教材的。
先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应的内在单元。
然后将低4位取出,与30H相或,存到下一内存单元。
2.5显示字符及字符串原理
由于INT16H的1号功能只能读键盘缓冲区从而判断有无键值输入,无自动清缓冲区功能,我们运用INT16H的1号和0号功能来实现动态扫描键盘。
由1号功能判断有无键按下,如果有键按下,则ZF=0,跳转到相应的位置调用0号功能来读键值,相应键值的ASCII码被存的AL中。
如果没有键按下,刚继续循环。
从而实现动态扫描键盘。
三、程序流程图
3.1主程序流程图
主程序流程图如下:
3.2压缩BCD转ASCII码子程序流程图
压缩BCD转ASCII码子程序流程图如下:
3.3延时子程序流程图
延时子程序流程图如下:
四、程序代码及效果图
4.1程序代码
DATASEGMENT;数据段
DIS_BUFDB'?
','?
',':
','?
','?
','.','?
','?
','?
','?
','?
',?
;显示缓冲区,最后一字节用来存‘$’
SOPDB1;运行标志位(STARTORPAUSE)
;0为运行,1为停止
FUN1DB':
START/PAUSE$'
FUN2DB':
RESET$'
FUN3DB':
EXIT$'
NUM1DB'1'
NUM2DB'0'
NUM3DB'2'
DESIDB'Designby:
$'
CHYDB'Ocean&GuanShihu$'
DATDB'Date:
22th,Dec,2008$'
WORDSDB'Stopwatch!
$'
SPACEDB'$'
LINERDB'-----------------------$'
DATAENDS
STASEGMENTPARASTACK'STACK'
STAPNDB100DUP(?
)
TOPEQULENGTHSTAPN
STAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,SS:
STA
MOVAX,DATA
MOVDS,AX
MOVAX,STA
MOVSS,AX
MOVAX,TOP
MOVSP,AX
XORCL,CL;CL中存放分清零
XORDH,DH;DH中存放秒清零
XORDL,DL;DL中存放百分之一秒清零
DISCHARMACROX,Y;显示彩色字符用的宏,X的位置,Y是ASCII
MOVAH,02;中断10H的2号置光标位功能
MOVBH,0
MOVDX,X;定位,DH是行,DL是列
INT10H
MOVAH,9;10H的9号功能
MOVAL,Y
MOVBH,0
MOVBL,0CAH;颜色
MOVCX,1
INT10H
ENDM
DISSTRINGMACROX,Y;显示字符串的宏
MOVAH,02
XORBH,BH
MOVDX,X;定位,DH是行,DL是列
INT10H
MOVDX,OFFSETY;显示字符串
MOVAH,09H
INT21H
ENDM
PUSHAX
PUSHDX
DISSTRING111EH,WORDS
DISSTRING091BH,LINER;显示边框
DISSTRING0F1BH,LINER
DISCHAR0A1BH,'-'
DISCHAR0B1AH,'-'
DISCHAR0C19H,'-'
DISCHAR0D1AH,'-'
DISCHAR0E1BH,'-'
DISCHAR0A33H,'-'
DISCHAR0B34H,'-'
DISCHAR0C35H,'-'
DISCHAR0D34H,'-'
DISCHAR0E33H,'-';显示边框结束
POPDX
POPAX
GET_CHAR:
MOVAH,1;扫描键盘,检测是否有键按下
INT16H
JNZNEXT;有则跳到NEXT
MOVAL,[SOP];没有键按下,则判断[SOP]
CMPAL,1
JNESTART;[SOP]中的内容是0就开始,1就暂停
JMPPAUSE
NEXT:
MOVAH,0
INT16H
CMPAL,'1'
JNERESET_TEST
MOVAL,[SOP];取到的是1,01与SOP的内容异或存放
XORAL,01H
MOV[SOP],AL
CMPAL,1;AL中的内容是0就开始,1就暂停
JNESTART
JMPPAUSE
RESET_TEST:
CMPAL,'0';判断是按下的是否是0
JNEEXIT_TEST
RESET:
XORCX,CX;复位
XORDX,DX
CMP[SOP],0;判断此时状态:
运行还是暂停
JNENEXT1
MOV[SOP],1
NEXT1:
JMPDISPY
EXIT_TEST:
CMPAL,'2';检测是否是2
JNEDISPY
EXIT:
MOVAH,4CH;退出
INT21H
PAUSE:
JMPDISPY;暂停
START:
CALLTIME;运行
MOVAL,DL;百分之一秒加一
ADDAL,1
DAA;压缩BCD调整
MOVDL,AL;判断是否到一秒
JNCDISPY
PUSHAX
PUSHDX
TESTDH,01H
JEWOR
DISSTRING111EH,SPACE
DISSTRING0F1BH,LINER
JMPDISSPACE
WOR:
DISSTRING111EH,WORDS;显示字符串STOPWATCH
DISSTRING0F1BH,SPACE
DISSPACE:
POPDX
POPAX
MOVDL,0
MOVAL,DH
ADDAL,01H
DAA
MOVDH,AL
CMPAL,59H;判断是否到一分
JNADISPY
MOVDH,0
MOVAL,CL
ADDAL,01H
DAA
MOVCL,AL
CMPAL,59H;判断是否到一小时
JNADISPY
MOVCL,0
DISPY:
;显示,将各位数据转换为ASCII
PUSHAX
PUSHBX
PUSHCX
LEABX,DIS_BUF;取显示缓冲区偏移地址
MOVAL,CL
CALLTRAN2
INCBX
INCBX
MOVAL,DH
CALLTRAN2
INCBX
INCBX
MOVAL,DL
CALLTRAN2
INCBX
MOVAL,'$';结束符
MOV[BX],AL;定位光标至屏幕中央
PUSHDX
DISSTRING0305H,FUN1;显示字符串:
START/PAUSE
DISSTRING0323H,FUN2;显示字符串:
reset
DISSTRING0343H,FUN3;显示字符串:
quit
DISSTRING143AH,DESI;显示字符串:
Designby
DISSTRING153AH,CHY;显示字符串:
chy
DISSTRING163AH,DAT;显示字符串:
date
DISCHAR0304H,NUM1;显示数字
DISCHAR0322H,NUM2
DISCHAR0342H,NUM3
DISSTRING0C23H,DIS_BUF;显示字符串,计时时间
POPDX
POPCX
POPBX
POPAX
JMPGET_CHAR
MAINENDP;主函数结束
TRAN2PROC;压缩BCD转为ASCII子程序
PUSHCX
MOVCL,AL
SHRAL,1
SHRAL,1
SHRAL,1
SHRAL,1
ORAL,30H
MOV[BX],AL
INCBX
MOVAL,CL
ANDAL,0FH
ORAL,30H
MOV[BX],AL
POPCX
RET
TRAN2ENDP
TIMEPROC;延时子程序
PUSHCX
PUSHAX
MOVAX,00FFH;使用循环嵌套,AX控制外循环,CX控制内循环
INDELAY:
MOVCX,0FFFFH;实现精确定时
OUTDELAY:
DECCX
JNZOUTDELAY
DECAX
JNZINDELAY
POPAX
POPCX
RET
TIMEENDP
CODEENDS;代码段结束
ENDMAIN
4.2效果图
程序的实际效果图如下:
4.3效果说明
◆屏幕上边是相关的使用说明,其中:
1键实现开始/暂停功能,
0键实现复位功能,
2键实现退出功能。
◆秒表现是在框中央。
◆右下角是设计成员信息及设计日期。
◆中央下边是计时过程中随秒显示的秒表名称,启动前显示,启动后每隔一秒显示一次。
◆下边边框同样启动时显示,启动后每个一秒显示一次,而且和秒表名称不同时显示。
◆数字0,1,2和两侧边框彩色效果,生动立体。
五、程序调试
我们是使用emue8086这个软件来做的调试,这个软件是可视化的调试工具,比DEBUG的功能强大得多,而且是可视化界面,使用非常方便。
5.1取键值部分程序调试
这部分可以说是整个工程的关键,开始时,使INT21H的有关功能但不能实现动态扫描。
光标不动。
通过上网查资料,参考有关的实验课教程,才尝试使用INT16H的有关功能,我们试验了很多次才成功用到0号和1号功能配合完成这一功能。
5.2延时程序调试
延时程序由于不同的CPU的时钟频率不同而需要对相应的AX和CX作修改。
我们通过修改延时程序中AX和CX的值,与秒表时间相对比,不断改正,尽量减少误差。
这一部分工作比较简单,但比较机械,需要耐心。
经过耐心的调试,最终我们秒表的误差被控制在0.1秒之内。
5.3效果图形调试
效果图的其实是很伟大的工程,开始想了很多复杂的图案,后来发现实现很困难。
我们知道屏幕是有每个点坐标组成,所以我们想到了用坐标纸描点就坐标的方法。
先在坐标纸上画出图形,然后把每个点要显示的符号和坐标提取出来。
在程序中用宏定义了的函数实现,例如,显示上边框,由于是字符串所以使用DISSTRING实现,具体:
DISSTRING091BH,LINER。
5.4加颜色调试
起初我们是没有打算用宏定义的,因为当时老师还没有讲到,更改颜色总是光标不扫描,或者计时部分显示会有错误,后来发现必要的现场保护很重要,而且如果用了宏,就不用每次显示字符都先写一遍一样的程序段,很方便。
在我们程序中除了用宏来显示字符外,还用它来显示字符串。
5.5总体调试
总体调试可是花不少工夫,需要耐心细致的检查,调试,当程序编译链接都通过时,显示时却分和1/100秒同时跳动,有经过相当长的时间,终于发现是cx没有保护,这让我也深刻体会大保护的重要性。
这一点很重要。
六、设计体会
在拿到课程设计任务后,首先有种无从下手的感觉,但经过查阅资料后,才发现原来不像想象种的那么难,关键是将整个程序模块化。
延时模块,计时模块,
转换模块,然后就是画流程图,我们大约用了两天的时间来研究流程图。
再下来就是编写修改程序了。
写程序时,我认为关键是认真和大局意识,知道自己在做哪部,需要那些子程序,需要怎样编写等等。
我们首先编写的是计时模块,这个模块中逻辑复杂,
设计过程中,不时翻阅课本,也为我们在实践中能更好的熟悉课本,学以致用。
程序中的延时,ASCII转换等都是参照现成的程序,但是显示是运用了宏定义,编制程序花费了一定的时间,尤其是构思上。
而后经过几天的努力,程序编出来了。
调试的过程更是比编写的时候更需要花时间,需要更大的耐心。
特别是显色部分,我们从图书馆借的书上有关这方面的内容,但是仅仅是INT10的功能号和入口参数,把这个加到实际程序困难也是不小,这让我认识到从理论到实践还是有很大的距离的,需要更多的努力。
经过几个昼夜的奋战,程序终于可以准确的运行了,那一刻的喜悦真是谁有谁知道啊。
经过这次课程设计,让我有一次深刻体会到了集体的力量大。
我们小组两成员相互合作,相互配合终于做出了这个设计,学到了很多东西。
对子程序的调用也有了更深刻的理解,他会使程序看起来更有模块的感觉。
再者就是应用了宏定义来显示字符和字符串,使程序变得更简洁。
设计过程中要注意分工,不能一个人独干,负责事倍功半。
在设计中同组者陈海洋同学主要负责延时模块和转换模块,调试时我们一起完成。
他高效的按时完成工作是我们成功的重要保证。
当然这次设计还有一些遗憾,本打算将闪动的内容着色,但INT10的功能只有单个字符着色,我们尝试用循环来完成字符串的着色,但最终没有成功。
课下,我们会再好好琢磨一下的。
总之,这次设计报告,让我受益匪浅!
七、参考资料
《Intel8086/8088系列微型计算机原理及接口技术》,杨志坚主编,中国电力出版社,2003年9月
《微型计算机原理》,张荣祥,山东工业大学出版社
《汇编语言程序设计》,齐志儒,高福祥主编,东北大学出版社
另外也参考了有关网站的资料,不再一一列举。