ioport equ 0ff00h - 0280h
io8253a equ ioport + 280h ;counter 0 address
io8253b equ ioport + 281h ;counter 1 address
io8253c equ ioport + 282h ;counter 2 address
io8253d equ ioport + 283h ;8253控制端
ts db 'press 1,lamb on once,press 2,lamb on twice,press 3 ,lamb on third,press q quit',0dh,0ah,'$'
ts1 db 'over',0ah,0dh,'$'
data ends
code segment
assume cs: code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,ts
mov ah,9
int 21h ;輸出提示1
zl: mov ah,01h
int 21h ;輸入取值
cmp al,31h
jz l ;如果為1,調到L
cmp al,32h
jz lec ;如果為2,跳到lec
cmp al,33h
jz ls ;如果為3,跳到ls
cmp al,71h
jz over ;如果為q,跳入jieshu
jmp zl
l: mov dx,io8253d
mov al,30h
out dx,al ;定義控制字段,使用計數器0,方式0
mov dx,io8253a
mov al,0aah
out dx,al
out dx,al ;計數器0送初值0aaaah
jmp zl
lec: mov dx,io8253d
mov al,70h
out dx,al ;定義控制字段,使用計數器0,方式0
mov dx,io8253b
mov al,0aah
out dx,al ;計數器1初值0aaaah
out dx,al
mov cx,0ffffh
wait3: mov bx,2000h
wait4: dec bx
jnz wait4
loop wait3 ;輸出延時循環,將閃爍兩次
mov dx, IO8253B
mov al, 0AAH
out dx, al
out dx, al ;再次給計數器1送入計數初值0AAAAH
jmp zl
LS: mov dx, IO8253D
mov al, 0B0H
out dx, al ;定義控制字,使用計數器2,方式0
mov dx, IO8253C
mov al, 0AAH
out dx, al
out dx, al ;給計數器2送入初值0AAAAH
mov cx, 0FFFFH
wait1: mov bx, 2000h
wait2: dec bx
jnz wait2
loop wait1 ;輸出延時循環,將閃爍兩次分時
mov al, 0AAH
mov dx, IO8253C
out dx, al
out dx, al ;再次給計數器2送入初值0AAAAH
mov cx, 0FFFFH
wait11:mov bx, 2000H
wait22:dec bx
jnz wait22
loop wait11 ;輸出延時循環,將閃爍兩次分時
mov dx, IO8253C
mov al, 0AAH
out dx, al
out dx, al ;再次給計數器2送入初值0AAAAH
jmp zl
over: lea dx, ts1
mov ah, 9
int 21H
mov ah, 4CH
int 21H
code ends
end start