?? 微機電梯課程設計.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 + -