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

📄 huoche.asm

📁 该源代码为单片机的火车时刻表课程设计源代码
💻 ASM
字号:
DATA  SEGMENT
 
Z8279    EQU       212H
D8279    EQU       210H
LEDMOD   EQU       00 
LEDFEQ   EQU       50H 
DATA   ENDS
code segment
     assume cs:code
start:
      pos   db 0eeh
      count db 10
     
     mov al,0d2h          ;清除8279的寄存器
     mov dx,z8279
     out dx,al
ll:  in  al,dx            ;是否清除完毕,如果没有,循环执行ll函数
     test al,80h
     jnz ll 
oo:  mov    ax,8100h      ;设置8279的状态为右端输入8位译码显示,扫描频率为80HZ
     mov    ds,ax
     mov    dx,212h
     mov    al,10h
     out    dx,al
     mov    al,50h
     out    dx,al
     mov    al,11010000b   ;清除8279键盘寄存器
     out    dx,al
     call   XIANSHI        ;调用循环显示函数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;循环列车信息     
XIANSHI   proc  near
          mov   dx,212h    ;设置8279的写状态命令字
          mov   al,10010000b
          out   dx,al
   
GUNDONG:
      
          mov   si,-1      ;设置循环变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表1中的信息    
pp0:
          mov   dx,212h      ;判断是否有键按下
          in    al,dx
          and   al,0fh
          jz    gg
          call  inta         ;有键,调用查询函数
gg:       
          lea   bx,table1    ;无键,循环显示表1中的列车信息 
          mov   ax,si
          xlat
          mov   dx,210h
          out   dx,al   
          inc   si
          call  delay1
ac:    
          cmp   si,181      ;判断表1是否循环结束. 181是半个表的长度
          jnz   pp0       
          mov   si,0        ;如果结束  循环显示表2中信息  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表2中的信息
pp1:     
          mov   dx,212h
          in    al,dx
          and   al,0fh
          jz    kk
          call  inta
kk:       
          lea   bx,table2
          mov   ax,si
          xlat    
          inc   si 
          mov   dx,210h
          out   dx,al
          call  delay1
zx:
          cmp   si,181     ;判断表2是否循环结束 
          jnz   pp1
          jz    GUNDONG 
          ret 
xianshi endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 循环延时  
delay1 proc

          mov   bx,1
    
delay11:
          mov   cx,0
          loop  $
          dec   bx
          jnz   delay11
          ret
delay1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询延时    
delay4 proc

          mov   bx,4 
    
delay44:
          mov   cx,0
          loop  $
          dec   bx
          jnz   delay44
          ret
delay4 endp 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询函数
inta proc near

fg:   call p_count     ;调用中断
      mov   dx,212h   
      in    al,dx
      test  al,0fh
      jz    fg
      mov   dx,210h
      in    al,dx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;车次查询      
      cmp   al,4      ;比较是否是表1中信息
      ja    xx
      mov   cl,36 
      mov   dl,36     ;36是1条信息的长度
      mul   dl
      mov   di,ax     ;条过al*36个字节
as:
      push  cx    
      mov   bx,offset table1  ;查询表1  输出查询信息
      mov   ax,di
      xlat
      mov   dx,210h
      out   dx,al
      inc   di
      call  delay4            ;调用延时函数 使查询信息以不同与循环速度显示
      pop   cx
      loop  as
      jmp   ac
xx:
      cmp   al,09h           ;比较是否是表2中信息
      ja    uu 
      mov   cl,36 
      sub   al,5
      mov   dl,36
      mul   dl
      mov   di,ax            ;条过al*36个字节
bs:
      push  cx
      mov   bx,offset table2 ;查询表2  输出查询信息
      mov   ax,di
      xlat
      mov   dx,210h
      out   dx,al
      inc   di
      call  delay4           ;调用延时函数 使查询信息 以不同与循环速度显示
      pop   cx
      loop  bs
      jmp   ac
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;站地查询
uu:            
      cmp   al,0ah  ;比较是否以a为终点站
      je    aa
      cmp   al,0bh  ;比较是否以b为终点站
      je    bb  
      cmp   al,0ch
      je    cc
      cmp   al,0dh
      je    dd
      cmp   al,0eh
      je    ee 
      cmp   al,0fh
      je    ff
      cmp   al,0
      jb    dispose
      cmp   al,0fh
      ja    dispose
      jmp   ac
aa:   
      mov   al,0  ;调用表2中第1条信息
      call  dis2
      
      mov   al,2  ;调用表2中第3条信息
      mov   dl,36
      mul   dl
      call  dis2
      
      mov   al,4  ;调用表2中第5条信息
      mov   dl,36
      mul   dl
      call  dis2
      jmp   ac
bb:  
      mov   al,0
      call  dis1
      jmp   ac
cc:   
      mov   al,1
      mov   dl,36
      mul   dl
      call  dis1
      jmp    ac
dd:   
      mov    al,2
      mov    dl,36
      mul    dl
      call   dis1
      mov    al,1
      mov    dl,36
      mul    dl
      call   dis2
      jmp    ac
ee:  
      mov    al,3
      mov    dl,36
      mul    dl
      call   dis1
      mov    al,3
      mov    dl,36
      mul    dl
      call   dis2
      jmp    ac
ff:
      mov    al,4
      mov    dl,36
      mul    dl
      call   dis1
      jmp    ac
ol:      ret
inta endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;出错处理  
dispose :
        mov    dx,212h       ;清除8279寄存器
        mov    al,11010000b
        out    dx,al
aa1:
        in     al,dx        ;是否清除完毕,如果没有,循环执行aa1函数
        test   al,80h
        jnz    aa1
        mov    al,10010000b ;设置8279的写状态命令字
        out    dx,al
        mov    si,0
mm:
        lea    bx,table3    ;查表3 输出错误信息:FFFF
        mov    ax,si
        xlat    
        inc    si aa
        mov    dx,210h
        out    dx,al
        call   delay4
        cmp    si,9
        jnz    mm
        call   XIANSHI      ;返回初始状态
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 查询表1中的站地
dis1 proc near

       mov    cl,36 
       mov    di,al
ts5:   
       push   cx
       mov    bx,offset table1 ;具体查询表1中信息
       mov    ax,di
       xlat
       mov    dx,210h
       out    dx,al
       inc    di
       call   delay4 
       pop    cx
       loop   ts5
       ret
dis1 endp 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询表2中的站地
dis2 proc near

        mov    cl,36 
        mov    di,al
ts:    
        push   cx
        mov    bx,offset table2;具体查询表2中信息
        mov    ax,di
        xlat
        mov    dx,210h
        out    dx,al
        inc    di
        call   delay4 
        pop    cx
        loop   ts
        ret
dis2 endp 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_count proc near
     push ax
     push dx
     cli
     mov  dx,20bh
     mov  al,80h  ;方式0,全输出
     out  dx,al
     mov  dx,20ah
     mov  al,1    ;PC0置1
     out  dx,al
     ;初始化8255
     mov  dx,220h
     mov  al,13h;icw1
     out  dx,al
     mov  dx,221h
     mov  al,30h;icw2
     out  dx,al
     mov  al,03h;icw4
     out  dx,al
     mov  al,0feh;ocw1
     out  dx,al
     ;初始化8259
     push ds
     xor  ax,ax
     mov  ds,ax
     mov  bx,30h*4   ;中断向量物理地址
     mov  ax,offset timer
     mov  [bx],ax
     mov  ax,8100h
     mov  [bx+2],ax
        
     pop  ds
     ;设置中断向量,把timer中断程序的段地址和偏移地址存入中断向量表中即:30h*4--30h*4+3
     mov  dx,203h
     mov  al,36h;0#计数器;先写低8位,后写高8位;方式3;二进制计数
     out  dx,al
     mov  dx,200h
     mov  ax,960*25;写入0#计数器计数初值
     out  dx,al
     mov  al,ah
     out  dx,al
     sti
     pop dx
     pop ax
     ret
  p_count endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  p_count_pause proc near
    push ax
    push dx
    mov al,0
    mov dx,20ah
    out dx,al
    pop dx
    pop ax
    ret
  p_count_pause endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断:实现30s查询功能
  timer proc near
    push bx
    dec count
    jnz next11
    mov count,10
    lea bx,seco
    inc bx
    inc byte ptr[bx]
    cmp byte ptr[bx],10
    jnz next
    mov byte ptr[bx],0
    inc byte ptr[bx-1]
    cmp byte ptr[bx-1],3
    jnz next
    call p_count_pause
    lea si,seco
    mov byte ptr[si],0
    mov byte ptr[si+1],0
    mov al,0ffh
    mov dx,209h
    out dx,al
    pop bx
    jmp oo
next:
    rol pos,1
    mov al,pos
    mov dx,209h
    out dx,al
next11:
    pop bx
    iret
   timer endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
table1 db 3fh,7fh,7dh,71h,00h,7ch,40h,40h,77h,00h,3fh,3fh,09h,7fh,3fh,00h,3fh,3fh,09h,5bh,06h,00h,3fh,6dh,09h,6fh,3fh,00h,6dh,6dh,09h,6fh,3fh,00h,36h,00h
       db 06h,7fh,7dh,71h,00h,39h,40h,40h,7ch,00h,3fh,3fh,09h,6fh,3fh,00h,3fh,3fh,09h,6dh,06h,00h,7fh,6dh,09h,3fh,06h,00h,06h,3fh,09h,06h,06h,00h,36h,00h
       db 5bh,7fh,7dh,71h,00h,5eh,40h,40h,39h,00h,3fh,3fh,09h,3fh,06h,00h,3fh,3fh,09h,66h,06h,00h,3fh,3fh,09h,3fh,06h,00h,3fh,3fh,09h,6dh,06h,00h,36h,00h
       db 4fh,7fh,7dh,71h,00h,79h,40h,40h,5eh,00h,3fh,3fh,09h,06h,06h,00h,3fh,3fh,09h,7fh,06h,00h,07h,3fh,09h,5bh,06h,00h,3fh,06h,09h,5bh,06h,00h,36h,00h
       db 66h,7fh,7dh,71h,00h,71h,40h,40h,79h,00h,3fh,3fh,09h,5bh,5bh,00h,3fh,3fh,09h,7fh,3fh,00h,06h,06h,09h,4fh,5bh,00h,6dh,06h,09h,4fh,5bh,00h,36h,00h
table2 db 6dh,7fh,7dh,71h,00h,77h,40h,40h,71h,00h,3fh,3fh,09h,4fh,06h,00h,6dh,4fh,09h,07h,06h,00h,4fh,3fh,09h,6dh,06h,00h,6fh,3fh,09h,6dh,06h,00h,36h,00h
       db 7dh,7fh,7dh,71h,00h,7ch,40h,40h,79h,00h,3fh,3fh,09h,3fh,5bh,00h,3fh,3fh,09h,4fh,3fh,00h,06h,6dh,09h,06h,3fh,00h,7dh,6dh,09h,06h,3fh,00h,36h,00h
       db 07h,7fh,7dh,71h,00h,77h,40h,40h,5eh,00h,3fh,3fh,09h,6dh,06h,00h,6fh,3fh,09h,5bh,5bh,00h,3fh,4fh,09h,7fh,06h,00h,6dh,4fh,09h,7fh,06h,00h,36h,00h
       db 7fh,7fh,7dh,71h,00h,79h,40h,40h,39h,00h,3fh,3fh,09h,7dh,3fh,00h,07h,3fh,09h,66h,06h,00h,66h,5bh,09h,3fh,06h,00h,3fh,4fh,09h,3fh,06h,00h,36h,00h
       db 6fh,7fh,7dh,71h,00h,77h,40h,40h,39h,00h,3fh,3fh,09h,07h,06h,00h,3fh,3fh,09h,7fh,3fh,00h,06h,3fh,09h,7fh,06h,00h,07h,3fh,09h,7fh,06h,00h,36h,00h        
table3 db 71h,71h,71h,71h,00h,00h,00h,00h  
seco   db 0,0

LED  DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H
      DB  5EH,79H,71H    
         
code ends
     end start            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -