📄 接口课程设计0.asm
字号:
data segment
table db 06h ; 1 ;楼层转换表
db 5bh ; 2
db 4fh ; 3
db 66h ; 4
db 6dh ; 5
uds_sign db 2 ; 0 up,1 down ,2 stop
now_floor db 1; 当前电梯所在楼层
array db 0,0,0,0,0 ;楼层队列,保存扫描到的楼层
array_pre db 0 ;指针,实现循环队列
array_next db 0
d_div db 5 ;循环队列最长的长度
floor db 0 ;读取的楼层
sign_b db 0 ;保存b口前一状态,用于比较跟当前b口对比,判断是否有人需要乘电梯
data ends
stack segment
db 256 dup(0)
stack ends
code segment
ioyo equ 0e400h
port_a equ ioyo+00h*4 ;8255 四个口的地址
port_b equ ioyo+01h*4
port_c equ ioyo+02h*4
contl equ ioyo+03h*4
;/**********主程序*************/
main proc
assume as:data,cs:code,ss:stack
begin:
mov ax,data
mov ds,ax
mov dx,contl ;读出B口的初状态,后面要用到
mov al,10011011b
out dx,al
mov dx,port_b
in al,dx
mov sign_b,al ;保存b口状态
run:
mov cx,400
loop_dis:
call display_floor ;这几个子程序轮换执行,显示楼层,
call display_up3
call display_down3 ; 上下楼,
call display_sr ; 停止或运行,
call check_b ; 检测是否用人需用电梯,
call scan ; 扫描按键 .
loop loop_dis
mov al,array_pre
cmp al,array_next
je run
mov bh,0
mov bl,array_pre
mov al,[array+bx]
cmp al,now_floor
jns up
je stop
mov uds_sign,1 ;正在下楼
mov bl,array_pre
mov bh,0
mov al,[array+bx]
down_:
mov cx,400 ;延时
down_loop:
call display_floor
call display_down3
call display_sr
call check_b
call scan
loop down_loop
dec now_floor
cmp al,now_floor
je stop
jmp down_
up: ;正在上楼
mov uds_sign,0
mov bl,array_pre
mov bh,0
mov al,[array+bx]
up_:
mov cx,400
up_loop:
call display_floor
call display_up3
call display_sr
call check_b
call scan
loop up_loop
inc now_floor
cmp al,now_floor
je stop
jmp up_
stop: ;在某楼层停下
mov uds_sign,2
mov al,array_pre
inc al
mov ah,0
div d_div
mov array_pre,ah
jmp run
main endp
; /******主程序*****end******/
;/**********行反转法扫描键盘子程序***********/
scan proc near
push dx
push ax
mov dx,contl
mov al,10000001b
out dx,al
mov al,0h
mov dx,port_a ;关闭数码管,因为数码管和键盘共四引脚
out dx,al
mov dx,port_c
mov ax,0h ;C口扫描键盘
out dx,al ;c口高4位 行值
in al,dx ;低4位 列值
and al,00001111b
cmp al,00001111b
jz scan_d ;没键按下,退出
push ax
call delay1
mov dx,contl
mov al,10001000b
out dx,al
mov dx,port_a ;关闭数码管
out dx,al
mov al,0
out dx,al
pop ax
mov ah,al
mov dx,port_c
out dx,al
in al,dx
and ax,0ff0h
add al,ah
mov ah,al
xor al,11011110b
jz make5
mov al,ah
xor al,11100111b
jz make4
mov al,ah
xor al,11101011b
jz make3
mov al,ah
xor al,11101101b
jz make2
mov al,ah
xor al,11101110b
jz make1
jmp scan_d
make5:
mov floor,5 ;转化所得的按键值
jmp scan_end
make4:
mov floor,4
jmp scan_end
make3:
mov floor,3
jmp scan_end
make2:
mov floor,2
jmp scan_end
make1:
mov floor,1
jmp scan_end
scan_end:
call get_array ;将转换后的按键值存在楼层队列中
scan_d:
pop ax
pop dx
ret
scan endp
;/****行反转法扫描键盘子程序***end********/
;/***********楼层显示子程序*************/
display_floor proc
push dx
push bx
push ax
cmp uds_sign,2
je floor_e
mov bl,array_pre
mov bh,0
mov al,[array+bx]
cmp al,now_floor
je floor_e
js floor_s
mov bl,now_floor+1
jmp floor_end
floor_e:
mov bl,now_floor
jmp floor_end
floor_s:
mov bl,now_floor-1
jmp floor_end
floor_end:
mov dx,contl
mov al,10001010b
out dx,al
mov bh,0
sub bx,1
mov al,[table+bx] ;置断码
mov dx,port_a
out dx,al
mov al,11111110b ;置位码
mov dx,port_c
out dx,al
call delay1
pop ax
pop bx
pop dx
ret
display_floor endp
;/****楼层显示子程序*****end********/
;/***********上楼显示**********/
display_up3 proc
push dx
push ax
cmp uds_sign,0
jne up_end3
mov dx,contl
mov al,10000000b
out dx,al
mov dx,port_a
mov al,00000111b
out dx,al
mov dx,port_c
mov al,11111101b
out dx,al
call delay1
up_end3:
pop ax
pop dx
ret
display_up3 endp
;/*****上楼显示****end******/
;/************下楼显示子程序***********/
display_down3 proc
push dx
push ax
cmp uds_sign,1
jne down_end3
mov dx,contl
mov al,10000000b
out dx,al
mov dx,port_a
mov al,00111000b
out dx,al
mov dx,port_c
mov al,11111101b
out dx,al
call delay1
down_end3:
pop ax
pop dx
ret
display_down3 endp
;/******下楼显示子程序****end*******/
;/*************检测是否有人需要乘电梯子程序**************/
check_b proc
push dx
push ax
push cx
mov dx,contl
mov al,10011011b
mov dx,port_b
in al,dx
mov bl,al ;保存现在b口状态
xor al,sign_b
je check_end
mov sign_b,bl ;刷新b口状态
shl al,3
mov cx,5
check_floor: ;判断哪楼有人需要用电梯
cmp al,80h
je check_out
loop check_floor
check_out:
mov floor,cl
call get_array
check_end:
pop cx
pop ax
pop dx
ret
check_b endp
;/*****检测是否有人需要乘电梯子程序****end**********/
;/***********电梯停或运行显示子程序*********/
display_sr proc
push dx
push ax
mov dx,contl
mov al,10011001b
out dx,al
mov dx,port_b
cmp uds_sign,2
je dis_stop
mov al,10000000b ;绿灯行
out dx,al
jmp display_sre
dis_stop: ;红灯停
mov al,01000000b
out dx,al
jmp display_sre
display_sre:
call delay1
pop ax
pop dx
ret
display_sr endp
;/***电梯停或运行显示子程序***end******/
;/**********获取楼层队列子程序***********/
get_array proc
push dx
push cx
push ax
push bx
mov dl,array_pre
mov dh,array_next
get_:
cmp dl,dh
je get
mov cl,floor
mov bl,dl
mov bh,0
mov ch,[array+bx]
cmp ch,cl
je get_end
inc bl
mov al,bl
mov ah,0
div d_div
mov bl,ah
jmp get_
get:
mov cl,floor
mov bl,dh
mov bh,0
mov [array+bx],cl
inc bl
mov al,bl
mov ah,0
div d_div
mov array_next,ah
get_end:
pop bx
pop ax
pop cx
pop dx
ret
get_array endp
;/*****获取楼层队列子程序***end********/
;/***********延时子程序***********/
delay1 proc
push cx
mov cx,200
loop7: loop loop7
pop cx
ret
delay1 endp
;/****延时子程序****end*******/
code ends
end begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -