电子钟-汇编程序
最近一段时间,在做一个题目,主要实现汇编语言下面的电子钟功能.提供主要的设置时间,设置闹铃,显示时间等功能。本来想从网上找个参考,也好让自己更快的完成任务,也更快的入手.没想到,这么大一个Internet竟然没有让我发现一个很好的参考,说的准确一点,其实是根本没有发现任何一个参考. 只有一个是没有完成的,只有大致轮廓,不过我觉得不可行,索性自己,查阅IBM-PC汇编语言程序设计,最后写了个出来,拿出来供大家学习参考.同时如有不妥善指出,希望大家批评指正..主要目的是为了促进提高大家的学习.
下面是程序,已经在MASM5下编译运行通过..但有个缺点,也是明显的,就是CPU占用率太多.日后有时间再更正好了.
--------------------------------------------------------------------------------------------------------------------------------------------------
(请尊重原创,如果引用,请注明出处.)
;***************************************************************************
;Author:
;Date : 2005/12/24
;College: Zhejiang University of Science and Technology
;Subject:A simple Colck program writen by Asmble language.
;function: Display Time
; Set Time
; Set Clock Ring
; Set Display Style
;***************************************************************************
;程序简介:
; 采用驻留中断程序的方式,将系统定时器提供给用户的ICH中断进行重新设计,加载新的
; 处理程序,使得每秒得到中断。主程序首先注册新的中断处理程序,从系统取得系统时间
; 然后无限等待,直到在中断程序中检测到有按键事件的发生,然后,主程序取消中断处理程序,
; 开始判断输入的键,然后根据相应的按键,提供相应的设计功能。
; 中断处理程序每次得到系统定时器的中断时,判断是否到达1秒(约18.2次为1秒)。如果到达
; 则,更新时间,存入数据区,然后更新数据的显示。当有按键事件发生时,设置数据区的按键
; 标记为'真'。当主程序检查到该标记为真时,则取消中断程序的驻留。然后处理相应的事件。
;
;主要步骤:
; 1.定义显示界面
; 2.调用系统时间,并将得到的二进制数值转换成ASCII码,将数据存入内存
; 3.定时的将存在内存区的时间数用显示字符串的形式显示出来(采用ICH中断)
; 4.获取键盘按键值,判断键值决定是否退出系统或执行其他功能
; 5.时间设定功能,通过键盘设定时,分,秒(时:分:秒)
; 6.闹钟功能,定时报声(时:分)
;
;存在的缺点:
; 1.对输入时间的格式没有严格控制,比如输入11:11:11 同11'11'11,或 11,11,11
; 同样的效果;
; 2.当程序运行时,由于主程序无限循环,然后等待中断刷新时间,因为无限循环,因此
; 占用CPU使用时间比较多。以后扩展可采用一些方式比如,WAIT,HLT等功能实现资源的
; 节省。
; 3.有些函数可以进一步进行抽象和整合。从而使得代码数量减少。
;
;参考书籍:IBM-PC汇编语言程序设计(第2版),沈美明,温冬婵,清华大学出版社
; 296页,中断向量的设置与恢复;
; 301页,定时器中断程序
; 389页,通用发声程序
;***************************************************************************
.model small
;-------------------------------------------------------------------------
.stack
;-------------------------------------------------------------------------
.data
HOUR db ?
MIN db ?
SEC db ?
MSEC db ?
NHOUR db 0 ;设置时间使用
NMIN db 0 ;设置时间使用
NSEC db 0 ;设置时间使用
RHOUR db 1 ;设置闹铃时间使用
RMIN db 1 ;设置闹铃时间使用
RSEC db 1 ;设置闹铃时间使用
FUNKEY db ? ;功能设置使用
keySw db 00h ;是否按键开关
RingSw db 00h ;闹铃开关
SWITCH db 0FFh ;刷新开关,真,则不断在定时器中断函数中刷新,否则不刷新
n db 0dh,0ah,'$'
count dw 1
sMsg db '**** welcome to Simple clock ****',0dh,0ah,'$'
qMsg db '**** Please Input q to quit ****',0dh,0ah
db ' ','**** Input s to set new Time ****',0dh,0ah
db ' ','**** Input r to set ringTime ****',0dh,0ah,'$'
setTMsg db 'Please Input new Time(HH:MM:SS)',0dh,0ah,'$'
setRMsg db 'Please Input Ring Time(HH:MM)',0dh,0ah,'$'
authorMsg db '---------------------------------------',0dh,0ah
db 'Author:ChengZengcun',0dh,0ah
db 'E-mail:bohemia1985@163.com',0dh,0ah
db 'Zhejiang University of Science and Technology',0dh,0ah
db 'Version 1.0',0dh,0ah
db 'Date:2005/12/23',0dh,0ah
db '---------------------------------------',0dh,0ah,'$'
;-------------------------------------------------------------------------
.code
PUSHA MACRO
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ENDM
POPA