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

📄 ic.asm

📁 该源代码为单片机的公交ic卡课程设计源代码
💻 ASM
字号:
data  segment
  
  
  
  m1_va dw  0;存放应付金额的总数
  m2_va dw  0;存放所付金额的总数
  count db  10;软件计数器
  key   db  0;读键盘后,存放读入的键值
  pos   db  0;存放“写显示RAM命令字”,用来传递参数
  
  
  d8253 equ 200h
  z8253 equ 203h
  d8255 equ 212h
  z8255 equ 213h
  z82590 equ 220h
  z82591 equ 221h
  d8279  equ 230h
  z8279  equ 232h
data    ends
code    segment
  
  assume cs:code
  start:
  main  proc  far
    mov ax,8100h
    mov ds,ax;段地址8100H赋给DS
    mov dx,z8279
    mov al,0d2h
    out dx,al;清空显示RAM和FIFO RAM
aa: in al,dx
    test al,80h
    jnz aa ;判断是否清空完毕,没有则等待
    mov al,0
    out dx,al;8279控制字,表示:左边输入,八位显示外部译码八位显示
    
bb: call getkey;读键盘,将键值放入变量KEY
    mov al,key
    cmp al,0ah
    jnz b
    call search;键值为“A”则执行查找子程序
    jmp bb
b:  cmp al,0bh;键值为“B”则执行购买子程序
    jnz c
    call buy
    jmp bb
c:  cmp al,0ch;键值为“C”则执行修改子程序
    jnz e
    call updata
    jmp bb
e:  cmp al,0eh;键值为“E”则执行结束子程序
    jnz bb
    call clear
    call p_exit
    jmp e
    mov ah,4ch
    int 21h
    
  main  endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  search proc near;查找子程序
    push ax
    push bx
    call clear
    call p_printno
    call getkey
    mov  pos,84h
    call p_print1
    call delay1
    call clear
    mov ah,0
    mov bh,0
    mov al,key
    mov bl,7
    mul bl
    lea bx,cola
    add bx,ax
    call p_print7
    pop bx
    pop ax
    ret
   search endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   updata proc near;修改子程序
    push ax
    push bx
    push cx
    call clear
    call p_printno
    call getkey
    mov pos,84h
    call p_print1
    call delay1
    call clear
    mov ah,0
    mov bh,0
    mov al,key
    mov bl,7
    mul bl
    lea bx,cola
    add bx,ax
    add bx,2
    mov cx,5
    mov pos,87h
nn: call getkey
    
    call p_print1
    mov al,key
    mov [bx],al
    inc bx
    dec pos
    loop nn
    mov bl,71h;F
    call p_printefc
    call clear
    pop cx
    pop bx
    pop ax
    ret
   updata endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  buy proc near;购买子程序
    
    call clear
    call p_count
restart:
    call p_printno
    call getkey
    mov pos,84h
    call p_print1
    call delay1
    call clear
    mov ah,0
    mov bh,0
    mov al,key
    mov bl,7
    mul bl
    lea si,cola
    add si,ax
    mov m1_va,0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    mov ah,0
    mov al,[si+2]

    mov bh,0
    mov bl,100 
    mul bl
    add m1_va,ax
    mov ah,0
    mov al,[si+3]
    mov bh,0
    mov bl,10
    mul bl
    add m1_va,ax
    mov ah,0
    mov al,[si+5]
    ;cbw
    add m1_va,ax;单价存入m1_va
    
    call p_printno
    call getkey
    call p_print1
    call delay1
    call clear
    mov cl,key
    mov ch,0
    mov dx,0
    mov ax,m1_va
    mul cl
    mov m1_va,ax  ;价格总额存入m1_va
    lea si,mon1 
    mov ax,m1_va
    mov bh,0
    mov bl,100
    div bl
    mov [si],al
    mov al,ah
    mov ah,0
    mov bh,0
    mov bl,10
    div bl
    mov [si+1],al
    mov [si+3],ah
    lea bx,mon1
    call p_print7;显示价格总额
    
    lea si,seco
    cmp byte ptr[si],4
    jnz oth;================================== 
    mov key,0ch
oth:
    call getkey
    mov al,key

    cmp al,0dh
    jnz cle;---------------------
    call clear
    call empty1
    jmp restart
cle: 
    cmp al,0ch
    jnz fin
    call empty1
    call empty2
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    call p_count_pause
    call p_print2
    mov bl,39h
    call p_printefc
   
    lea si,seco
    mov byte ptr[si],0
    mov byte ptr[si+1],0
 
    call clear
    jmp en
fin:    
    cmp al,0fh
    jnz oth;------------------------------
    mov bl,71h
    call p_printefc
repay:
    call clear
    lea si,mon2
    mov cx,5
    mov pos,87h
ll: call getkey
    call p_print1
    mov al,key
    cmp al,0ch
    jz cle
    mov [si],al
    inc si
    dec pos
    loop ll
    call delay1;将所付金额存入mon2
    lea si,mon2
    mov m2_va,0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    mov ax,0
    mov al,[si]
    mov ch,0
    mov cl,100
    mul cl
    add m2_va,ax
    mov ax,0
    mov al,[si+1]
    mov ch,0
    mov cl,10
    mul cl
    add m2_va,ax
    mov ax,0
    mov al,[si+3]
    cbw
    add m2_va,ax;将所付金额存入m2_va
    mov ax,m1_va
    cmp m2_va,ax
    jnb s1;------------------
    call empty2
    mov bl,79h
    call p_printefc
    jmp repay
s1: sub m2_va,ax
    mov ax,m2_va
    mov bh,0
    mov bl,100
    div bl
    lea si,mon2
    mov [si],al
    mov al,ah
    mov ah,0
    mov bh,0
    mov bl,10
    div bl
    mov [si+1],al
    mov [si+3],ah
    lea bx,mon2
    call p_print7
    call p_count_pause
    call p_print2
    call empty1
    call empty2
    
    
    lea si,seco
    mov byte ptr[si],0
    mov byte ptr[si+1],0
 

en: ret
  buy  endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   getkey proc near;读键盘子程序
    push ax
    push bx
    push dx
w:  mov dx,z8279
    in al,dx
    mov ah,al
    test al,80h
    jnz w
    lea bx,seco
    mov al,[bx]
    cmp al,4
    jz ex
    mov al,ah
    and al,0fh
    jz w
    mov al,40h
    out dx,al
    mov dx,d8279
    in al,dx
    mov key,al
    mov dx,z8279
    mov al,0c2h
    out dx,al
ex: pop dx
    pop bx
    pop ax
    ret
  getkey endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  clear proc near;清屏子程序
   
    push ax
    push cx
    push dx
    
    mov al,90h
    mov dx,z8279
    out dx,al
    mov al,0
    mov cx,8
cir:mov dx,d8279
    out dx,al
    loop cir
    pop dx
    pop cx
    pop ax
    ret
   clear endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   delay1 proc near;延迟子程序
    push ax
    push bx
    push cx
    
    mov bx,2
del:mov cx,0
de: loop de
    dec bx 
    jnz del
    pop cx
    pop bx
    pop ax
    ret
   delay1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   p_printno proc near;打印提示字符串“NO—”
    push ax
    push dx
    
    mov al,95h
    mov dx,z8279
    out dx,al
    mov dx,d8279
    mov al,40h;-
    out dx,al
    mov al,3fh;o
    out dx,al
    mov al,37h;n
    out dx,al   
    pop dx
    pop ax
    ret
   p_printno endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   p_print1 proc near;将读键盘操作读入的键值显示出来,显示的位置通过参数POS传递
    push ax
    push bx
    push dx
   
    mov al,pos
    mov dx,z8279
    out dx,al
    mov al,key
    lea bx,tab
    xlat
    mov dx,d8279
    out dx,al
    pop dx
    pop bx
    pop ax
    ret
   p_print1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   p_printefc proc near;闪烁显示字符E/F/C,具体由BL传递参数
    push ax
    push cx
    push dx
    
    mov al,82h
    mov dx,z8279
    out dx,al
    mov cx,5
pp: mov al,bl
    mov dx,d8279
    out dx,al
    call delay1
    mov al,0
    out dx,al
    call delay1
    loop pp
    pop dx
    pop cx
    pop ax
    ret
   p_printefc endp
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   p_print7 proc near;显示价格信息,通过BX传递参数
    cmp key,0ch
    jz jp
    push ax
    push bx
    push cx
  
    mov cx,7
    mov si,bx
    add si,6
    mov al,91h
    mov dx,z8279
    out dx,al
    lea bx,tab
tt: mov al,[si]
    xlat
    mov dx,d8279
    out dx,al
    dec si
    loop tt
    pop cx
    pop bx
    pop ax
jp: ret
   p_print7 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   p_count proc near;计时子程序
     push ax
     push dx
     cli
     mov  dx,z8255
     mov  al,80h;方式0,全输出
     out  dx,al
     mov  dx,d8255
     mov  al,1;PC0置1
     out  dx,al
                ;初始化8255
     mov  dx,z82590
     mov  al,13h;icw1
     out  dx,al
     mov  dx,z82591
     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,z8253
     mov  al,36h;0#计数器;先写低8位,后写高8位;方式3;二进制计数
     out  dx,al
     mov  dx,d8253
     mov  ax,960*25;写入0#计数器计数初值
     out  dx,al
     mov  al,ah
     out  dx,al
     sti
     pop dx
     pop ax
     ret
  p_count endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  p_print2 proc near;打印计时信息
     push ax
     push bx
     push cx
     push dx
     push si
     mov al,90h
     mov dx,z8279
     out dx,al
     lea si,seco
     inc si
     lea bx,tab
     mov cx,2
ss1:  mov al,[si]
     xlat
     mov dx,d8279
     out dx,al
     dec si
     loop ss1
     pop si
     pop dx
     pop cx
     pop bx
     pop ax
     ret
  p_print2 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  p_count_pause proc near;停止计时子程序停止
    push ax
    push dx
    mov al,0
    mov dx,d8255
    out dx,al
    pop dx
    pop ax
    ret
  p_count_pause endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  timer proc near;中断程序
    push bx
    dec count
    jnz next
    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],4
    jnz next
    call p_count_pause
     mov key,0ch
next:
    call p_print2
    pop bx
    iret
   timer endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  empty1 proc near;将应付金额信息置空
   push si
   mov m1_va,0
   
   lea si,mon1
   mov byte ptr[si],0
   mov byte ptr[si+1],0
   mov byte ptr[si+3],0
   
   pop si
   ret
  empty1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  empty2 proc near;将所付金额信息置空
   push si
   mov m2_va,0
   lea si,mon2    
   mov byte ptr[si],0
   mov byte ptr[si+1],0
   mov byte ptr[si+3],0
   
   pop si
   ret
  empty2 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  p_exit proc near;闪烁显示字符串“END”
    push ax
    push cx
    push dx
    mov cx,6
    mov pos,95h
qq: mov al,pos
    mov dx,z8279
    out dx,al
    mov dx,d8279
    mov al,5eh
    out dx,al
    mov al,37h
    out dx,al
    mov al,79h
    out dx,al
    call delay1
    call clear
    call delay1
    dec pos
    loop qq
    pop dx
    pop cx
    pop ax
    ret
   p_exit endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
  
   cola  db  0,0ah,0,2,10h,5,0
   bread db  1,0ah,0,3,10h,0,0
   apple db  2,0ah,0,2,10h,0,0
   grape db  3,0ah,0,3,10h,0,0
   bana  db  4,0ah,0,4,10h,0,0
   beaf  db  5,0ah,0,6,10h,8,0
   sweat db  6,0ah,1,4,10h,0,0
   coffe db  7,0ah,0,7,10h,4,0 ;8种商品号码和价格信息
   mon1  db  0,0,10h,0,0,11,11 ;应付金额的显示形式
   mon2  db  0,0,10h,0,0,11,11 ;所付金额的显示形式
   seco  db  0,0 ;秒的十位和个位
   tab   db  3fh,6,5bh,4fh,66h,6dh,7dh,7,7fh,6fh,40h,0,0,0,0,0,80h ;对应字符0—9,“-”,“。”
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
   code  ends
   end start

⌨️ 快捷键说明

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