用8255方式1查询输出的硬件电路,编写软件。要求有菜单选项,可根据选项的不同,控制发光二极管的不同显示方式。
data segment
menu db "1 left", 0dh, 0ah;定义打印菜单
db "2 right", 0dh, 0ah;0dh回车,0ah换行
db "3 water", 0dh, 0ah,'$'
choose db 'please choose 1,2,3:',0dh,0ah,'$'
seg1 db 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,'$'
crlf db 0aH,0dH,"$";回车换行
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx,offset menu
mov ah,09h
int 21h
lea dx, crlf
mov ah, 09h
int 21h
mov dx,offset choose
mov ah,09h
int 21h
mov ah,1
int 21h
cmp al,'1'
je light1
cmp al,'2'
je light2
cmp al,'3'
je light3
light1:
call startt
mov al,0
mov bl,01h
mov cl,8
mov dx,288h
out dx,al
again1:
mov dx,28ah ;查询INTR=0??
in al,dx
and al,08h
jz again1
mov al,bl
mov dx,288h
out dx,al
rol bl,1
dec cl
mov dl,0ffh ;判断是否有按键
mov ah,06h
int 21h
jz eexit
jmp again1
light2:
call startt
mov al,0
mov bl,80h
mov cl,8
mov dx,288h
out dx,al
again2:
mov dx,28ah ;查询INTR=0??
in al,dx
and al,08h
jz again2
mov al,bl
mov dx,288h
out dx,al
ror bl,1
dec cl
mov dl,0ffh ;判断是否有按键
mov ah,06h
int 21h
jz eexit
jmp again2
light3:
call startt
mov al,0
mov cx,0
mov dx,288h
out dx,al
again3:
mov dx,28ah ;查询INTR=0??
in al,dx
and al,08h
jz again2
lea bx,seg1
mov si,cx
mov al,[bx+si]
mov dx,288h
out dx,al
inc cx
mov dl,0ffh ;判断是否有按键
mov ah,06h
int 21h
cmp cx,8
je eexit
jmp again3
startt proc near
mov dx,28bh ;初始化工作方式
mov al,10100000b
out dx,al
mov al, 0dh
out dx, al ;使PC6=1,允许中断
ret
startt endp
eexit:
mov ah,4ch
int 21h
code ends
end start