电子时钟的设计及程序
- 格式:doc
- 大小:55.00 KB
- 文档页数:10
电子时钟的设计及程序
一.设计目的:
1. 理解掌握定时/计数器和中断的使用方法。
2. 掌握微机常用的输入输出方式及接口技术。
3. 掌握一定的汇编语言知识,培养自己的动手操作能力。
4. 学习程序设计的基本思路和方法。
二.程序内容:
第一部分:定义显示界面。
第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。
第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。
第四部分:获取键盘的按键值,以ESC键退出系统返回DOS。
三.程序设计原理:
首先在数据段开辟一显示缓冲区,用来存储系统时间。调用DOS中断,返回系统时间,并将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟数、秒数存入显示缓冲区,并最终存入一结束字符号’$’。调用DOS字符串显示功能将时间显示
出来。并调用屏幕I/O中断,定位光标的开始位置,结合着将时间显
示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷
新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。调用延时TIME延时中断服务程序,累加到存放秒值的寄存器DL中,并进行十进制调整。在累加的过程中,不断地对时、分、秒值进行比较,秒不能等于60,分不能等于60,时不能等于24。秒等于限制值时,则使秒值为0分值加1;分等于限制值时,则使分值为0时值加1;时等于限制值时,则使时值为0;时、分、秒值都不超过限制值时,就转显示屏输出。时间显示的刷新要配合延时程序进行,为了得到良好的显示效果,延时程序要尽量接近1秒,但又不能超过一秒,所以本程序调用了一段较精确的时间延迟程序。 利用BIOSS设计窗口,选择适当的背景和前景等,使屏幕显示更加完美。程序一旦进入运行,就将不间断地在显示屏显示时间,要想程序停止运行,可同时在键盘按下ESC键返回DOS系统。
四.程序流程图如下:
DATA SEGMENT ;设置数据段
BUF1 DB 'THE TIME IS NOW: $'
BUF5 DB ' @@@@@ ^^^^^^^ @@@@@@ $'
BUF6 DB ' &&&&&& ####### &&&&&& $'
BUF7 DB ' 00 >o o < 00 $'
BUF8 DB ' 00 (::) 00 $'
BUF9 DB ' 00 ~~ 00 $'
BUF10 DB ' 00 !! 00 $'
BUF3 DB 'CLASS:040402206 $'
BUF4 DB 'NAME:hu ling wei $'
BUF2 DB 10
DB 10 DUP(?)
DATA ENDS
STACK SEGMENT STACK ;设置堆栈段 DB 100 DUP(?)
STACK ENDS
CODE SEGMENT ;设置代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
CURSOR MACRO ROW,CLM ;设置光标位置
MOV AH,2
MOV BH,0
MOV DH,ROW
MOV DL,CLM
INT 10H
ENDM
WIN MACRO ROWL,CLML,ROWR,CLMR,COLOR ;设置窗口,位置,颜色
MOV AH,6
MOV AL,0
MOV CH,ROWL
MOV CL,CLML
MOV DH,ROWR
MOV DL,CLMR
MOV BH,COLOR
INT 10H
ENDM
ASCBCD MACRO REG
INC BX
INC BX
MOV REG,[BX]
MOV CL,4
SHL REG,CL
INC BX
MOV AL,[BX]
AND AL,0FH
OR REG,AL
ENDM
BCDASC MACRO REG
INC BX
INC BX
MOV AL,REG
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [BX],AL
INC BX
MOV AL,REG
AND AL,0FH
OR AL,30H MOV [BX],AL
ENDM
INCBCD MACRO REG,COUNT ;BCD数加1
MOV AL,REG
INC AL
DAA
MOV REG,AL
CMP AL,COUNT
JNZ DISPY
MOV REG,0
ENDM
STRDSPY MACRO ADRS
LEA DX,ADRS
MOV AH,9
INT 21H
ENDM
CLOCK PROC FAR
START: PUSH DS ;显示字符串
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
WIN 0,0,24,79,7
WIN 6,9,18,70,01000001B ;设置窗口
CURSOR 6,25 ;设置光标
STRDSPY BUF5 ;显示字符串
CURSOR 7,25 ;设置光标
STRDSPY BUF6
CURSOR 8,25
STRDSPY BUF7
CURSOR 9,25
STRDSPY BUF8
CURSOR 10,25
STRDSPY BUF9
CURSOR 11,25
STRDSPY BUF10
CURSOR 6,9
STRDSPY BUF3
CURSOR 7,9
STRDSPY BUF4
CURSOR 14,32
STRDSPY BUF1
CURSOR 15,36
LEA DX,BUF2 MOV AH,0AH
INT 21H ;从键盘接收当前时间
LEA BX,BUF2
ASCBCD CH ;小时值ASCII到BCD
;存CH
ASCBCD DH ;分值ASCII到BCD
;存DH
ASCBCD DL ;秒值ASCII到BCD
;存DL
TIMER: CALL DELY ;延时1秒
INCBCD DL,60H ;(DL)+1,并判
;大于等于60?
INCBCD DH,60H ;(DH)+1,并判
;大于等于60?
INCBCD CH,24H ;(CH)+1,并判
;大于等于60?
DISPY: LEA BX,BUF2
BCDASC CH ;时值BCD转到ASCII
BCDASC DH ;分值BCD转到ASCII
BCDASC DL ;秒值BCD转到ASCII
INC BX
MOV AL,'$'
MOV [BX],AL
PUSH DX
CURSOR 15,36 ;设置光标
STRDSPY BUF2+2 ;显示时,分,秒值