汇编课程设计 时钟

微机原理与接口技术课程设计 

与其每天下班无聊看电影还不如花点时间做点事情,最近想写写博客,把本科研究生做的事情写写。

这是本科的时候做的微机原理课程实验,纪录如下

前言:汇编语言是面向机器的程序设计语言。 也是一门非常有趣的语言,本文详细地介绍了我的时钟设计的整个过程。

一总体功能设计介绍:

一时间显示:

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 2102h是设置光标

    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 2102h是设置光标

     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进制时减2420h,其它减1812h

      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  ;alBCD码转换为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)结束



图为十二进制显示



图为二十四进制显示




版权声明:本文为qq943574281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。