第七篇 使用8253计数器

本文介绍使用8253计数器进行精确计时的方法,并提供了一个具体的示例程序,该程序能够在屏幕上逐秒显示从00到59的时间计数。

本篇博文主要介绍如何利用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

 

二、截图

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值