微机课程设计数字秒表Word文件下载.docx
《微机课程设计数字秒表Word文件下载.docx》由会员分享,可在线阅读,更多相关《微机课程设计数字秒表Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
本设计利用软件实现延时(不是很精确),调用TIME实现延时。
其原理:
通过可控制的循环来占用CPU的时间来实现延时,分为内外两层循环,外循环由AX中的数值来控制,内循环有CX中的值来控制。
3.光标定位子程序原理
DOS显示屏为25行、80列,左上角为(0,0),右下角(18,4F)
设置光标,可调用BIOS系统,用汇编语句调用中断INT10H。
入口信息为
(AH)=2要设置光标;
(BH)=0页号;
(DH,DL)=光标的行号、列号
4.清屏原理
开始执行程序时为保证有一个洁净的屏幕,可使显示屏做上滚动作,使屏幕留下一片空白。
要使屏幕上滚,可用汇编语句INT10H,入口信息为
(AH)=6使屏幕上滚
(AL)=00上滚行数
(CH,CL)=滚动区域左上角的行、列号
(DH,DL)=滚动区域右下角的行、列号
(BG)=00颜色的设置
5.字符及字符串显示原理
通过调用DOS系统模块2只能是西安DL中的一个字符的显示。
为了实现字符串的显示,调用其9号模块功能,其入口信息为
(AH)=9显示字符串的功能模块
(DS:
DX)指向字符串的首地址,要求字符串以字符‘$’结尾。
6.压缩BCD转为ASCII码原理
(1.)两位的:
先将压缩BCD码的高4位取出,右移四位后,与30H相或,存到相应内存单元;
然后将低4位取出,与30H相或,存到下一内存单元。
(2.)一位的:
原数字加30H
7.动态扫描键盘原理
运用INT21H的8号功能来实现动态扫描键盘。
如果有键按下,则相应的键值的ASCII码被存到AL中。
判断AL中的数值,若不是控制字符,则继续循环,从而实现动态扫描键盘。
四、程序流程图
1.主程序流程图
2.子程序流程图
5、程序代码
DATSEGMENT;
设置数据段
BUFDB'
Inputstart(S)ormemory(M)orend(E)orcontinue(C)orrestart(R)$'
;
设置功能说明
MESSDB'
计时器'
0ah,0dh
DB'
'
'
********************'
********'
***********'
***********'
********'
***********'
***********'
********************'
'
****************************'
********'
********'
********'
********'
********'
********'
********'
0ah,0dh
****************************'
Designedby陈奇Copyright@2013--2014'
'
$'
TIPDB'
MEMORY$'
定义记忆提示
BUFFERDB20DUP(?
);
定义缓存区
NUMDB1
LODEQU0144H;
记忆显示区光标的位置
DATENDS
--------------------代码段----主程序单元------------------
CODSEGMENT;
定义代码段
STARTPROCFAR
ASSUMECS:
COD,DS:
DAT
MOVAX,DAT
MOVDS,AX
CALLCLR;
图形区清屏并设置颜色
CALLCLRDAT;
秒表数字区清屏并设置颜色
CALLCLRMER;
记忆区清屏并设置颜色
MOVDX,OFFSETBUF;
输出功能说明
MOVAH,09H;
输出字符串
INT21H
MOVDX,OFFSETMESS;
MOVAH,09H
CALLDISMER;
"
MEMORY"
的光标位置
MOVDX,OFFSETTIP;
输出"
CALLGO;
设置初值
LOAD:
CALLIOSET;
光标定位
CALLHALT;
等待输入
MOVDX,0
MOVCH,0
AGAIN:
CALLTIME;
调用延时程序
MOVAL,DL;
十分之一秒加一
ADDAL,1
DAA
CMPAL,10H
JENEXT1;
满十进位
MOVDL,AL
JMPDISPY;
不满十显示
NEXT1:
MOVDL,0
MOVAL,DH;
秒位加一
MOVDH,AL
CMPAL,60H
JNEDISPY
MOVDH,0
MOVAL,CH;
分位加一
MOVCH,AL
CMPAL,60H
JNEDISPY;
满60清零
DISPY:
显示电子秒表
MOVBX,OFFSETBUFFER;
取缓冲区地址
MOVAL,CH
CALLTRAN;
将分位转变为ASCII码并送缓冲区
INCBX
将秒位转变为ASCII码并送缓冲区
CALLTRAN
将十分之一秒位转变为ASCII码并送缓冲区
CALLTRAN2
PUSHBX
PUSHCX
PUSHDX
光标置位
MOVDX,OFFSETBUFFER;
输出缓冲区字符串
POPDX
POPCX
POPBX
MOVAH,0BH;
等待键盘输入
ANDAL,AL
JZAGAIN
MOVAH,08H
INT21H
CMPAL,'
M'
JNZR1
CALLMEMORY
JMPAGAIN
R1:
CMPAL,'
R'
判断输入是否为R
JNENEXT2;
不是则判断是否为E
CALLMEMORY;
若是则调用记忆功能保存当前值
MOVCH,0;
初值清零重新计数
MOVDL,0
NEXT2:
E'
判断是否为E
JNEAGAIN;
不是则继续计数
NEXT3:
;
若是则暂停计数
MOVAH,08H
C'
判断是否输入C
判断是否输入R
JNENEXT3;
若不是则继续等待输入
CALLMEMORY;
若是则调用记忆功能
重新设置初值等待重新启动
CALLIOSET
MOVDX,OFFSETBUFFER
JMPLOAD
RET
STARTENDP
;
-------------------子程序单元------------设置初值子程序-----------
GOPROC
MOVBX,OFFSETBUFFER
MOVAL,'
0'
MOV[BX],AL
:
'
.'
GOENDP
--------------------光标定位子程序----------------------
IOSETPROC
MOVDX,121DH;
光标定位在18行39列
MOVBH,00;
页号
MOVAH,02H;
要设置光标
INT10H
IOSETENDP
HALTPROC
S'
JNEHALT
HALTEND
----------------------BCD转ASCII码子程序1------------
TRANPROC
MOVCL,AL
SHRAL,1
ORAL,30H
MOVAL,CL
ANDAL,0FH
TRANENDP
----------------------BCD转ASCII码子程序2-----------
TRAN2PROC
ADDAL,30H
TRAN2ENDP
------------------延时子程序-----------------
TIMEPROC
PUSHAX
MOVAX,06EEH;
通过改变AX的初值来校准秒表
MOVCX,0FFFFH
A1:
DECAX
JNZA2
JMPA3
A2:
DECCX
JMPA1
A3:
POPAX
TIMEENDP
-----------------记忆功能子程序-----------
MEMORYPROC
CMPNUM,20
JEX2
ADDNUM,1
X1:
MOVDX,LOD
ADDDH,NUM
MOVBH,00
MOVAH,02H
POPAX
X2:
CALLCLRMER
MOVNUM,1
JMPX1
MEMORYENDP
----------------------图形区清屏并设置颜色子程序----
CLRPROC
MOVAH,06H;
使屏幕上滚
MOVAL,18H;
上滚行数
MOVCX,0000H;
滚动区域左上角的行号列号
MOVDX,1840H;
滚动区域右下角的行号列号
MOVBH,2CH;
空白行属性
CLRENDP
----------------数据区清屏并设置颜色子程序------------
CLRDATPROC
MOVAH,6
MOVAL,1
MOVCX,121DH
MOVDX,0E23H
MOVBH,6EH
CLRDATENDP
------------------------记忆区清屏并设置颜色子程序---------
CLRMERPROC
MOVAL,18H
MOVCX,0141H
MOVDX,184FH
MOVBH,5EH
CLRMERENDP
------------------------记忆提示光标定位---------------
DISMERPROC
MOVDX,0043H
DISMERENDP
CODENDS;
结束代码段
ENDSTART;
结束源程序
六、程序运行结果
七、程序调试中的问题及解决方法
1.主程序的调试
主程序使用压缩BCD码做的加法,再用DAA进行调整,这时要注意DAA只能对AL中的结果进行调整,因此只能用AL做加法,再将数据传送过去。
2.BCD码调整为ASCII码子程序调试
BCD码调整为ASCII码时,分、秒同0.1秒不能调用同一个子程序,否则屏幕显示时,0.1秒位的显示的也是两个数。
应该分开调用,分秒位调用时用TRAN,0.1秒调用时用TRAN2。
3.延时子程序的调试
延时程序的时间并没有经过精确计算,因此只能用试探法逐渐增加或减小AX值。
最终选定AX=0BFFH。
4.图形显示程序的调试
本设计图形的显示用了字符串输出。
刚开始编程时由于图形太大超过了25行,图形不能正确的显示,经过多次反复修改,最终图形得以正确显示。
在使用字符串输出时一定注意在最后加上‘$’字符,还应该注意“0ah,0dh”的正确使用。
5.清屏子程序调试
书中没有具体指明颜色代号,只能通过从01H开始依次尝试。
经过多次调试最终确定图形使用0CH绿色,字幕使用0EH黄色,记忆区使用0DH紫色。
8、心得体会
“纸上得来终觉浅,绝知此事要躬行”,这是本次课程设计我最大的体会。
刚开始时,看着老师给的参考材料,心里想“这个课程设计不是很难的事情嘛,把这几个子程序堆一块不就完了”,可是真正做起来时,才发现事情远非想的那么简单。
从上机软件的选取,到课程设计报告的最终完成,我们经历了很多曲折,也收获了很多,下面具体阐述一下。
1.软件的选取
古语云:
工欲善其事必先利其器。
汇编语言上机软件和流程图绘制软件的选取对此次课程设计非常重要。
经过对比我们最终选取了Masm,Edrw最终也能熟练操作这两款软件。
这是此次设计较大的收获。
2.图案的设计
为了能得到一个比较漂亮的界面显示,我们在图案设计上花了不少功夫。
很多次设计的图案很漂亮,可是搬到程序里面运行时却是一堆乱码,让我们很沮丧...还有要把秒表的显示正好调到图案正中央,我们也经过了多次调试。
在这个过程中,我们学会了耐心,去除浮躁,平心静气的把程序一遍遍的修改、调试,臻于完美。
3.程序调试
程序调试前,我们检查了好几遍。
可是调试时还是错误百出。
尤其是“;
”的使用,一定要区分英文输入的分号和中文分号的区别,还有字符串结束时一定要加‘$’,否则会出现乱码。
这些都是调试中发现的问题,只有注意细节,细心,才能顺利完成任务。
总结:
通过本次课程设计,我加深了对课汇编语言的理解,同时熟练掌握了汇编语言的编辑、调试软件。
在以后的学习生活中还要继续保持严谨认真的科学态度,保持不断尝试和探索的耐心,保持勇于解决问题的决心。
不断地向老师、同学们学习、交流,分享吸取他们的经验,更好的提高自己。
9、参考书目
《微型计算机原理》P150~158、P166~171张荣祥中国电力出版社