PC机实时时钟的设计剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 PC机实时时钟的设计
利用PC机现有的硬件和软件资源设计程序,以实现在显示器上显示XX(时):XX(分):XX(秒)。
(1)设计思路
PC机系统板上使用一片8253,其地址为40H—43H,其通道0以方式3工作,每55ms 向中断控制器8259A IRQ0端发一次中断请求。本设计题要求借用原有电路,重新设置8253的计数器0每10ms产生一次中断,100次中断后加1秒,然后调整时、分、秒并显示在屏幕上。
(2)实时时钟的功能
按下任意键开始显示数据区中存放的时间值,并且每秒更新一次,运行中按下空格键则停止运行并返回DOS。程序中应保护原系统的08H中断矢量以便退出时恢复原系统的设置。
(3)题目的要求
① PC机实时时钟的基本程序如附录一,请根据中断服务程序设计时钟时、分、秒调整的中断服务程序,然后调试实现时钟的基本功能
②在原有程序基础上,增加键盘输入字符功能,可通过修改时、分、秒的数据,实现实时时钟可调整功能。
③在原有程序基础上,设计美观的时钟显示方式及友好的操作方式。
附录一
STACK segment para stack 'stack'
db 256 dup (0)
stack ends
data segment para public 'data'
count db 100
tenh db '1'
hour db '3',20h
tenm db '1'
minute db '0'
db ':'
tens db '5'
second db '0',0dh,'$'
data ends
code segment para public 'code'
start proc far
assume cs:code
push ds
xor ax,ax
push ax
mov ah,01
int 21h
cli
cld
mov ax,0000h
mov ds,ax
mov si,0020h
lodsw
mov bx,ax
lodsw
push ax;seg
push bx;offset
mov ax,data
mov ds,ax
assume ds:data
mov ax,0000h
mov es,ax
mov di,0020h
mov ax,offset timer stosw
mov ax,cs
stosw
mov al,00110110b
out 43h,al
mov ax,11932
out 40h,al
mov al,ah
out 40h,al
in al,21h
push ax
mov al,0fch
sti
forever: mov dl,0ffh
mov ah,06
int 21h
jz disp
cmp al,20h
jz exit
disp:mov dx,offset tenh mov ah,9
mov al,second waitcha: cmp al,second jz waitcha
jmp forever exit: cli
cld
pop ax
out 21h,ax
mov al,36h
out 43h,al
mov al,0
out 40h,al
out 40h,al
mov ax,0
mov es,ax
mov di,4*8
pop ax
stosw
pop ax
stosw
sti
ret
start endp
timer:push ax
push cx
sti
mov al,count
dec al
mov count,al
jnz int_ret
mov count,100
mov al,second
add al,1
aaa
mov second,al
jnc int_ret
mov al,tens
adc al,0
aaa
and al,0fh
mov tens,al
jnz int_ret
mov al,0
mov tens,al
mov al,minute add al,1
aaa
mov minute,al jnc int_ret
mov al,tenm
adc al,0
aaa
and al,0fh
mov tenm,al
cmp al,6
jnz int_ret
mov al,0
mov tenm,al
mov al,tenh
mov cl,4
shl al,cl
mov cl,al
mov al,hour
and al,0fh
or al,cl
add al,1
daa
cmp al,24h
jz reseth
mov ch,al
mov cl,4
shr al,cl
or al,30h
mov tenh,al
mov al,ch
and al,0fh
or al,30h
mov hour,al
jmp int_ret reseth: mov tenh,'0' mov hour,'0' int_ret:
mov al,second