汇编语言电梯程序完整版.docx
《汇编语言电梯程序完整版.docx》由会员分享,可在线阅读,更多相关《汇编语言电梯程序完整版.docx(18页珍藏版)》请在冰豆网上搜索。
汇编语言电梯程序完整版
ioportequ0cc00h-0280h
ls273aequioport+2a8h;74ls273芯片地址
ls273bequioport+2b0h
;ls273cequioport+2b8h
io8255aequioport+288h;8255控制端以及a,c端口地址
io8255bequioport+289h
io8255cequioport+28ah
io8255equioport+28bh
io8253aequioport+280h;8253控制端以及0,1计数端口地址
io8253bequioport+281h
io8253cequioport+283h
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码
MENUDB'************************************************',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~288H8253cs~280hls273~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----------DIRECTARRIVE!
',0DH,0AH
DB'ESC----------EXIT!
',0DH,0AH
DB'ENTER----------RUN!
',0DH,0AH,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,offsetmenu
movah,09
int21h
movdx,io8255;8255初始化,a口输出,c口输入
moval,89h
outdx,al
movcl,31h;cl代表当前电梯所在楼层,初始值设为1
main:
moval,0
calldisp;显示当前楼层
movbl,0;bl为第一次输入的要去的楼层
movch,0;ch为在中途中再次输入的要去的楼层
calldisp8led
movah,01;键盘输入bl
int21h
cmpal,1bh;是esc则退出
jeexit1
cmpal,31h;在1-8之间?
如不是重新输入
jlmain
cmpal,38h
jgmain
movbl,al
calldisp8led;8led显示bl对应的楼层
cmpbl,cl;bl与cl比较
jemain;相等则返回重新输入
jgup;大于则向上运行
jldown;小于则向下运行
up:
callstop;调用暂停子程序
goup:
addcl,1
callupdelay;调用向上运行延时子程序
calldisp;调用显示子程序,用于显示当前楼层cl
cmpcl,bl;cl,bl不等则继续
jemain;相等则返回
jmpgoup
exit1:
jmpexit
tomain:
jmpmain
upgetch:
movah,1;在上升过程中如在有按键则跳转此处
int21h
cmpal,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能
jeuprepair
cmpal,70h;p键急停键
jeurgent
cmpal,31h;在1-8之间?
如不是继续上行
jlgotoup
cmpal,38h
jggotoup
movch,al
calldisp8led;显示cl对应楼层led
calldelay2;两秒计时时间到
calldisp;显示当前楼层
callblequcl;判断bl与cl是否相等
cmpch,cl;比较ch与cl的区别
jestopupbl;相等着在该层停,等待运行信号输入
jlupbldownch;ch小于cl则先上行至bl在下行至ch
cmpch,bl;ch大于cl则在判断ch与bl的大小关系
jejmpupbl;相等则一直上行至bl
jlupchupbl;ch大于cl小于bl则先上行到ch在上行到bl
jgtoupblupch;ch大于bl则先上行到bl在上行到ch
gotoup:
calldelay2
jmpgoup
uprepair:
moval,0;验收时未用
movah,1
int21h
cmpal,73h
jneuprepair
calldelay2
calldisp
jmpgoup
urgent:
calldelay2;急停功能
calldisp
jmpmain
updelayprocnear;向上运行延时子程序
calldelay;用于初始化8253
pushdx
ud:
movah,1;键盘是否有输入
int16h
jneupgetch;如有则跳转到输入处理
movdx,io8255c;8255c口输入
inal,dx
andal,01;是否计时结束
jzud
popdx
ret
updelayendp
toupblupch:
jmpupblupch
down:
callstop;调用暂停子程序
godown:
subcl,1
calldowndelay;调用向下运行延时子程序
calldisp;调用显示子程序,用于显示当前楼层cl
cmpcl,bl;cl,bl不等则继续
jetomain;相等则返回
jmpgodown
stopupbl:
calldisp
movch,0
calldisp8led
callstop2
callupbl
jmpmain
upbldownch:
calldisp8led
callupbl
movbl,0
calldisp8led
callstop2
calldownch
jmpmain
jmpupbl:
movch,0
calldisp8led
callupbl
jmpmain
upchupbl:
calldisp8led
callupch
movch,0
calldisp8led
callstop2
callupbl
jmpmain
upblupch:
calldisp8led
callupbl
movbl,0
calldisp8led
callstop2
callupch
jmpmain
downdelayprocnear;向下运行延时子程序,与向上运行延时子程序大体相同
calldelay
pushdx
ddy:
movah,1
int16h
jnedowngetch
movdx,io8255c
inal,dx
andal,01
jzddy
popdx
ret
downdelayendp
downgetch:
movah,1;在下降过程中如在有按键则跳转此处
int21h
cmpal,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能
jedownrepair
cmpal,70h;p键急停键
jeurgent2
cmpal,31h;在1-8之间?
如不是继续下降
jlgotodown
cmpal,38h
jggotodown
movch,al
calldisp8led;显示cl对应楼层led
calldelay2;两秒计时时间到
calldisp;显示当前楼层
callblequcl;判断bl与cl是否相等
cmpch,cl;比较ch与cl的区别
jestopdownbl;相等着在该层停,等待运行信号输入
jgdownblupch;ch大于cl则先下行至bl在上行至ch
cmpch,bl;ch小于cl则在判断ch与bl的大小关系
jejmpdownbl;相等则一直下行至bl
jldownbldownch;ch小于cl小于bl则先下行到bl在下行到ch
jgdownchdownbl;ch大于bl则先下行到ch在下行到bl
gotodown:
calldelay2
jmpgodown
downrepair:
moval,0
movah,1
int21h
cmpal,73h
jnedownrepair
calldelay2
calldisp
jmpgodown
stopdownbl:
calldisp8led
movch,0
calldisp8led
callstop2
calldownbl
jmpmain
downblupch:
calldisp8led
calldownbl
movbl,0
calldisp8led
callstop2
callupch
jmpmain
urgent2:
calldelay2;急停功能
calldisp
jmpmain
jmpdownbl:
movch,0
calldisp8led
calldownbl
jmpmain
downbldownch:
calldisp8led
calldownbl
movbl,0
calldisp8led
callstop2
calldownch
jmpmain
downchdownbl:
calldisp8led
calldownch
movch,0
calldisp8led
callstop2
calldownbl
jmpmain
vip:
cmpbl,cl;直达功能
jlvipdown
jgvipup
jmpmain
vipup:
addcl,1
callvipdelay
calldisp
jmpvip
vipdown:
subcl,1
callvipdelay
calldisp
jmpvip
vipgetch:
movah,1;直达过程中对急停以及断电待修的处理
int21h
cmpal,73h
jeviprepair
cmpal,70h
jeurgent2
calldelay2
jmpvip
viprepair:
moval,0
movah,1
int21h
cmpal,73h
jneviprepair
calldelay2
calldisp
jmpvip
vipdelayprocnear;直达的延时子程序
calldelay
pushdx
vd:
movah,1
int16h
jnevipgetch
movdx,io8255c
inal,dx
andal,01
jzvd
popdx
ret
vipdelayendp
stopprocnear;暂停子程序,实现按回车继续和判断是否为直达键
gostop:
moval,0
movah,1
int21h
cmpal,76h;是否为直达键
jevip
cmpal,13;是否为运行键
jnegostop
moval,0
ret
stopendp
upblprocnear;上行到bl的子程序
upbl1:
addcl,1
calldirdelay
calldisp
cmpcl,bl
jlupbl1
ret
upblendp
upchprocnear;上行到ch的子程序
upch1:
addcl,1
calldirdelay
calldisp
cmpcl,ch
jlupch1
ret
upchendp
downblprocnear;下行到bl的子程序
downbl1:
subcl,1
calldirdelay
calldisp
cmpcl,bl
jgdownbl1
ret
downblendp
downchprocnear;下行到ch的子程序
downch1:
subcl,1
calldirdelay
calldisp
cmpcl,ch
jgdownch1
ret
downchendp
delayprocnear;初始化8253的子程序,两计数器连级
pushdx
movdx,io8253c;8253的计数器0置方式3
moval,36h
outdx,al
movdx,io8253a;计数器0初始值为10000
movax,10000
outdx,al
moval,ah
outdx,al
movdx,io8253c;8253的计数器1置方式0
moval,70h
outdx,al
movdx,io8253b;计数器1初始值为200
movax,200
outdx,al
moval,ah
outdx,al
popdx
ret
delayendp
urgent3:
calldelay2
calldisp
jmpmain
blequclprocnear
cmpbl,cl
jneback
cmpbl,ch
jeblequch
movbl,0
calldisp
calldisp8led
callstop2
cmpch,cl
jgupchhere
jldownchhere
upchhere:
callupch
jmpmain
downchhere:
calldownch
jmpmain
blequch:
movch,0
calldisp8led
calldelay2
jmpmain
back:
ret
blequclendp
dirdelayprocnear;直接上下行的延时子程序
calldelay
pushdx
dirback:
movah,1
int16h
jnedirgetch
movdx,io8255c
inal,dx
andal,01
jzdirback
popdx
ret
dirdelayendp
dirgetch:
movah,1;直接上下行对按键的处理
int21h
cmpal,73h
jedirrepair
cmpal,70h
jeurgent3
jmpdirback
dirrepair:
moval,0
movah,1
int21h
cmpal,73h
jnedirrepair
calldelay2
calldisp
jmpdirback
stop2procnear;没有直达键的暂停子程序
gostop2:
moval,0
movah,1
int21h
cmpal,13
jnegostop2
moval,0
ret
stop2endp
delay2procnear;判断延市时是否结束的子程序
pushdx
delay3:
movdx,io8255c
inal,dx;查询8255的Pc0是否为高电平
andal,01
jzdelay3
popdx
ret
delay2endp
dispprocnear;显示当前楼层的子程序
movdl,cl
movah,2
int21h;用于在屏幕上显示
movdl,0dh
movah,2;回车符
int21h
movdl,0ah
movah,2;换行符
int21h
subcl,30h;七段码显示
moval,cl
pushbx
pushdx
movdx,io8255b
outdx,al
movbx,offsetled
xlat
movdx,io8255a
outdx,al
popdx
popbx
addcl,30h
moval,0
ret
dispendp
disp8ledprocnear;8led显示,显示bl与cl对应的楼层
pushax
cmpbl,0h
jen0
cmpbl,31h
jen1
cmpbl,32h
jen2
cmpbl,33h
jen3
cmpbl,34h
jen4
cmpbl,35h
jen5
cmpbl,36h
jen6
cmpbl,37h
jen7
cmpbl,38h
jen8
n0:
moval,0b
jmpchled
n1:
moval,1b
jmpchled
n2:
moval,10b
jmpchled
n3:
moval,100b
jmpchled
n4:
moval,1000b
jmpchled
n5:
moval,10000b
jmpchled
n6:
moval,100000b
jmpchled
n7:
moval,1000000b
jmpchled
n8:
moval,10000000b
jmpchled
chled:
cmpch,0
jem0
cmpch,31h
jem1
cmpch,32h
jem2
cmpch,33h
jem3
cmpch,34h
jem4
cmpch,35h
jem5
cmpch,36h
jem6
cmpch,37h
jem7
cmpch,38h
jem8
m0:
addal,0b
jmpdispled
m1:
addal,1b
jmpdispled
m2:
addal,10b
jmpdispled
m3:
addal,100b
jmpdispled
m4:
addal,1000b
jmpdispled
m5:
addal,10000b
jmpdispled
m6:
addal,100000b
jmpdispled
m7:
addal,1000000b
jmpdispled
m8:
addal,10000000b
jmpdispled
displed:
pushdx
pushax
moval,0ffh
movdx,ls273a
outdx,al
movdx,ls273b
popax
outdx,al
popdx
popax
moval,0
ret
disp8ledendp
exit:
movah,4ch
int21h
codeends
endstart