版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微原第二次软件实验一、 实验要求编写一程序,在显示器上显示时、分、秒。具体要求如下:1) 借用计数器8253的Timer()作为中断源,通过8259A向CPU发中断,每10ms产生一次中断;2) 在中断服务程序中管理刷新时、分、秒;3) 输入文件名后清屏显示:Current time is : XX:XX:XX(时、分、秒键盘输入);4) 当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。二、 设计思路1) 数据段定义四个字符串,分别用于显示程序功能、提示用户输入,显示当前时间以及错误格式输入提示。同时定义六个变量用于存储当前显示的的时、分、秒的十位及个位,一个变量count10
2、0用以中断计数;2) 在BIOS功能调用中,令AH=6,设置窗口左上角、右下角行列位置使当前页上滚,从而实现程序一开始的清屏功能;3) 提示用户输入起始时间时,需要对输入格式进行判断,严格要求输入在00:00:00至23:59:59,正确输入时则存入相应的变量中,输入任意键开始计时,错误时则屏幕显示输入错误,提示用户重新进行输入,若输入为“CTRL+C”时退出程序;4) 利用8253作为中断源,输入控制字36H,时间常数为11932,使其选用通道0计数,产生频率100Hz的方波,即中断100次时间间隔为1s,时间刷新显示;5) 8253中断源每中断一次,进入timer中断子程序,将其段基地址及
3、段内偏移量存入中断向量表,利用8259向CPU发出中断;6) timer子程序会对中断次数进行判断,每中断满100次时根据当前时间进行相应的时、分、秒修改,若不满100次时直接退出中断;7) 屏幕显示时将时、分、秒的十位和个位分别送人al中,在BIOS功能调用中令ah=14h,实现将al中的字符写到光标位置,并将光标进一,8次循环直到时钟完全显示,同时比对second,中断满100次时,即时间间隔1s时second变化,当检测到这一变化时重新进入disp刷新显示;8) 在每秒变化需要刷新显示时,都先进行键盘输入判断,当有输入且输入为“ctrl+c”时,退出程序。三、 程序流程1) 主要程序流程
4、图2) 中断程序流程图四、 源代码data segment count100 db 100 tenhour db 0 hour db 0,':' tenmin db 0 minute db 0,':' tensec db 0 second db 0 s1 db '(00:00:0023:59:59 "Ctrl+C" to exit key to start)$'s4 db 'Starting time is:$' s2 db '("Ctrl+C" to exit)Current ti
5、me is:$' s3 db ' Error!',0dh,0ah,'$' data ends stack segment stack db 256 dup(0) stack ends;回车换行宏定义 CRLF MACRO mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h ENDM code segment assume ds:data,cs:code,ss:stack start:mov ax,data mov ds,ax mov es,ax ;清屏 mov al,0 ;整个窗口为空白 mov ch,0 ;
6、窗口左上角的行位置 mov cl,0 ;窗口左上角的列位置mov dh,24 ;窗口右下角的行位置 mov dl,79 ;窗口右下角的列位置 mov bh,7 ;正常显示属性mov ah,6 ;当前显示页上滚功能调用号int 10h ;I/O中断调用begin: mov dx,offset s1 mov ah,09h ;程序提示 int 21h CRLFmov dx,offset s4 mov ah,09h ;提示输入 int 21h mov bp,0;分输入正确后加一,跳转为秒输入判断mov di,offset tenhour mov ah,01hint 21hcmp al,03hjnz g
7、oon1;读取第一位,不为ctrl+c则继续键入mov ah,4chint 21hgoon1:mov bl,'0' ;第一位为0到2 cmp al,bl jl tiaoban mov bl,'2' cmp al,bl jg tiaoban mov di,al ;存入tenhour mov bh,alinc di mov ah,01hint 21hcmp al,03hjnz goon2;读取第二位,不为ctrl+c则继续键入mov ah,4chint 21hgoon2:cmp bh,'2' ;如果第一位为2,则第二位为0到3 je tenhour2
8、 mov bl,'0' ;第二位为0到9 cmp al,bl jl tiaoban mov bl,'9' cmp al,bl jg error mov di,al ;存入hourjmp nextchar tiaoban:jmp error;用于跳转tenhour2: mov bl,'0' cmp al,bl jl error mov bl,'3' cmp al,bl jg error mov di,al nextchar: inc di mov ah,01hint 21hcmp al,03hjnz goon3;读取第三位,不为ct
9、rl+c则继续键入mov ah,4chint 21hgoon3: mov bl,':' ;第三位为: cmp al,bl jne error inc di mov ah,01hint 21hcmp al,03hjnz goon4;读取第四位,不为ctrl+c则继续键入mov ah,4chint 21hgoon4:mov bl,'0' ;分、秒均为00-59 cmp al,bl jl error mov bl,'5' cmp al,bl jg error mov di,al ;存入tenmin或tensecinc di mov ah,01hint
10、21hcmp al,03hjnz goon5;读取第五位,不为ctrl+c则继续键入mov ah,4chint 21hgoon5:mov bl,'0' cmp al,bl jl error mov bl,'9' cmp al,bl jg error mov di,al ;存入minute或secondinc bp cmp bp,1 ;bp为1则继续读取秒钟输入je nextchar signal:mov ah,0bh;输入任意键开始计时int 21hor al,aljz signal;无输入继续检测,有输入才开始CRLF ;换行回车jmp init error:
11、 mov dx,offset s3 mov ah,09h int 21h ;显示错误提示信息JMP begin ;重新读取init: cli ;关中断mov ax,0 mov es,ax ;置附加段基地址为0mov di,20h ;中断号08h*4 mov ax,offset timer ;中断程序的段内偏移量 stosw ;偏移量存入中断向量表mov ax,cs ;中断程序段基地址stosw ;段基地址存入中断向量表mov al,36h ;选用0通道计数器,采用3号方式(方波)计数out 43h,al mov bx,11932 ;时间常数,输出100HZ方波mov al,bl out 40h
12、,al mov al,bh out 40h,al mov al,0fch out 21h,al ;21h端口为中断屏蔽寄存器,用以开发外部中断sti ;开中断;屏幕显示当前时间,变化时刷新显示disp: mov ah,0bhint 21hor al,aljz noexit;系统无输入时不退出mov ah,08hint 21hcmp al,03hjnz noexitmov ah,4chint 21hnoexit:mov dx,offset s2 mov ah,09h int 21h mov bx,offset tenhour mov cx,8 dispclk:mov al,bx call dis
13、pchar inc bx loop dispclk ;时分秒存入al并显示mov al,0dh call dispchar mov al,second ;时间变化时秒个位必变化next: cmp al,second je next ;无变化时循环jmp disp;有变化时刷新显示;中断一百次即为1s,时间相应变化timer proc far push ax dec count100 jnz timerx mov count100,100 inc second cmp second,'9' ;小于等于9,即之前秒个位为0-8jle timerx ;秒个位0-8,变化后秒个位加1显
14、示即可mov second,'0' ;原个位为9,变化后为0inc tensec cmp tensec,'6' jl timerx ;加1后小于5,即原秒十位为0-4,十位加1即可显示mov tensec,'0' inc minute;与秒同理cmp minute,'9' jle timerx mov minute,'0' inc tenmin cmp tenmin,'6' jl timerx mov tenmin,'0' inc hour cmp tenhour,'2
15、9; jl nexth cmp hour,'3' jle timerx mov hour,'0' mov tenhour,'0' jmp timerx nexth: cmp hour,'9' jle timerx adjhour:inc tenhour mov hour,'0' timerx: mov al,20h out 20h,al pop ax iret ;中断退出timer endp dispchar proc push bx mov ah,14 ;写字符到光标位置,光标位置加1 int 10h pop b
16、x retdispchar endp code ends end start五、 子程序清单1) 子程序名:timer;功能:判断中断计数是否满100次,若已满对时间做出相应的修改;入口参数:无;出口参数:无;使用寄存器:AX,FR。2) 子程序名:dispchar;功能:写入相应字符至光标位置,并将光标前进一位;入口参数:al,用以存储待写入的字符;出口参数:无;使用寄存器:AX,BX。六、 程序分析1) 本程序一开始利用INT 10H进入BIOS功能调用,通过当前页上滚实现清屏功能,采用用户键入得到现行时钟起始值,利用INT 21H读取用户键盘输入,等待用户正确输入后开始计时;2) 利用8
17、253作为中断源,43H端口是8253三通道定时器中的命令寄存器,所使用的命令字36H表示选用0通道定时器,以3号方式(产生方波)计数。向端口40H送出的计数器初值选用11932是要求8253每秒发出100次时钟中端(08H),将本程序中的timer的起始地址送入中断的入口地址,保证每次发生08H中断时,程序自动进入timer;3) 程序运行的大体过程为:主程序显示时钟值,发生中断08H时进入timer,查看中断计数是否达到100次,若没有达到次数直接退出中断返回主程序;若已达到,则时间又过了1s,对个数据进行修改后返回主程序;4) 本程序的时钟显示范围是00:00:00至23:59:59,因而在计时至23:59:59时,下一秒将时间修改为00:00:00,针对不同的时间改变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工序不良统计和分析
- 《技能成就精彩人生》中职全套教学课件
- 小型农机买卖合同范本
- 平房翻新改建合同范本
- 工厂签约中介合同范本
- 委托经营酒类合同范本
- 学校聘用老师合同范本
- 房子出租拼租合同范本
- 工程合同结算补充协议
- 家属生病劳动合同范本
- 合伙开厂合作协议范本及注意事项
- 黑龙江省牡丹江市普通高中2024-2025学年高二上学期1月期末考试英语试卷(含音频)
- 大学美育课件 第十二章 生态美育
- 美国技术贸易壁垒对我国电子产品出口的影响研究-以F企业为例
- 2025至2030中国电站汽轮机行业项目调研及市场前景预测评估报告
- 泌尿系统疾病总论
- 靶向阿托品递送系统设计-洞察及研究
- 救护车急救护理查房
- 安徽省工会会员管理办法
- 阳原王瑞雪培训课件
- CJ/T 186-2018地漏
评论
0/150
提交评论