1

;*************************;
;*  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

posted @ 2023-10-28 16:26  cxy8  阅读(40)  评论(0编辑  收藏  举报