⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 微机电梯课程设计.asm

📁 电梯控制汇编经典程序 结合清华大学的TCP微机实验装置模拟电梯运行 很好用
💻 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 + -