计算机硬件技术基础课程设计_第1页
计算机硬件技术基础课程设计_第2页
计算机硬件技术基础课程设计_第3页
计算机硬件技术基础课程设计_第4页
计算机硬件技术基础课程设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机硬件技术基础课程设计计程车计价器设计(用计算机系统的输入输出设备完成)姓 名: 刘亚 学 号: 姓 名: 周桂锋 学 号: 姓 名: 袁云军 学 号: 姓 名: 郭洋成 学 号: 重庆大学自动化学院二O一一年九月目录引言11.设计的重要内容和方案11.1 设计的主要内容11.2 设计方案12.任务分工13.实验中运用的一些实验原理22.1 键盘按键中断22.2 取系统时间22.3 扬声器驱动系统原理23.操作说明24.主程序及子模块流程图35.每个人的心得体会116.参考文献157.附录16引言 现今,不管是在那些大城市,还是小县城。出租车早已经成为了一种重要的交通工具。不但解决了公交车

2、较慢的烦恼,也解决了自己开车没停车位的弊端。总之,出租车早已融入了这个城市的生活。既然如此,我们不得不考虑下出租车收费的问题。拥有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。所以我们下面就用汇编语言来设计出租车计价系统。1. 设计的重要内容和方案1.1 设计的主要内容设计一个计程车计价器,能用计算机系统的输入输出设备完成计程车计价器的基本功能,并在此基础上自行完善和优化系统功能。基本功能具体要求如下:1. 以计算机系统的输入输出设备为基础,一键盘作为输入设备,显示器作为输出设备,完成设计;(允许使用PC机的扬声器作为发生设备)2. 按键启动计程车和停车,可以在行进过程中

3、按键调整车速。3. 按键开始计价和停止计价。开始计价后,3公里内几家结果为起步价,3公里后,根据车速和行进时间计算所行距离,所行距离每达到1公里时,计价结果增加1次单价,要求精确到角。若在计价过程中停车,则每隔一段时间(具体时间间隔自行设置),计价结果增加1次单价。晚上10点到次日早上7点,按晚间起步价和晚间每公里单价计算。4. 屏幕上要求显示当前车速,当前计价结果,本次计价时间。停止计价后,本次计价结果保持一段时间后清为0.5. 显示当前燃料量,车辆行进过程中反映燃料的消耗,当燃料量低于警戒值时报警。1.2 设计方案我们经过组内激烈的讨论,将基本功能分为了几个小模块。如下:1. 速度、时间差

4、、油量模块,计算里程计价模块。2. 等待计价模块,总油量、每公里耗油模块。3. 显示车速、计价结果、时间模块。4. 设置起步价、单价,并判断是否白天晚上,并将输入的元,转化为角模块。我们小组四人分别将这四个子模块分别编辑。然后共同构想了主程序模块,以上各个模块的思路请看流程图。2. 任务分工袁云军:设置起步价、单价,并判断是否白天晚上模块;输入的起步价和单价的单位元,化为角模块,并共同完成论文。周桂锋:编写取第一次系统时间程序,取系统时间通用程序,计算相邻时间差子程序,计算总里程及总价格子程序,共同完成论文。刘 亚:编写子程序每次计程车运行的总时间的提取,换算称实际的时分秒格式并显示;每次运行

5、的总价格的计算,及显示;声音模块的写入及调用;及有关论文的撰写。3. 实验中运用的一些实验原理2.1 键盘按键中断程序中用到的中断:引发9号中断,键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽终端信息。CPU检测到该中断信息后,如果IF=1,则响应中断,引发中断过程,转去执行int 9中断例程。编写int 9中断例程:键盘产生扫描码;扫描码送入60h端口;引发9号中断;CPU执行int 9中断例程处理键盘输入。2.2 取系统时间取当前系统时间采用int 21h中断的2ch号功能,分别将当前时刻的时、分、秒和百分之一秒存入对应的寄存器:ch、cl、dh、dl。2.3

6、 扬声器驱动系统原理在PC中,8254的通道2与计算机的扬声器相连,由通道2工作于方式3产生一定频率的方波信号去驱动扬声器按一定频率发声。其原理如图1所示。从图中可见,系统使用并行I/O接口8255A中PB端口的最低两位来控制该发声驱动系统:PB0作为8254通道2的门控信号GATE2,控制通道2定时计数启停;PB1与通道2的OUT2信号相与后去控制扬声器的接通和断开。PC中8255A的端口地址为60H63H,8254的端口地址为40H43H。可见,要使扬声器发声,PB0置1,通道2才能工作;PB1置1,OUT2上产生的一定频率的方波信号才能通过与门送到驱动器,从而使扬声器发声。图1 扬声器驱

7、动电路原理图3.操作说明在程序开始运行后,系统的初始状态是出租车停止,具体操作方式如下:1、按任意“s”键启动系统;2、设置白天的起步价和单价;3、设置晚上的起步价和单价;4、按键选择白天或晚上;5、按加速键“+”调速启动出租车,即速度由0变为正,计价器开始里程计价;6、在计价过程中通过“+”,“-”键实现车速的调节;7、按减速键“-”使车速重新回到0,进入等待计价;8、等待计价时,如果按加速键“+”使速度变为正,则重新进入里程计价9、等待计价时 按“q”键,出租车停车,停止计价。4.主程序及子模块流程图主程序流程图按键中断服务程序计算当前油量子模块等待计价子模块判断是有键按下提示输入白天起步

8、价开始输入白天起步价调用erjzzh模块调用erjzzh模块输入白天和晚上的起步价和单价模块将转化的值存入pricing2提示输入晚上单价将转化的值存入内存pricing1将转化的值存入ppm2提示输入白天单价输入白天单价NN调用erjzzh模块Y将转化的值存入ppm1判断按下的键是否是d将pricing1和ppm1的值分别存入pricing和ppmY提示输入晚上的起步价N输入晚上的起步价Y将pricing2和ppm2的值分别存入pricing和ppm判断按下的键是否是n调用erjzzh模块N结束元转化成角模块开始送输入字符串的第一位给al转换成十进制数,再乘以10,送给寄存器bl再送字符串的

9、第二位给寄存器al判断是否的小数点 N Y再送字符串的第三位给寄存器al转换成十进制数,再乘以10,与寄存器bl相加,最终结果存于bl结束计算时间差子程序流程图开始是否与系统初始时间比较Y差值是否相等计算小时数之差算法赋值2算法赋值1NYN小时差化为分,加上最近一次时间的分钟数分钟之差化为秒,存入内存计算百分之一秒之差借位更新秒数是否借位YN计算百分之一秒之差,然后计算秒数之差,化为1/100s单位结束将求得的时间之差存入表示1/100s的内存空间,即为时间差里程计价子程序流程图开始结束总价累加每公里单价,miletest加1000里程是否大于miletest内存gongli加一,标志位mil

10、etest1加1000里程是否大于标志位miletest1设起步价是否需要设起步价计算总里程累加入内存取当前车速和时间差N YYNNY5.每个人的心得体会小组成员:刘亚1、课程设计的目的 本次设计的题目分为两大类,5个题目,只是一种是涉及硬件的题目,一种是纯软件写出的题目。我们小组有4个同学,分别是郭洋成,袁云军,周桂峰,我一起商量以后选择了:计程车计价器设计(用计算机系统的输入输出设备完成),这个题目。 选取这个题目大家有这样几点考虑: 第一,怎样设计总体方案(思路清晰) 第二,分成几个子模块且每个模块怎么融合(连接简单) 第三,总程序的调试及功能的实现(显示清晰)2、课程设计的任务 拿到题

11、目后,4个同学集思广益,都纷纷开动脑筋,思想的火花一下子全都迸发出来了,最后经过综合后,留下了大家觉得比较合适的、好的、容易实现的思想后,完成了总体方案的设计和定稿。 我们的任务是实现计价器的一些基本功能,设置不同时段(白天、黑夜)的起步价、单价;用按键的方式实现计程车的起动和停止以及行进过程中调整车速;用按键实现起动车时计价,停车时结束计价;3公里内记为起步价,超过3公里距离每超过1公里计价一次,要求精确到角;若在计价过程中有停车等待,超过某一个时间设定值单价增加1次;整个过程分时段计价(晚上10点到次日早上7点)。 设计的显示效果分为两部分,一是实时的车速,计价结果,油量(油量低于某个设定

12、值报警提示);二是本次总里程,计价总时间,总价格,且在停止计价后一段时间所有计数清零。3、课程设计的内容 在明确设计任务后,大家按照设计要求明确地分了工。我的部分是显示计价总时间,总价格,并在其他同学需要的时候做一些辅助工作。 我的设计程序段比较简单,因此比较容易实现,基本思想是,取出起动计程车时的时间后停止计程车时的时间,然后按照时间显示的格式,时:分:秒,分段计算时差,加到后一时间的分作差,计算出分差,再加到秒上作差,最后计算出总秒数,再分别按时,分,秒,除以3600,60,得出时分秒的具体值。注意的是时分秒的数学格式为 “ 0:00: 00 ,而汇编语言是基础语言,只能是一位一位的显示,

13、并且只有19才有ASC|码,所以在计算分和秒的时候有可能除出来的数是大于9的数,这时需要将分数在除以10,并将商数加上30h输出ASC|码放到第一个分位,余数加上30h输出ASC|码放到第二位,类似秒位也如此。具体的程序段 见程序附录。4、课程设计的总结 这次设计基本上实现了任务书上的要求,可以设置不同时段的起步价、单价;按键可以起停车并变速;满足在相应的公里数下计价加价,如是停车等待也可以按设定值来加价;可以在行进途中实现实时显示价钱,油量,车速。 本次设计总共历时9天(含中秋放假),我的程序差不多总时间累计起来有3天左右。总结起来,自己的汇编语言基本上没怎么学懂,同学们在讨论的一些东西基本

14、上算不知道,叹息自己的学习能力了,很多东西没学过干,对自己说声仍需努力,加油吧”。不过值得高兴的是,和同学们相处的这一周多时间里面还是了解了很多东西,像我的程序段的显示,原来我是每个字位用一个 mov ah,09h;int 21h,而郭洋成同学的指导仅用了一个 定义数据段中的格式“ 0: 00 :00 ”,然后地址每加1位,很简洁的就解决了(详细的程序见程序附录)。并且也体会到了团队工作的相互配合,相互协作重要性,明确自己什么时候去配合他人,也要知道什么时候让他人帮助自己,有时候单靠自己是费力不讨好的事,凝聚产生力量,所以集体的力量是无穷的的。 期待,下一次的团队合作! 非常感谢有这样一个机会

15、让我获益匪浅!小组成员:周桂锋子程序功能描述 我需要编写的子程序有里程计价子程序、取系统时间子程序、取系统第一次时间子程序、计算时间差子程序。其中取系统第一次时间子程序和取系统时间子程序有较多的相同之处,之所以不合并在一起,一方面是主程序框架的需要,另一方面也是为了子程序更见简洁,不容易出向错误。里程计价子程序和计算时间差子程序较前面的程序要复杂一些,程序引入了其需要的算法,这就要求程序调用其它子程序中的变量帮助计算。在这种情况下,几个组员之间的协调工作就显得尤为重要,编写程序之前各种变量和主程序思想的统一能够为后面的程序调试工作带来极大的方便,使得各个子程序的兼容性满足要求。子程序功能的编程

16、思想和实现 前两个关于系统时间的的程序需要调用dos的2c号功能,这里需要及时的将存有系统时间数据的寄存器中的数据转存至内存变量中一遍调用,在存储过程中时分和秒、百分之一秒的位置不要搞混,否则时间差子程序将无法调用到正确的系统时间。总之,这两个程序只需要明确内存空间所存时间的具体意义即可。 编写计算时间差子程序需要用到前面的取值结果,所以在保证前面程序调试正确后我才开始编写此程序,以保证思路清晰。此段程序需要计算两次系统时间的差值,为后面计算里程和计价提供参数。主要思想其实很直接,就是一次比较时、分、秒和百分之一秒的大小,求得差值。值得注意的是,时间相减过程中设计借位问题,需要做相应调整。 里

17、程计价子程序涉及两个量的计算,即里程和总价,这两个量都是要直接显示在最终的用户界面上的,所以要为后面的屏幕显示程序提供供调用的内存空间,同样要注意数据兼容性的问题。程序编写中遇到的困难以及解决方法 程序编写中问题大大小小的不少,但是我遇到的最大问题是在时间差程序中遇到的。由于开始没有意识到单步调试的重要性,程序的问题很难找出来。程序中内存second中的值在每一次计算中开始都应该赋值给零,但是由于程序编写原因,开始编写的程序中second一直是做的累加计算,再加上一个逻辑跳转的错误,使得程序异常混乱。在使用单步调试之前,我浏览量程序很多遍,由于程序是按照自己思路编写的,即使是错误的逻辑在自己看

18、来都是正确的,所以一直无法找到错误。后来才想到应该使用单步调试,虽然其他组员也在使用单步调试,但是我自己却没有这个意识,这也算是一个教训吧。在使用单步调试后,错误则变得一目了然,因为内存量的变化在TD界面下是很容易查询到的。这个问题找到后,主程序的调试也就稍显轻松一点了,毕竟各个子程序能保证不出错,只需理清楚主程序逻辑就可以了。程序编写感想以前上实验课编写的程序都较小,子程序的调用也相对单一,而这次则不同。此次课程设计相当于一个简单软件系统的开发,我们需要根据客户的需求(即课程设计要求)完成相应功能,并交付使用。通过这次事件,整个软件的设计和编写流程是有据可寻的,在设计软件之前我们先了解了其要

19、实现的所有功能,然后我们搭建实现功能的主程序框架,分出程序模块,并明确其功能。紧接着我们为每个组员分配模块编写任务,落实下来就是编写子程序,并且在此之前我们为系统的变量兼容性做了充足的准备,避免了不必要的麻烦。每个组员保证自己的子程序编写正确,调试通过。最后我们将子程序嵌入主程序框架,主程序搭建完毕后进行联调,排除错误,最终完成软件编写。整个编写过程中,团队合作精神尽显无余,只有各组员通力合作,软件的编写过程才能如此高效和顺利。小组成员:袁云军因为老师要求我们在这次课程设计中要分工合作,所以我们小组经过讨论后将这个问题分为了以下四个模块:1、 速度、时间差、油量模块,计算里程计价模块。2、 等

20、待计价模块,总油量、每公里耗油模块。3、 显示车速、计价结果、时间模块。4、设置起步价、单价,并判断是否白天晚上,并将输入的元,转化为角模块。大概有自知自明吧,我选择了最简单的第四个模块。下面说说我在编辑的过程中遇到的问题吧!最开始拿到任务时,真的是无从下手,毕竟硬件语言都学过一年了,之后也没怎么去复习它。所以遇到的问题如下:1、怎么输入提示语和换行问题,也就是在dos里该怎么显示出来输入的白天夜晚的起步价和单价。2、也就是怎样将输入单位为元的价格转化为角存入自己定义的内存。以上两个问题里遇到的小问题将在下面的解决方案中提到。首先看了硬件书,知道第一个问题还是很简单的。因为在做硬件实验时,我们

21、要经常用到。不过开始的时候我还是没有考虑全题目给我的要求,在输入白天和晚上起步价和单价的时候,只在判断后输入白天或者晚上的起步价和单价。但是题目要求我们要把白天和晚上的起步价和单价都显示在dos里,所以经过小小的变化就在内存空间多定义四个变量就解决了。第二个问题就需要有自己的逻辑了。开始的时候总是还没习惯用自己的思维去写程序,总想在书上能找到类似的程序段,结果还真找到了,就因为这个程序段,害我编了一天。结果到后面还一句没有用上。我定义了一个数组去先存输入的价格字符串。然后一位一位的转换。因为我把单价和起步价规定在0.19.9之间二最开始的时候总是转换的值要比需要的值大32,结果经过了仔细推敲,

22、都是这句(and al,0fh)害的,本来我们取的是第一位的ASCII码,结果就因为那句与,让我的第一位变小了。后面减去30就变成了负值。所以出了问题。后来,检查自己编的程序只能输入固定模式0.19.9,当遇到输入19的整数时就不能转换正确了。然后我再运用了一句判断小数点那位跳转,结果顺利的实现了整数的转换。其实后面在大家整合到一个程序里时。还是遇到很多寄存器和定义变量的长度不同。不过经过简单的调试,很快就能调通了。自己的感想:经过这次设计,我学到了很多。理解了团队合作的重要性和依赖性。虽然途中遇到过很多问题,而且还就几个问题争得面红耳赤,但是解决问题后的的那份开心是没法磨灭的。还有我们的每个

23、子程序都用单独的子程序调通后才整合的,这样仅仅是为了整个程序调试的方便。总之,我们这次设计的完成得还是比较顺利和开心的。小组成员:郭洋成这次计算机硬件课程设计我们组选择了计程车计价器的设计(用计算机系统的输入输出设备完成)这个题目进行课程设计。我们拿到题目后便开始进行总体思路和设计方案的讨论。一开始我们只是简单的理了下整个过程的思路以及程序的大致流程,感觉这个题目还是挺好做的,没有特别困难的地方,大体实施的思路很快就出来。但随着整个工作的深入,细节问题一个个的突出显出来,比如说整个流程在中间过程的思路和跳转出现了一些问题,计算里程时的数据处理问题,程序运行过程中按键调速的问题,光标显示位置的控

24、制,等待计价模块的编写问题等等,但这些问题经过我们组四个人的讨论和查阅相关资料,全部都得以解决。最终我们克服困难,编写好完整的程序,实现了题目要求的各种功能。本次课程设计我负责调节车速子模块,计算当前油量子模块,等待计价子模块等模块的编写。1、调节车速子模块的设计,由于车速度的调节需要在程序运行过程中的任意时刻通过加减速键(“+”、“”)来调节,所以只能选择按键中断来实现此功能,如果采用按键查询来实现的话,加减速键会变得不灵敏。PC键盘按键引发int 09h中断,键盘的输入达到60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息。CPU检测到该中断信息后,如果IF=1,则响应

25、中断,引发中断过程,转去执行int 9中断服务程序。通过中断向量的设置修改中断服务程序为调速中断服务程序。2、计算当前油量模块的设计,此模块通过我的简化后程序较为简单。我主要简化了计算油量的相关数据处理,采用计程车每走一公里油量变化一次的思路来编写程序,而没有采用实时更新油量的计算方法,因此大大简化此模块的长度。当油量第一次小于油量警戒值时播放报警声音,油量继续减小时不在报警。当油量为0时,强制停车,显示本次计价结果一段时,清零并返回DOS。3、等待计价模块的设计,当速度为0时,程序进入等待计价子模块,进入时去一次系统时间作为等待计价的开始时间,并显示提示语言,中间通过按键中断可以加速跳出等待

26、计价模块到计算里程计价模块,或者按停止键“q”停止计价,显示一段时间清零并返回DOS。速度为0期间,不断循环取当前系统时间与开始时间作差,比较并判断是否调价,调价时间间隔自行设定。所有子模块编写完成后,我们组四个人开始综合子模块到主程序中,并进行调试。调试过程遇到了多个问题:当速度为0时跳入等待计价模块后,如果采用按键查询“q”退出,不起作用,最后改成按键中断就能很好的跳出来,分析原因可能是加减速键是采用的按键中断,整个过程中断都处于打开的状态,若采用按键查询的int 16功能会被屏蔽。在等待计价期间第一次按加速键“+”会很不灵敏,有时按多次都没反应,抱着尝试的心态在取当前时间并计算等待时长后

27、面加一个延时语句,再跳转回去做下一次取时计算等待时间,最后竟然很好的解决了按键不灵敏的问题,从中可分析出原因是取系统时间的中断会影响按键中断。还有在开始运行程序的时候计价总价和油量变化相当快,不符合我们的设计要求和理论结果,最后在计算里程计价模块中发现了一小点逻辑错误,修改后程序正确无误的运行了起来。本次为期两周的课程设计就像一个小项目一样,小组成员需要分工合作编写各自的子模块,并综合起来调试,很好的体现了我们的团队合作能力,既提高了我与组员之间的协调沟通能力和团队合作意识,也很好的锻炼了我的编程能力和逻辑思维能力,不管以后是为继续深造还是工作,都打下了坚实的基础。6.参考文献1.杨天怡主编.

28、计算机硬件基础(A).重庆大学出版社2.黄勤主编.计算机硬件技术基础实验教程.重庆大学出版社3.王爽主编.汇编语言(第二版).清华大学出版社 4.汇编语言指令大全(详解版)7.附录.486data segmentdisp_start db please press the s key to start the taxi!,0ah,0dh,$ ;开、停车提示语xwtz0 db ,0ah,0dh,$ xwtz db pleas press on the key q to stop the car ?,0ah,0dh,$pricing db ? ;定义两个内存空间,存入需要用的起步价和单价ppm d

29、b ?pricing1 db ? ;定义两个内存空间,临时存入白天的起步价和单价ppm1 db ?pricing2 db ? ;定义两个内存空间,临时存入晚上的起步价和单价ppm2 db ?keybuf db 10 ;定义一个存字符串的数组count db ?keynum db 10 dup(?)mess0 db please set the prices (0.0-9.9 yuan),0ah,0dh,$mes1 db the start price of day: ,$mes2 db 0ah,0dh,the pice per kilometer of day: ,$mes3 db 0ah,0

30、dh,the the start price of night: ,$mes4 db 0ah,0dh,he pice per kilometer of night: ,$mes5 db 0ah,0dh,press d or n to judge the day or night,0ah,0dh,$tt db totaltime:,0ah,0dh,$ ;实时显示字符串缓冲区tt1 db wait time:,0ah,0dh,$ tp db totalprice:,0ah,0dh,$ttd db 0:00:00,0ah,0dh,$ttd1 db 0:00:00,0ah,0dh,$tpd db 00

31、0.0 yuan,0ah,0dh,$disp1 db speed: 000 km/h,0dh,0ah,$disp2 db current oil: 000 L,0ah,0dh,$disp3 db total distance: 000 km,0ah,0dh,$ttd0 db 0:00:00,0ah,0dh,$ ;初始化显示字符串,清零ttd10 db 0:00:00,0ah,0dh,$tpd0 db 000.0 yuan,0ah,0dh,$disp10 db speed: 000 km/h,0dh,0ah,$disp20 db current oil: 000 L,0ah,0dh,$disp3

32、0 db total distance: 000 km,0ah,0dh,$minite db ?second db ?msecond dw ?daytime db ?mile dd 0p dw 0 ;计价的总价格miletest dd 3000miletest1 dd 1000priceflag db 0timea dw ? ;开始计价时刻的时和分timeb dw ? ;停止计价时刻的秒timec dw ? ;停止计价时刻的时和分timed db ? ;停止计价时刻的秒time1 dw ?time2 dw ?time3 dw ?time4 dw ?t1 dw ?t2 dw ?t3 dw ?t4

33、 dw ?flagtime db 0 ;为0表示与初始时间做时间差chesu db ?time_lag dw 10 ;设置等待计价的时间间隔totallag dw 10 ;定义总时间间隔标志位,等待计价time5_1 dw ? ;时time5_2 dw ? ;分time6_1 dw ? ;时time6_2 dw ? ;分time_flag db 0time_wait dw 0msecond1 dw 0msecond0 dw 0wait1 dw 100freq dw 261 ;设置警报声的频率和时间长度slong dw 01ffhspeed db 00h ;出租车车速0255kmchesu db

34、 00h ;折算速度,一小时按以分钟计算,模拟运行keep_es dw ?keep_bx dw ?disp dw ?oil_total dw 100 ;设置本次运行的总油量oil_current dw ? ;当前油量oil_pm db 1 ;每公里耗油量oil_warn dw 20 ;设置油量警戒值oil_flag db 0 ;油量报警标志位gongli db 0 ;总里程整数公里数hang db ? ;光标显示初始行位置lie db ? ;光标显示初始列位置data endscode segmentmain proc far assume cs:code,ds:datastart:mov a

35、x,data mov ds,ax lea dx,disp_start ;启动车提示语 mov ah,09h int 21h jxx1:mov ah,01h ;继续等待时间,检测按键和车速 int 16h jz jxx1 ;无键按下,跳转jxx1,继续等待按键 mov ah,0 int 16h cmp al,s ;有开始键按下,跳转 jz kaishi jmp jxx1 ;无开始键按下,跳转,继续等待 kaishi:lea dx,mess0 ;设置起步价,单价提示语 mov ah,09h int 21h call srdq ;设置白天,晚上的起步价和单价子程序 ;设置按键中断,并开中断 cli

36、;清中断标志位 mov ah,35h ;读取原中断向量 mov al,09h int 21h mov keep_es,es mov keep_bx,bx push ds mov dx,offset jsd ;装入自编键盘中断程序的中断矢量 mov ax,seg jsd mov ds,ax mov ah,25h mov al,09h int 21h pop ds in al,21h ;允许键盘中断 and al,0fdh out 21h,al sti ;开中断 mov bh,00h ;记录须显示的初始光标的位置 mov ah,03h int 10h mov hang,dh mov lie,dl

37、call xscsh ;显示初始化 again:cmp speed,0 ;检测速度是否为零 jz again call getsystime1 ;调用取开始时间子程序 jmp lllp1qushi:mov dh,hang ;等待计时结束后,即速度重新由零变为正,跳转到的位置 mov dl,lie add dh,9 mov bh,00h mov ah,02h int 10h ;置光标位置 lea dx,xwtz0 mov ah,09h int 21h ;清楚屏幕停车提示语 mov dh,hang ;置光标回到初始位置 mov dl,lie mov bh,00h mov ah,02h int 10

38、h call systime ;调用取当前时刻时间子程序lllp1:mov ecx,00ffffffh ;延时,可调时长 xh0:loopd xh0 lllp0:call systime ;再次调用取当前时刻时间子程序 call duration ;计算相邻两次调用时间的时间差 mov cl,speed cmp cl, 240 jbe lllp mov speed,240lllp:call jichesu ;折算车速 call price ;计算总里程和总价格 call youhao ;计算当前油量 call show_zcx ;时间,总价,车速,油量,总里程显示子程序 cmp speed,0

39、 ;判断速度是否为零 jz jjdd ;速度为零跳转到等待计价模块 mov ecx,00ffffffh ;延时,可调xh1:loopd xh1 jmp lllp0jjdd:call ddjj ;跳到等待计价子程序模块 tuichu:call show_zcx ;显示子程序 mov ecx,0bfffffffhyanshi10:loopd yanshi10 ;显示一段时间 清零 call xscsh ;显示初始化,清零 mov dh,hang mov dl,lie add dh,10 ;光标跳到新的一行显示结束,返回dos mov bh,00h mov ah,02h int 10h mov ah

40、,4ch ;按任意键返回Dos int 21h main endp;屏幕时间,总价,速度,油量和总里程显示子程序 ;show_zcx proc near pusha call getsystime2 call totaltime call totalprice call ddjs call speed_disp call oil_disp call distance_disp mov dh,hang mov dl,lie mov bh,00h mov ah,02h int 10h popa retshow_zcx endp;设置白天或者晚上起步价和单价子程序;通过键盘输入判断白天黑夜,分别设置

41、不同的起步价和单价; srdq proc near pusha;分别输入白天晚上的起步价和单价 lea dx,mes1 mov ah,09h int 21h lea dx,keybuf mov ah,0ah int 21h call erjzzh mov pricing1,bl lea dx,mes2 mov ah,09h int 21h lea dx,keybuf mov ah,0ah int 21h call erjzzh mov ppm1,bl lea dx,mes3 mov ah,09h int 21h lea dx,keybuf mov ah,0ah int 21h call erj

42、zzh mov pricing2,bl lea dx,mes4 mov ah,09h int 21h lea dx,keybuf mov ah,0ah int 21h call erjzzh mov ppm2,bl lea dx,mes5 mov ah,09h int 21hl: mov ah,01h ;检测是否有键按下。 int 16h jz l mov ah,0 ;有,就读入这个键,分别和d和n的ascii比较, int 16h ;读入是d就讲转换的白天值存入内存,反之则存入晚上的内存 cmp al,d jz day cmp al,n jz night jmp lday: mov dl,p

43、ricing1 mov pricing,dl mov dl,ppm1 mov ppm,dl jmp l1night: mov dl,pricing2 mov pricing,dl mov dl,ppm2 mov ppm,dl l1: popa retsrdq endp ;将白天和晚上的单价和起步价分别转换为整数角;输入的单价和起步价在0.19.9之间;erjzzh proc near push ax push cx push di lp: mov bl,0mov di,0 mov al,keynumdisub al,30h ;转换输入的第一位mov cl,10mul clmov bl,alin

44、c di mov al,keynumdi cmp al,2eh ;判断是整数还是小数,是整数就直接跳出,是小数就继续运算十分位。jnz llp0inc di ;跳过小数点mov al,keynumdisub al,30hadd bl,al ;将得到的结果存入寄存器blllp0:pop dipop cx pop ax reterjzzh endp;等待计价子程序;ddjj proc neat pusha mov dh,hang ;置光标位置 mov dl,lie add dh,9 mov bh,00h mov ah,02h int 10h lea dx,xwtz mov ah,09h int 21h ;显示提示语 是否按键停止计价停车,q键 mov dh,hang ;置光标初始位置 mov dl,lie mov bh,00h mov ah,02h int 10h jxdd: mov ah,2ch ;dos 2c号功能调用,获取系统时间,ch,cl,dh分别存放小时,分钟,秒. int 21h mov time5_1,cx mov time5_2,dx in al,60h ;开按键中断int 21h的09h号功能,读键的扫描码push ax ;不能使用int 16h的01h和00h号功能in al,61hor al,80hout 6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论