📄 电梯3b.txt
字号:
一.实验基本要求
达到的实验要求:
用键盘、按键、八段码和LED模拟电梯的工作过程。楼层设为8层,键盘数字键1~8用来键入希望停的楼层,8个LED希望停的楼层,八段码指示电梯当前所在楼层,按钮用来启、停电梯。电梯正常运行时以每2秒1层的速度上升或下降。要求“电梯”能按以下方式运行:
(1)设当前电梯停在某(8段码显示相应楼层,8个LED全灭)。键入1~8数字键,如键入的数字与当前电梯停层同,则不发生任何动作;若不同则相应楼层的LED亮。如再按运行键,则电梯自动判别上升或下降(在运行过程中八段码显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED灭);
(2)设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED指示希望抵达的楼层),若键入新的希望停的楼层数字(相应的LED亮),则对同方向(上升或下降)未到的楼层能停,对其他情况则先停原希望停的楼层,然后按运行键后继续运行。如下几例:
1):设电梯当前在2楼,向上运行,LED指示希望在6楼停,此时若键入4,则电梯将在4层停,若再按运行键,则继续运行至6层停。
2):同上情况,若键入的不是4而是8,则电梯将先停在6楼,再按运行键,运行至8层停。
3):同上情况,若键入的不是4(或8)而是1,则电梯将先停在6楼,再按运行键,运行至1层停。
达到进一步设计要求
除运行按钮外,有其他几个按钮,模拟更多的电梯运行功能,
(1)直达按钮v 若按此按钮,电梯按直达方式运行,即使运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层。
(2)急停按钮p 电梯运行中,若按此按钮,则电梯立即停在将要到达的楼层。
(3)断电待修键(由开关控制) 按下该钮电梯不能工作,再按一下才重新工作。
二.流程图(附)
三.源程序(附)
四.试验过程出现的问题及排除方法
编程中遇到的大多是逻辑问题.另一个经常遇到的问题就是跳转(jump)语句超出范围的错误(relative jump out of range),这个错误的解决是通过改变语句的顺序,如实在无法通过改变顺序来消除错误,则通过二次跳转,即跳过中间过程再跳至目标。
我们写的电梯程序,d的意义为当前楼层,当输入要去的楼层bl时,判断bl与cl的大小关系,假设bl>cl,则程序先把cl加1,再延时两秒,再比较bl与cl的大小是否相等,如果相等则跳出,不等则把cl加1,再延时,再判断。
当在上行过程中再输入另一个想去的楼层ch时,则跳转至 ch处理过程。因为是在延时前就把cl加1了,因此在这上行两秒内,cl已经上了一层了。因此就必须判断ch以及bl是否与此时的cl相等,如相等则在即将到达的这一层停。由于一开始我们来判断bl与cl是否相等,导致如果在即将到bl层的时候按下ch则会使cl不断增大,即ASCП 码不断增大,又返回至0H,又增大至bl 才停止。
另外一个问题就是8个LED显示要去哪个楼层的问题。我们是用数据DD0—DD7接到74LS273输出的。bl,ch同时要被显示。我们于是就把bl,ch的0,1,2,3,…..8分别对应于0B,1B,10B,………10000000B,然后把两者相加就能显示了。如果到达bl则把bl赋为0,则对应灯灭。如果到达ch,则把ch赋为0,则ch对应楼层灯灭。现在如果输入ch等于bl,按要求是对应灯亮,到该层停,而实际上变成上一层灯亮,因为ch与bl对应二进制相加,产生进位。解决方法是,如果bl,ch相等,则先把cl 复 位为0,然后再调用8LED显示。
源文件:
data segment
ioport equ 0c400h-0280h
ls273 equ ioport+2a8h;74ls273芯片地址
io8255a equ ioport+288h;8255控制端以及a,c端口地址
io8255b equ ioport+28bh
io8255c equ ioport+28ah
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;七段码
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8255b;8255初始化,a口输出,c口输入
mov al,8bh
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 exit
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
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
dd: mov ah,1
int 16h
jne downgetch
mov dx,io8255c
in al,dx
and al,01
jz dd
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;直达的延时子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -