;*************************;
;* 8253方式0计数器实验 *;
;*************************;
include io.inc
.model small
.stack
.data
.code
start:
mov al,10h ;设置8253通道0为工作方式0,二进制计数
mov dx,283h
out dx,al
mov dx,280h ;送计数初值为5
mov al,5
out dx,al
mov ah,al ;用于避免重复显示计数值
again: call wait
in al,dx ;读计数值
cmp al,ah ;用于避免重复显示计数值
jz again ;用于避免重复显示计数值
push ax
call dispuib ;调显示子程序
call dispcrlf
pop ax
mov ah,al ;用于避免重复显示计数值
cmp al,0
jnz again
.exit 0 ;退出
wait proc
push cx
mov cx,1000
wait1: loop wait1
pop cx
ret
wait endp
end start
;*******************
;* 8253分频 *
;*******************
include io.inc
.model small
.stack
.data
.code
start:
mov dx,283h ;向8253写控制字
mov al,36h ;使通道0为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,280h
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
;
mov dx,283h
mov al,76h ;设8253通道1工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,281h
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
.exit 0 ;程序退出
end start
;********************************
;* 8253定时1秒中断,显示信息 *
;********************************
include io.inc
.model small
.stack
.data
msg byte 'one second passed !',0dh,0ah,0
counter byte 0
intseg word ?
intoff word ?
intimr byte ?
.code
start: mov ax,@data
mov ds,ax
mov ax,350bh
int 21h
mov intseg,es
mov intoff,bx
;
cli
push ds
mov dx,offset intproc
mov ax,seg intproc
mov ds,ax
mov ax,250bh
int 21h
pop ds
;
in al,21h
mov intimr,al
and al,0f7h
out 21h,al
;
mov dx,283h ;向8253写控制字
mov al,36h ;使通道0为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,280h
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
;
mov dx,283h
mov al,76h ;设8253通道1工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,281h
out dx,al ;先写低字节
mov al,ah
out dx,al ;后写高字节
;
mov byte ptr counter,0
sti
;
again: cmp byte ptr counter,5
jb again
;
cli
mov al,intimr
out 21h,al
mov dx,intoff
mov ax,intseg
mov ds,ax
mov ax,250bh
int 21h
sti
.exit 0
intproc proc
sti
push ax
push si
push ds
;
mov ax,@data
mov ds,ax
;
inc byte ptr counter
mov si,offset msg
call dpstri
;
mov al,20h
out 20h,al
pop ds
pop si
pop ax
iret
intproc endp
;
dpstri proc
push bx
disp1: mov al,[si]
test al,al
jz disp2
mov bx,0
mov ah,0eh
int 10h
inc si
jmp disp1
disp2: pop bx
ret
dpstri endp
end start