?? 接口課程設計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 + -