📄 微机电梯课程设计.asm
字号:
data segment
ioport equ 0cc00h-0280h
ls273a equ ioport+2a8h;74ls273芯片地址
ls273b equ ioport+2b0h
;ls273c equ ioport+2b8h
io8255a equ ioport+288h;8255控制端以及a,c端口地址
io8255b equ ioport+289h
io8255c equ ioport+28ah
io8255 equ ioport+28bh
io8253a equ ioport+280h;8253控制端以及0,1计数端口地址
io8253b equ ioport+281h
io8253c equ ioport+283h
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码
MENU DB ' ************************************************',0DH,0AH
DB ' * 电梯 *',0DH,0AH
db ' * 8255b--pb6~pb0--led6~led0 *',0Dh,0Ah
db ' * *',0Dh,0Ah
db ' * pa0~pa7-----a~g *',0Dh,0Ah
db ' * 8255CS~288H 8253cs~280h ls273~2a8,2b0 *',0Dh,0Ah
db ' * 08006127 凌学梦 *',0Dh,0Ah
db ' ************************************************',0Dh,0Ah
DB '1~8------1 ~ 8FLOOR!',0DH,0AH
DB 'P----------STOP!',0DH,0AH
DB 'V----------DIRECT ARRIVE!',0DH,0AH
DB 'ESC----------EXIT!',0DH,0AH
DB 'ENTER----------RUN!',0DH,0AH,'$'
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset menu
mov ah,09
int 21h
mov dx,io8255;8255初始化,a口输出,c口输入
mov al,89h
out dx,al
mov cl,31h;cl代表当前电梯所在楼层,初始值设为1
main: mov al,0
call disp;显示当前楼层
mov bl,0;bl为第一次输入的要去的楼层
mov ch,0;ch为在中途中再次输入的要去的楼层
call disp8led
mov ah,01;键盘输入bl
int 21h
cmp al,1bh;是esc则退出
je exit1
cmp al,31h;在1-8之间?如不是重新输入
jl main
cmp al,38h
jg main
mov bl,al
call disp8led;8led显示bl对应的楼层
cmp bl,cl;bl与cl比较
je main;相等则返回重新输入
jg up;大于则向上运行
jl down;小于则向下运行
up: call stop;调用暂停子程序
goup: add cl,1
call updelay;调用向上运行延时子程序
call disp;调用显示子程序,用于显示当前楼层cl
cmp cl,bl;cl,bl不等则继续
je main;相等则返回
jmp goup
exit1: jmp exit
tomain:jmp main
upgetch:mov ah,1;在上升过程中如在有按键则跳转此处
int 21h
cmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能
je uprepair
cmp al,70h;p键急停键
je urgent
cmp al,31h;在1-8之间?如不是继续上行
jl gotoup
cmp al,38h
jg gotoup
mov ch,al
call disp8led;显示cl对应楼层led
call delay2;两秒计时时间到
call disp;显示当前楼层
call blequcl;判断bl与cl是否相等
cmp ch,cl;比较ch与cl的区别
je stopupbl;相等着在该层停,等待运行信号输入
jl upbldownch;ch小于cl则先上行至bl在下行至ch
cmp ch,bl;ch大于cl则在判断ch与bl的大小关系
je jmpupbl;相等则一直上行至bl
jl upchupbl;ch大于cl小于bl则先上行到ch在上行到bl
jg toupblupch;ch大于bl则先上行到bl在上行到ch
gotoup:call delay2
jmp goup
uprepair:mov al,0;验收时未用
mov ah,1
int 21h
cmp al,73h
jne uprepair
call delay2
call disp
jmp goup
urgent: call delay2;急停功能
call disp
jmp main
updelay proc near;向上运行延时子程序
call delay;用于初始化8253
push dx
ud: mov ah,1;键盘是否有输入
int 16h
jne upgetch;如有则跳转到输入处理
mov dx,io8255c;8255c口输入
in al,dx
and al,01;是否计时结束
jz ud
pop dx
ret
updelay endp
toupblupch:jmp upblupch
down: call stop;调用暂停子程序
godown: sub cl,1
call downdelay;调用向下运行延时子程序
call disp;调用显示子程序,用于显示当前楼层cl
cmp cl,bl;cl,bl不等则继续
je tomain;相等则返回
jmp godown
stopupbl:call disp
mov ch,0
call disp8led
call stop2
call upbl
jmp main
upbldownch:call disp8led
call upbl
mov bl,0
call disp8led
call stop2
call downch
jmp main
jmpupbl:mov ch,0
call disp8led
call upbl
jmp main
upchupbl:call disp8led
call upch
mov ch,0
call disp8led
call stop2
call upbl
jmp main
upblupch:call disp8led
call upbl
mov bl,0
call disp8led
call stop2
call upch
jmp main
downdelay proc near;向下运行延时子程序,与向上运行延时子程序大体相同
call delay
push dx
ddy: mov ah,1
int 16h
jne downgetch
mov dx,io8255c
in al,dx
and al,01
jz ddy
pop dx
ret
downdelay endp
downgetch:mov ah,1;在下降过程中如在有按键则跳转此处
int 21h
cmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能
je downrepair
cmp al,70h;p键急停键
je urgent2
cmp al,31h;在1-8之间?如不是继续下降
jl gotodown
cmp al,38h
jg gotodown
mov ch,al
call disp8led;显示cl对应楼层led
call delay2;两秒计时时间到
call disp;显示当前楼层
call blequcl;判断bl与cl是否相等
cmp ch,cl;比较ch与cl的区别
je stopdownbl;相等着在该层停,等待运行信号输入
jg downblupch;ch大于cl则先下行至bl在上行至ch
cmp ch,bl;ch小于cl则在判断ch与bl的大小关系
je jmpdownbl;相等则一直下行至bl
jl downbldownch;ch小于cl小于bl则先下行到bl在下行到ch
jg downchdownbl;ch大于bl则先下行到ch在下行到bl
gotodown:call delay2
jmp godown
downrepair:mov al,0
mov ah,1
int 21h
cmp al,73h
jne downrepair
call delay2
call disp
jmp godown
stopdownbl:call disp8led
mov ch,0
call disp8led
call stop2
call downbl
jmp main
downblupch:call disp8led
call downbl
mov bl,0
call disp8led
call stop2
call upch
jmp main
urgent2:call delay2;急停功能
call disp
jmp main
jmpdownbl:mov ch,0
call disp8led
call downbl
jmp main
downbldownch:call disp8led
call downbl
mov bl,0
call disp8led
call stop2
call downch
jmp main
downchdownbl:call disp8led
call downch
mov ch,0
call disp8led
call stop2
call downbl
jmp main
vip: cmp bl,cl;直达功能
jl vipdown
jg vipup
jmp main
vipup: add cl,1
call vipdelay
call disp
jmp vip
vipdown:sub cl,1
call vipdelay
call disp
jmp vip
vipgetch:mov ah,1;直达过程中对急停以及断电待修的处理
int 21h
cmp al,73h
je viprepair
cmp al,70h
je urgent2
call delay2
jmp vip
viprepair:mov al,0
mov ah,1
int 21h
cmp al,73h
jne viprepair
call delay2
call disp
jmp vip
vipdelay proc near;直达的延时子程序
call delay
push dx
vd: mov ah,1
int 16h
jne vipgetch
mov dx,io8255c
in al,dx
and al,01
jz vd
pop dx
ret
vipdelay endp
stop proc near;暂停子程序,实现按回车继续和判断是否为直达键
gostop: mov al,0
mov ah,1
int 21h
cmp al,76h;是否为直达键
je vip
cmp al,13;是否为运行键
jne gostop
mov al,0
ret
stop endp
upbl proc near;上行到bl的子程序
upbl1: add cl,1
call dirdelay
call disp
cmp cl,bl
jl upbl1
ret
upbl endp
upch proc near;上行到ch的子程序
upch1: add cl,1
call dirdelay
call disp
cmp cl,ch
jl upch1
ret
upch endp
downbl proc near;下行到bl的子程序
downbl1:sub cl,1
call dirdelay
call disp
cmp cl,bl
jg downbl1
ret
downbl endp
downch proc near;下行到ch的子程序
downch1:sub cl,1
call dirdelay
call disp
cmp cl,ch
jg downch1
ret
downch endp
delay proc near;初始化8253的子程序,两计数器连级
push dx
mov dx,io8253c;8253的计数器0置方式3
mov al,36h
out dx,al
mov dx,io8253a;计数器0初始值为10000
mov ax,10000
out dx,al
mov al,ah
out dx,al
mov dx,io8253c;8253的计数器1置方式0
mov al,70h
out dx,al
mov dx,io8253b;计数器1初始值为200
mov ax,200
out dx,al
mov al,ah
out dx,al
pop dx
ret
delay endp
urgent3:call delay2
call disp
jmp main
blequcl proc near
cmp bl,cl
jne back
cmp bl,ch
je blequch
mov bl,0
call disp
call disp8led
call stop2
cmp ch,cl
jg upchhere
jl downchhere
upchhere:call upch
jmp main
downchhere:call downch
jmp main
blequch:mov ch,0
call disp8led
call delay2
jmp main
back: ret
blequcl endp
dirdelay proc near;直接上下行的延时子程序
call delay
push dx
dirback:mov ah,1
int 16h
jne dirgetch
mov dx,io8255c
in al,dx
and al,01
jz dirback
pop dx
ret
dirdelay endp
dirgetch:mov ah,1;直接上下行对按键的处理
int 21h
cmp al,73h
je dirrepair
cmp al,70h
je urgent3
jmp dirback
dirrepair:mov al,0
mov ah,1
int 21h
cmp al,73h
jne dirrepair
call delay2
call disp
jmp dirback
stop2 proc near;没有直达键的暂停子程序
gostop2:mov al,0
mov ah,1
int 21h
cmp al,13
jne gostop2
mov al,0
ret
stop2 endp
delay2 proc near;判断延市时是否结束的子程序
push dx
delay3: mov dx,io8255c
in al,dx ;查询8255的Pc0是否为高电平
and al,01
jz delay3
pop dx
ret
delay2 endp
disp proc near;显示当前楼层的子程序
mov dl,cl
mov ah,2
int 21h;用于在屏幕上显示
mov dl,0dh
mov ah,2 ;回车符
int 21h
mov dl,0ah
mov ah,2 ;换行符
int 21h
sub cl,30h;七段码显示
mov al,cl
push bx
push dx
mov dx,io8255b
out dx,al
mov bx,offset led
xlat
mov dx,io8255a
out dx,al
pop dx
pop bx
add cl,30h
mov al,0
ret
disp endp
disp8led proc near;8led显示,显示bl与cl对应的楼层
push ax
cmp bl,0h
je n0
cmp bl,31h
je n1
cmp bl,32h
je n2
cmp bl,33h
je n3
cmp bl,34h
je n4
cmp bl,35h
je n5
cmp bl,36h
je n6
cmp bl,37h
je n7
cmp bl,38h
je n8
n0: mov al,0b
jmp chled
n1: mov al,1b
jmp chled
n2: mov al,10b
jmp chled
n3: mov al,100b
jmp chled
n4: mov al,1000b
jmp chled
n5: mov al,10000b
jmp chled
n6: mov al,100000b
jmp chled
n7: mov al,1000000b
jmp chled
n8: mov al,10000000b
jmp chled
chled: cmp ch,0
je m0
cmp ch,31h
je m1
cmp ch,32h
je m2
cmp ch,33h
je m3
cmp ch,34h
je m4
cmp ch,35h
je m5
cmp ch,36h
je m6
cmp ch,37h
je m7
cmp ch,38h
je m8
m0: add al,0b
jmp displed
m1: add al,1b
jmp displed
m2: add al,10b
jmp displed
m3: add al,100b
jmp displed
m4: add al,1000b
jmp displed
m5: add al,10000b
jmp displed
m6: add al,100000b
jmp displed
m7: add al,1000000b
jmp displed
m8: add al,10000000b
jmp displed
displed:push dx
push ax
mov al,0ffh
mov dx,ls273a
out dx,al
mov dx,ls273b
pop ax
out dx,al
pop dx
pop ax
mov al,0
ret
disp8led endp
exit: mov ah,4ch
int 21h
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -