汇编课程设计——时钟
任务二
一、任务内容
要求:
- 在屏幕特定位置显示当前系统日期和时间;
- 显示的日期和时间要求即时更新,即设计为跳动的时钟;
- 可自定义电子钟的显示区域、显示位置、背景和前景色或以图形化方式显示;
- 当按下某个键,如“Q”时,程序返回DOS,数字钟消失。
提高:
再设计一款倒计时,倒计时时间由用户设定(如30分钟),时间到有提示(如时间背景、前景色变化或文本提示等)。
二、设计思路
三、实现代码(该部分代码来自于一个博主文章)
//文件名2.asm
;===========
;数据段data
;===========
data segmentcount dw 1info db 'Current time is:',0dh,0ah,'$' ;提示语datestr db '00-00-0000',0dh,0ah,'$' ;日期显示信息:month-day-yeartimestr db '00:00:00',0dh,0ah,'$' ;时间显示信息:hour:minute:second
data ends
;===========
;代码段code
;===========
code segmentassume cs:code,ds:data
main proc far
start:mov ax,datamov ds,ax;调色、位置(时钟日期显示的位置以及背景色、字体颜色)mov ah,0 mov al,3 int 10hmov ah,6mov al,0 ;al=0 全屏幕为空白mov bh,00000100b ;背景色0000黑色,0100红色(黑底红字)mov ch,0 ;左上角行号mov cl,0 ;左上角列号mov dh,50h ;右下角行号mov dl,50h ;右下角列号int 10h ;保存原中断向量mov al,1chmov ah,35hint 21h ;获取1ch中断向量到es:bxpush espush bxpush ds ;保存;设置新的中断向量mov dx,offset intpromov ax,seg intpromov ds,axmov al,1chmov ah,25hint 21h ;设置中断向量ds:dxpop dsin al,21h ;读中断屏蔽寄存器and al,11111110b ;开定时器中断out 21h,al ;写中断屏蔽寄存器sti ;开中断;等待中断
s:mov ah,1int 21hcmp al,'q' ;'q'退出jz quitjmp s;恢复1ch原中断向量
quit: pop dxpop dsmov al,1chmov ah,25hint 21h;调色、位置(跳出时钟效果后的背景色以及字体颜色)mov ah,00hmov al,03hint 10hmov ah,06hmov al,00h ;al=0 全屏幕为空白mov bh,00000111b ;背景色0000黑色,
0111白色(黑底白字)mov ch,0h ;左上角行号mov cl,0h ;左上角列号mov dh,50h ;右下角行号mov dl,50h ;右下角列号int 10h mov ax,4c00hint 21hmain endp
;------------------------------------------------------
;中断处理intpro
;------------------------------------------------------
intpro proc near
;保护现场push dspush axpush cxpush dxmov ax,datamov ds,axstidec countjnz exit;显示提示("current time is:"的显示位置)mov ah,02hmov bh,0h ;页号mov dh,0ah ;行号mov dl,20h ;列号int 10hmov dx,offset infomov ah,09hint 21hcall dispdatecall disptimemov count,18exit:clipop dxpop cxpop axpop dsiret
intpro endp
;----------------------------------------------------------
;显示日期子程序dispdate
;----------------------------------------------------------
dispdate proc nearpush ax ;al星期push cx ;cx年push dx; ;dh月 dl日push si
;获取系统日期:入口:ah<-2ah 出口:cx<-year dh<-month dl<-day mov ah,2ah ;2ah取系统日期int 21hmov ax,cx ;年份转4为ASCII码mov bx,10 lea si,datestr+9 ;指向字符串年份最后一位mov cx,4 ;年份4位,循环4次push dx ;保存月日
y:xor dx,dx ;dx清零,保存余数即个位div bx ;商存ax,余数存dxadd dl,30hmov [si],dldec siloop ypop dx ;还原dx,处理日mov al,dlxor ah,ahdiv bl ;求日的个位,存ah,十位存aladd ax,3030h ;分别转ASCII码sub si,2mov [si],ax ;存日mov al,dh ;处理月xor ah,ahdiv bl ;求月的个位,存ah,十位存aladd ax,3030h ;分别转ASCII码sub si,3mov [si],ax ;存日;显示提示(月-日-年显示位置)mov ah,02hmov bh,0h ;页号mov dh,0bh ;行号mov dl,22h ;列号int 10h
;显示日期字符串 mov dx,offset datestrmov ah,09hint 21hpop sipop dxpop cxpop axret
dispdate endp
;----------------------------------------------------------
;显示时间子程序disptime
;----------------------------------------------------------
disptime proc nearpush axpush cxpush dxpush si
;获取系统时间:入口:ah<-2ch,出口:ch<-hour,cl<-minute,dh<-secondmov ah,2chint 21hmov bl,10lea si,timestrmov al,ch ;处理小时xor ah,ahdiv bladd ax,3030hmov [si],axadd si,3mov al,cl ;处理分xor ah,ahdiv bladd ax,3030hmov [si],axadd si,3mov al,dh ;处理秒xor ah,ahdiv bladd ax,3030hmov [si],ax
;显示提示(时:分:秒显示的位置)mov ah,02hmov bh,0h ;页号mov dh,0ch ;行号mov dl,23h ;列号int 10h
;显示时间字符串 mov dx,offset timestrmov ah,09hint 21hpop sipop dxpop cxpop axret
disptime endp
code endsend start
四、调试结果及分析
分析:任务二不管在代码量上还是在思路上都比任务一难很多。还好老师给出了一部分的代码,不然真的不知道怎么下手。根据老师代码只需要将不断输出的时间改为在同一位置输出跳动。比如秒需要在同一位置跳动,就需要不断清空数据,然后输出数据,不断循环从而达到时钟实时跳动的效果。同时设置时钟显示的位置以及颜色。当输入’q’后,就恢复1ch原中断向量,重新设置跳出时钟效果后的背景色以及字体颜色(00000111黑底白字)。
操作指令:
运行结果:
加分题:
倒计时:设计一款倒计时,倒计时时间由用户设定(如30分钟),时间到有提示(如时间背景、前景色变化或文本提示等)。
设计思路:
代码部分(该部分代码来源于一个博主):
;================
;数据段data
;================
data segmentsinput db 'Please enter hours, minutes, and seconds : $' soutput db 'Any key to again and ESC to return.Time is : $' buf db 20hdb 0db 20h dup(0)timehour dw 0 ;时timeminute dw 0 ;分timesecond dw 0 ;秒num dw ?
data ends
;===============
;堆栈段stack
;===============
stack segment para stackdw 30h dup(0)
stack ends
;===============
;代码段CODE
;===============
code segmentassume cs:code,ds:data,ss:stack
start:mov ax,datamov ds,axmov al,11111101b ;关定时器中断out 21h,al ;中断屏蔽寄存器数据传回去push ds ;保存数据段地址mov ax,seg int08h ;seg取得标号的段地址mov ds,ax ;获得08h号中断的段地址,放在中断向量中mov dx,offset int08h ;获得08h号中断的偏移地址,放在中断向量中mov al,08h ;设置中断号mov ah,25h ;设置中断向量int 21h ;调用系统dos中断pop ds ;恢复数据段地址mov al,00110110b ;设置通道0的方式3out 43h,al ;输出控制字,43h是8253定时器芯片的控制寄存器地址mov ax,11932 ;定时器的时钟频率为1.1931817MHz,计数初值=1193182/100,10ms中断一次out 40h,al ;40h为计数器地址mov al,ah ;先输出低位,再输出高位out 40h,al ;40h为计数器地址
timing:
;换行mov dl,0dh ;crmov ah,2 ;显示一个字符int 21h ;调用系统dos中断mov dl,0ah ;lfmov ah,2 ;显示一个字符int 21h ;调用系统dos中断mov ah,09h ;显示字符串lea dx,sinput ;取段内偏移地址int 21h ;调用系统dos中断mov ah,0ah ;键盘输入到缓冲区lea dx,buf ;取段内偏移地址int 21h ;调用系统dos中断call inputtime ;调用子程序处理字符串mov ah,09h ;显示字符串lea dx,soutput ;取段内偏移地址int 21h ;调用系统dos中断mov dx,100 ;初始化为0mov al,11111100b ;开键盘和定时器中断out 21h,al ;中断屏蔽寄存器数据传回去re:mov ah,08h ;无回显键盘输入到alint 21h ;调用系统dos中断cmp al,27 ;按键是否ESCje do_esc ;是退出 cmp al,252 ;按键是否是指定字符je re ;是循环mov al,11111101b ;关定时器中断out 21h,al ;中断屏蔽寄存器数据传回去jmp timing ;不是就重新对时
do_esc:mov al,11111101b ;关定时器中断out 21h,al ;中断屏蔽寄存器数据传回去
;退出代码mov ah,4chint 21h
;----------------------
;输入数字inputtime
;----------------------
inputtime proc;初始化mov dx,0mov bx,10mov si,2mov num,0mov ax,0mov cx,0
lop:mov al,buf[si] ;寄存器相对寻址,从缓冲区取一个字符cmp al,0dh ;是否是crje final ;等于就跳转,JNE相反sub al,30h ;减30h,从ASCII码转数字cmp num,0 ;与0比较,相当于判断初始化je do_deal ;等于就跳转,JNE相反push ax ;当前数字压入栈中mov ax,num ;当前数送入运算寄存器中mul bx ;隐含寻址,在ax中,相当于num乘以10mov num,ax ;运算结果存进num中 pop ax ;之前的数据弹出
do_deal:add num,ax ;加上之前的数据mov ax,0 ;清零inc si ;自加1mov al,buf[si] ;寄存器相对寻址,从缓冲区取一个字符cmp al,' ' ;是否是空格je do_space ;等于就跳转,JNE相反jmp lop ;跳转,处理下一个
do_space:inc si ;偏移量再自加1,跳过空格mov dx,num ;把num存起来mov num,0 ;原先数清零inc cx ;标志自加1cmp cx,1 ;与1比较,判断是不是时je hour ;等于就跳转,JNE相反cmp cx,2 ;与2比较,判断是不是分je minute ;等于就跳转,JNE相反jmp lop ;跳转,处理下一个
hour:mov timehour,dx ;把时传送到变量jmp lop ;跳转,处理下一个
minute:mov timeminute,dx ;把分钟传送到变量jmp lop ;跳转,处理下一个
final:mov dx,num ;把num存起来mov timesecond,dx ;把秒传送到变量
;换行mov dl,0dh ;crmov ah,2 ;显示一个字符int 21h ;调用系统dos中断mov dl,0ah ;lfmov ah,2 ;显示一个字符int 21h ;调用系统dos中断ret ;子程序退出重置堆栈
inputtime endp
;-----------------------------
;显示数字num shownum
;-----------------------------
shownum proc;第一位mov bl,100 ;%先除100mov ax,num ;送入运算寄存器div bl ;除法,ax隐含寻址add al,30h ;商转换为ASCII码push ax ;将余数先压入栈中cmp al,30h ;看一看首位是不是0je bittwo ;若是,则不显示直接跳转到下一个mov dl,al ;传送字符mov ah,2 ;显示一个字符int 21h ;调用系统dos中断
bittwo:pop ax ;将余数取出;第二位mov al,ah ;送入运算寄存器mov ah,0 ;高位清零mov bl,10 ;%再除以10div bl ;除法,ax隐含寻址add al,30h ;商转换为ASCII码push ax ;将余数先压入栈中mov dl,al ;传送字符mov ah,2 ;显示一个字符int 21h ;调用系统dos中断pop ax ;将余数取出;第三位add ah,30h ;余数转换为ASCII码mov dl,ah ;传送字符mov ah,2 ;显示一个字符int 21h ;调用系统dos中断ret ;子程序退出重置堆栈
shownum endp
;-------------------------
;08h计数器中断 int08h
;------------------------
int08h proc near;保护现场push axpush bxpush cxcmp dx,100 ;计数达到100,执行一次,相当于1s一次jge count ;大于等于100就跳转jmp endint ;没达到就结束中断响应
count:mov dx,0 ;计数值清零push dx ;保存计数值mov ah,03h ;获取光标位置信息int 10h ;BIOS中断push dx ;将获得的信息压入栈中mov ax,timehour ;传送指令mov num,ax ;传送指令call shownum ;调用子程序显示数字mov dl,':'mov ah,2 ;显示一个字符int 21h ;调用系统dos中断mov ax,timeminute ;传送指令mov num,ax ;传送指令call shownum ;调用子程序显示数字mov dl,':'mov ah,2 ;显示一个字符int 21h ;调用系统dos中断mov ax,timesecond ;传送指令mov num,ax ;传送指令dec ax ;秒数自减1mov timesecond,ax ;传送指令call shownum ;调用子程序显示数字pop dx ;将之前的光标信息从栈中取出mov bh,0 ;显示到第一页mov ah,02h ;设置光标位置int 10h ;BIOS中断pop dx;进位处理cmp timesecond,0 ;小于等于0,退一位jle secondcarry ;秒数jmp endint ;中断返回
secondcarry:mov timesecond,59 ;秒数得到借位dec timeminute ;分钟自减1cmp timeminute,0 ;小于等于0,退一位jle minutecarry ;分钟退位jmp endint ;中断返回
minutecarry:mov timeminute,59 ;分钟得到借位dec timehour ;小时自减1cmp timehour,0 ;小于等于0,清零退出jle hourcarry ;清零退出jmp endint ;中断返回
hourcarry:mov timehour,0 ;清零jmp endint ;中断返回
endint:;中断返回mov al,20hout 20h,al ;发送中断结束指令;恢复现场pop axpop bxpop cxinc dx ;计数加一iret ;中断返回
int08h endp
code endsend start
运行结果:
分析:在网上找了很多关于计时器的代码,一个个试,终于找到了一个可以运行成功的计时器,然后通过对代码的理解(有些代码还是不能理解)。之后我直接在计时器代码上修改,只改变了计算时间部分的代码实现了递减的效果。
汇编课程设计——时钟相关推荐
- java模拟时钟课程设计_java课程设计-时钟图形模拟
java课程设计-时钟图形模拟 计算机与信息工程系 <高级语言程序设计>课程设计报告课 程 设 计 任 务 书专 业 通信工程 班 级 13 级四班 姓 名 张凯铭设 计 起 止 日 期设 ...
- java时钟课程设计,Java课程设计-时钟图形模拟
<Java课程设计-时钟图形模拟>由会员分享,可在线阅读,更多相关<Java课程设计-时钟图形模拟(19页珍藏版)>请在人人文库网上搜索. 1.课 程 设 计 任 务 书专 业 ...
- 英语字母表计算机,计算机汇编课程设计CCCC.pdf_给定一个英文ascii码文件,统计文件中英文字母的频率,以十进制形式输出。,wwwwwxxxxx...
1.给定一个英文ASCII码文件,统计文件中英文字母的频率,以十进制形式输出. 2.用递归计算n!(n≥50), 以十进制数输出 输入一个不小于50的整数n,用递归计算n!, 以十进制数输出 3.存储 ...
- 小球碰壁反弹加分_汇编课程设计——小球碰壁
汇编语言程序设计 课程设计说明书 一.需求分析 功能需求: 对小球的描绘. 移动以及碰撞反弹的运动情况. 画球的主要思路是画出圆心 相同. 半径依次递减的圆组合起来即可得到一个球, 其核心算法是 Br ...
- android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告
#include #include unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//欢迎界面 ...
- 汇编课程设计:音乐播放器详解
程序说明: 这是一个音乐程序,按大写字母"A",唱乐曲"玛丽有只小羔羊": 按大写字母"B",唱乐曲"太湖船" 按大写字 ...
- 汇编课程设计:汽车小鸟动画
程序说明: 说明 运行可执行程序CAR.exe,选择1,小鸟飞过:选择2,汽车开过:选择3,退出. 函数图: DATA SEGMENT ;数据段 INFO1 DB 0DH,0AH,'INPUT 1,2 ...
- 51单片机课程设计——利用51单片机的定时器设计一个时钟论文
计科在读,分享自己做过的作业,欢迎指正,有需要课程设计论文的可以私信我 摘要 单片机是一种数字集成电路芯片,是指集成在一块芯片上的微型计算机.一个比较完整的单片机应该包括微处理器(CPU). 存储器( ...
- c语言图形时钟编程,C语言图形时钟课程设计实验报告.doc
C语言图形时钟课程设计实验报告.doc 目录 1.系统功能要求 . 2. 数据结构设计及 说明 . 3.程序结构(画流程图) . 4.各模块的功能 . 5.试验结果(包括输入数据和输出结果) . 6. ...
最新文章
- C02-程序设计基础提高班(C++)第9周上机任务-类和对象
- H2DBEngine——Driver的设计与实现
- 048_String对象
- PAT甲级1088 Rational Arithmetic:[C++题解]分数的加减乘除
- 服务器系统检测报告自动生成,生成allure测试报告之后,服务器端口无法访问查看生成的report,可能是这样引起的。...
- 第一章-从双向链表学习设计
- 数据库表的字段中含空格怎么办?
- Shiro实战hello
- 前5月全国快递业务量累计完成396.5亿件 同比增50.1%
- ckeditor 部分保存按钮去除_怎样去除mp4视频中的水印呢
- 批处理顺序执行多条命令
- python游戏程序代码大全_童年游戏,Python一行代码就能实现!
- 微信 openid 变吗?
- V2VNet: Vehicle-to-Vehicle Communication for Joint Perception and Prediction
- python操作gif 图片拆分
- 研究War3编辑器(2):地图编辑器基本操作
- python软件是免费的吗-python免费吗
- 高中数学知识点:集合知识讲解
- linux、centOS虚拟机出现entering emergency mode解决方案
- 嵌入式开发 SRAM SROM DRAM DROM DDR NAND FLASH EMMC 区别