现在的位置: 首页 > 综合 > 正文

第七篇 使用8253计数器

2013年09月19日 ⁄ 综合 ⁄ 共 994字 ⁄ 字号 评论关闭

本篇博文主要介绍如何利用8253计数器计时。

8253计数器每秒大概计数18次。每计数一次就会向CPU发出中断请求。也即每55ms就会

发一次中断请求。CPU响应中断,调用的是int 1ch。

以下代码的作用时利用int 1ch中断计时60秒,在屏幕上显示00至59,然后程序自动退出。

 

一、代码

initint equ 1ch

data segment
	addr dw ?,?
	time dw ?
	count db ?
	divide db 10
data ends

sseg segment stack
	dw 512 dup (?)
sseg ends

code segment
	assume cs:code,ds:data,ss:sseg
start:
	mov ax,data
	mov ds,ax

	mov ax,sseg
	mov ss,ax

	mov ax,0
	mov es,ax

	;保存1ch中断的原始地址
	mov ax,es:[initint*4]
	mov addr,ax
	mov ax,es:[initint*4+2]
	mov addr[2],ax

	;加入新中断服务程序地址
	cli
	lea ax,isr
	mov es:[initint*4],ax
	mov ax,seg isr
	mov es:[initint*4+2],ax
	sti

	mov time,0
	mov count,0
again:
	cmp time,60
	jae exit
	jmp again

	;恢复原中断地址
exit:
	cli
	mov ax,addr
	mov es:[initint*4],ax
	mov ax,addr[2]
	mov es:[initint*4+2],ax
	sti

	mov ah,4ch
	int 21h

isr proc far
	push ax
	push cx
	push dx
	
	;告诉中断服务子程序变量在哪
	mov ax,data
	mov ds,ax

	sti

	inc count
	cmp count,18  ;近似把18次中断记作一秒
	jae go

back:
	pushf
	call dword ptr addr
	
	cli
	pop dx
	pop cx
	pop ax

	iret

go:
	mov count,0

	;获得秒的十位和个位
	mov ax,time
	div divide
	mov cl,al
	mov ch,ah
	
	;显示十位
	mov ah,2
	add cl,30h
	mov dl,cl
	int 21h

	;显示个位
	add ch,30h
	mov dl,ch
	mov ah,2
	int 21h
	
	;回车
	mov dl,0dh
	mov ah,2
	int 21h

	inc time
	jmp back
isr endp

code ends
	end start

 

二、截图

 

 

抱歉!评论已关闭.