微机原理与接口技术课程设计
与其每天下班无聊看电影还不如花点时间做点事情,最近想写写博客,把本科研究生做的事情写写。
这是本科的时候做的微机原理课程实验,纪录如下
前言:汇编语言是面向机器的程序设计语言。 也是一门非常有趣的语言,本文详细地介绍了我的时钟设计的整个过程。
一总体功能设计介绍:
一时间显示:
1实现选择时间的十二进制显示和二十四进制显示
2如果是十二时制显示,实现显示上午(am)下午(pm)
二日期显示:
从接口中只能得到年分的后两位,此程序实年分的前两位显示(如:2011-6-9 一般显示为11-6-9 此程序显示为:2011-6-9),并且实现显示相应的跳转(如从2099年到2100年)
三 实现清屏操作
把屏幕清理干净,使其只显示时钟方面的信息,不显示一些不关信息,达到美观的效果。
四 实现时钟在恰当的位置显示
1 将时间显示移要理想位置
2 将光标隐藏起来,达到比较满意的显示效果
五 采用调用各子程序的形式
采用调用子程序的功能,使程序美观,可读性强
二流程图
三 分块细解:
一、 移动光标到指定位置并隐藏光标
调用int10接口,实现移动光标,隐藏光标的功能。
cursorproc;;;确定光标所在位置
push eax
push ebx
push ecx
push edx
inc ha ;行ha初始位置09h,显示后增到下行
mov dh,ha ;行数
mov dl,35 ;列数
mov ah,02h ;int 21的02h是设置光标
int 10h ;确定光标的位置,使其居在中间
mov cx,2000h ;隐藏光标
mov ah,01h ;int 21中的01h为设置光标形状
int 10h ;;;
pop edx
pop ecx
pop ebx
pop eax
ret
cursorendp
cursor1proc;;;确定光标所在位置,并将其隐藏
push eax
push ebx
push ecx
push edx
mov dh,0dh ;需不断刷新在原地显示,所以行数不变
mov dl,35 ;列数
mov ah,02h ;int 21的02h是设置光标
int 10h ;确定光标的位置,使其居在中间
mov cx,2000h ;隐藏光标
mov ah,01h ;int 21中的01h为设置光标形状
int 10h ;;;
pop edx
pop ecx
pop ebx
pop eax
ret
cursor1endp
二、 选择十二进制显示二十四进制显示
Int1ah中当ah=02,时获取系统时间,ch以BCD码形式存入小时,c l放分,dh放秒,分别存放在hour,send,mint变量当中,当hour>12时,且选择了十二进制显示,则将hour-12,并显示下午(如22点,则为10 pm,11点则为11am),小时在19时到22时之间化12进制时减24(20h),其它减18(12h)
三、 从系统中得到时间:
mov ah,02 ;获取系统时间
int 1ah ;系统时间调用
mov hour,ch
mov mint,cl
mov secnd,dh
call print
四、 ;显示时间
cmp choice,49;时钟显示方式
je twe
mov al,hour
call disphb
mov al,':'
call dispc
mov al,mint
call disphb
mov al,':'
call dispc
mov al,secnd
call disphb
jmp ext
twe:;mov hour,23h
mov al,hour
cmp al,12h
ja pm
mov al,hour
call disphb
mov ampm,'ma'
jmp go
pm: mov al,hour
cmp al,19h;时在19时到22时之间化12进制时减24(20h),其它减18(12h)
ja ok1
sub al,18
jmp ok2
ok1: cmp al,22h
ja ok2
sub al,24
jmp ok3
ok2: sub al,18
ok3: call disphb
mov ampm,'mp'
jmp go
go: mov al,':'
call dispc
mov al,mint
call disphb
mov al,':'
call dispc
mov al,secnd
call disphb
mov ax,ampm
call dispc
mov al,ah
call dispc
ext: pop eax清屏:
因为屏幕上很可能有显示,所以当要移动光标到屏幕中间显示时间时,周围有许多无关显示,所得界面十分不美观。
图一:为清屏前的显示 图二:为清屏后的显示
由两图比较,清屏效果不言而喻。
下面是清屏代码:
clear proc ;清屏子程序
push eax
push ebx
push ecx
push edx
mov ax,0600h
mov cx,0000h
mov dx,184fh
mov dx,184fh
mov bh,07h
int 10h
pop edx
pop ecx
pop ebx
pop eax
ret
clear endp
运用int 10h的相关功能,调用相应的接口实现:
五、 通过相应的接口得到日期
cmosram 9,8,7依次存放着年月 日 70h输出71h输入
得到的年,月,日,分别放在year,mouth,day,中,期中year转化为十进制数,以便实现如从2099年到2100年的跳转,mouth,day直接用BCD码形式。
date proc;时间显示子程序
push eax
mov al,9 ;cmos ram 9,8,7依次存放着年月日70h输出71h输入
out 70h,al
in al,71h
mov ah,al ;将al由BCD码转换为10进数
and ah,11110000b
and al,00001111b
shr ah,1
add al,2
add al,ah
mov year ,al
mov al,8
out 70h,al
in al,71h
mov mouth,al
mov al,7
out 70h,al
in al,71h
mov day,al
pop eax
ret
date endp
六、 通过相应的接口得到时间显示,由中断判断是否有键盘输入,用输入的字符判断,如有且为空格,则停止运行。
a1: mov ah,0bh ;调用DOS功能0BH检测键盘是否有输入
int 21h
cmp al,00h ;检测是否有输入00h表无字符输入,ffh表有输入
jne a2 ;有则跳到a2
jmp go ;没有则回到go
a2: mov ah,08h
int 21h
cmp al,32
je ex ;是则退出
jmp go ;不是则跳到go
七、 主程序为:调清屏子程序,调时间子程序,调移动光标程序
includeio16.inc
.data
…..见源码
.
.
.
mov choice,al
mov ha,0ah
mov lie,35
call cursor
mov eax,offset pdate
call dispmsg
mov ha,0ch
mov lie,35
call cursor
mov eax,offset ptime
call dispmsg
call time
附件、 运行结果如图:
按空格(32)结束
图为十二进制显示
图为二十四进制显示