用8253怎样编程让led灯一秒闪一次

如题所述

data segment
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
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-25
可以用外部中断计数,来实现流水灯的正转、暂停、以及反转和爆闪。。这是我前几天写的一个这样的程序,楼主可以结合protues画图仿真,注意程序中所用到的IO端口就行了。#include#include#defineucharunsignedcharuchara,b;voiddelay(ucharz){uchari,j,k;for(i=z;i>0;i--)for(k=20;k>0;k--)for(j=110;j>0;j--);}voidbegain(){EA=1;EX0=1;IT0=1;}voidmain(){a=b=0;P0=0xfe;begain();while(1){if(a==1){P0=_crol_(P0,1);delay(50);}if(a==3){P0=_cror_(P0,1);delay(50);}if(a==4){P0=0x00;delay(50);P0=0xff;delay(50);P0=0xfc;}if(a==5){a=1;}}}voidint0()interrupt0{a++;if(a==5){a=1;}}