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

📄 接口课程设计0.asm

📁 用8255实现一个5层模拟电梯
💻 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 + -