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

📄 2.asm

📁 计算机硬件技术基础课程设计,用汇编语言编写的出租车计价器。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
.486

;*****设置显示方式宏****
setdistype macro typenum
     mov ah,00h
     mov al,typenum ;分辨率为320*200
     int 10h
          
     endm
;*****数据初始输入宏****
;提示输入,接受输入,并判断数据是否适格,均为三位整数
;strings指向提示信息
;string指向输入变量(第三个单元开始才是实际输入的数据)
chushida macro strings,string
     local lpcs,lpcs1,exitcs,exitcs2,exitcs3,ispoint,ispoint2,lpzheng,lpxiao,nexchsh

lpcs:
     lea dx,strings ;显示输入提示信息
     mov ah,09h
     int 21h
     lea dx,buffervar;输入变量名
     mov ah,0ah
     int 21h
     mov al,0
     mov flagpoint,al;输入小数点标志置0
     lea si,buffervar+2
     mov cx,0
lpcs1:
     mov al,[si]
     cmp al,0dh
     jz  exitcs
     cmp al,'.'
     jz  ispoint
     cmp al,'0'
     jb  lpcs
     cmp al,'9'
     ja  lpcs
     inc si
     inc cx
     jmp lpcs1     
ispoint:
     mov bl,1
     mov flagpoint,bl
     inc cx
     inc si
     mov al,[si]
     cmp al,0dh
     jz  exitcs
     cmp al,'.'
     jz  exitcs2
     cmp al,'0'
     jb  exitcs2
     cmp al,'9'
     ja  exitcs2
     inc cx
     jmp exitcs
exitcs2:
     mov al,0
     mov flagpoint,al
     dec cx
     ;jmp nexchsh
exitcs:
     ;cmp cx,1
     ;jz  exitcs3
;nexchsh:
     mov al,flagpoint
     cmp al,1
     jz  ispoint2
     lea si,buffervar+1
     add si,cx
     lea di,string+2
lpzheng:
     cmp cx,0
     jz  exitcs3
     mov al,[si]
     mov [di],al
     dec cx
     dec si
     dec di
     jmp lpzheng
ispoint2:
     lea si,buffervar+1
     add si,cx
     
     mov al,[si]
     cmp al,'.'
     jz  exitcs3
     
     lea di,string+4
lpxiao:
     cmp cx,0
     jz  exitcs3
     mov al,[si]

     mov [di],al
     dec cx
     dec si
     dec di
     jmp lpxiao

exitcs3:    
     endm
;*****字符串转成数字宏****
;string1是字符串,string2为对应数值*10
daconver macro string1,string2
     local lpdac,nextdac,nextdac1,nextdac2
     lea si,string1
     mov ax,0
     mov bx,0
lpdac:
     mov bl,[si]
     cmp bl,'.'
     jz  nextdac2
     cmp bl,'0'
     jb  nextdac
     cmp bl,'9'
     ja  nextdac
     jmp nextdac1
nextdac:
     inc si
     jmp lpdac
nextdac1:
     sub bl,30h
     mov dx,10
     mul dx
     add ax,bx
     inc si
     jmp lpdac
nextdac2:
     inc si
     mov bl,[si]
     sub bl,30h
     mov dx,10
     mul dx
     add ax,bx
     
     mov string2,ax

     endm
;*****音乐播放宏****

music macro frequency,timetable
      local music1,leng,dl10ms,exitmu   
      lea  si,frequency
      lea  bp,timetable
music1:mov di,[si]
      cmp  di,-1
      je   exitmu
      mov  bx,ds:[bp]
      mov  al,10110110b
      out  43h,al
      mov  dx,12h
      mov  ax,3280h
      div  di
      out  42h,al
      mov  al,ah
      out  42h,al
      in   al,61h
      mov  ah,al
      or   al,3
      out  61h,al
leng: mov  ecx,0ffffffh
dl10ms: loopd dl10ms
      dec  bx
      jnz  leng
      mov  al,ah
      out  61h,al
      add  si,2
      add  bp,2
      jmp  music1
      
exitmu:
      endm     
DATAS SEGMENT
;....................................暂存器
time1    dw 0  ;计时器1的时分
time2    dw 0  ;计时器1的秒百分之一秒
time3    dw 0  ;计时器2的时分
time4    dw 0  ;计时器2的秒百分之一秒
subtime  dd 0  ;两次计时时差暂存器
x0       dw ?  ;字符字模输出的起始横坐标
y0       dw ?  ;字符字模输出的起始列坐标
color    db ?  ;字模的颜色
flagdis  db 0  ;动画显示标志,为1显中线1,为0显中线2
distype  db 0  ;显示方式号

qibujias db 0ah,0dh,'please input qibujia[yuan]:$',0ah,0dh
danjias  db 0ah,0dh,'please input danjia[yuan/km]:$',0ah,0dh
chesus   db 0ah,0dh,'please input chesu[km/h]:$',0ah,0dh
demand   db 0ah,0dh,'press key 4 to try again,key 6 to exit:$',0ah,0dh
                                                 ;输入提示语句
buffervar db 6,?,6 dup(?),'$'

qibujia  db ' ',' ','0','.','0','$';起步价,单位:元
qibujia2 dw 0                      ;起步价(数值),单位:角

danjia   db ' ',' ','0','.','0','$';单价,单位:元
danjia2  dw 0                      ;单价(数值),单位:角

chesu    db ' ',' ','0','.','0','$';车速
chesu2   db 0     ;将车速换到[m/(1/100)s]尺度
chesu3   dw 0                      ;车速(数值),单位:bm/h

zongjia  db ' ',' ','0','.','0','$';总价

licheng  db ' ',' ','0','.','0','$';里程
licheng2 dd 0     ;保存里程的二进制值,单位m                             
licheng3 dw 0     ;保存里程,0.1km为基本单位                                             
licheng4 dw 10    ;初值10是起步里程,并作每次里程比较的暂存器

flagpoint db 0    ;输入小数点标志


;....................................字模表
charptr  dw 30h,30h,03,  40h,30h,03,  50h,30h,03;'起步价'
         dw 30h,40h,03,  40h,40h,03             ;'单价'
         dw 30h,50h,03,  40h,50h,03             ;'车速'
         dw 0b0h,30h,03, 0c0h,30h,03            ;'总价'
         dw 0b0h,40h,03, 0c0h,40h,03            ;'里程'
charptr2:
         dw 0b0h,09bh,03                        ;小车车体            
         ;每三个数据一组,分别为待显示字模起始横纵坐标,颜色
         dw 0ffffh                           ;显示结束标志 

buffer1  dw 0eh,8,0fh,8, 7,9,8,9,9,9,0ah,9,0bh,9,0ch,9,0dh,9,3,0ah,4,0ah
         dw 5,0ah,6,0ah, 2,0bh,0,0ch,1,0ch, 0,0dh,1,0dh, 1,0eh, 2,0fh
         dw 3,0fh,4,0fh,5,0fh,6,0fh,7,0fh,8,0fh,9,0fh,0ah,0fh,0bh,0fh
         dw 0ch,0fh,0dh,0fh,0eh,0fh,0fh,0fh              ;一区
         dw 1bh,2,1ch,2,1dh,2,1eh,2,1fh,2, 1bh,3,1fh,3, 13h,4,14h,4,15h
         dw 4,16h,4,17h,4,18h,4,19h,4,1ah,4,1bh,4,1ch,4,1dh,4,1eh,4,1fh,4
         dw 12h,5, 11h,6, 10h,7                          ;二区
         dw 15h,0ch,16h,0ch,17h,0ch, 14h,0dh, 18h,0dh, 13h,0eh,19h,0eh
         dw 10h,0fh,11h,0fh,12h,0fh,1ah,0fh,1bh,0fh,1ch,0fh,1dh,0fh,1eh,0fh
         dw 1fh,0fh, 16h,10h                             ;三区
         dw 20h,4,21h,4,22h,4,23h,4,24h,4,25h,4,26h,4,27h,4,28h,4,29h,4,2ah
         dw 4,2bh,4,2ch,4,2dh,4,2eh,4,2fh,4              ;四区
         dw 2ah,0ch,2bh,0ch,2ch,0ch, 29h,0dh,2dh,0dh, 28h,0eh,2eh,0eh
         dw 20h,0fh,21h,0fh,22h,0fh,23h,0fh,24h,0fh,25h,0fh,26h,0fh,27h
         dw 0fh,2fh,0fh, 2bh,10h                         ;五区
         dw 30h,4, 31h,5,32h,5, 33h,6,34h,6, 35h,7,36h,7 ;六区
         dw 37h,8,38h,8,39h,8,3ah,8, 3bh,9, 3ch,0ah, 3ch,0bh, 3dh,0ch
         dw 3dh,0dh,3eh,0dh,3fh,0dh,3dh,0eh,3eh,0eh,3fh,0eh, 30h,0fh,31h,0fh
         dw 32h,0fh,33h,0fh,34h,0fh,35h,0fh,36h,0fh,37h,0fh,38h,0fh,39h,0fh
         dw 3ah,0fh,3bh,0fh,3ch,0fh,3dh,0fh               ;七区         
         dw 0ffh,0ffh                                     ;小车车体的字模                       
buffer2  dw 5,2,5,3,5,4,5,5,3,6,4,6,5,6,6,6,10,6,11,6,5,7,11,7,5,8,11,8,2,9
         dw 3,9,4,9,5,9,6,9,7,9,9,9,10,9,5,10,9,10,12,10,3,11,5,11,6,11,7
         dw 11,9,11,10,11,11,11,3,12,4,12,5,12,3,13,6,13,7,13,14,13,2,14,8
         dw 14,9,14,10,14,11,14,12,14,13,14               ;起
         dw 0ffh,0ffh         
buffer3  dw 8,2,8,3,8,4,5,5,8,5,9,5,10,5,11,5,5,6,8,6,5,7,8,7,11,7,12,7,13
         dw 7,5,8,7,8,8,8,9,8,10,8,4,9,5,9,6,9,8,9,11,9,2,10,3,10,6,10,8
         dw 10,11,10,5,11,8,11,10,11,9,12,8,13,7,14,6,15
         dw 0ffh,0ffh                                      ;步
buffer4  dw 9,2,5,3,9,3,5,4,9,4,4,5,8,5,3,6,7,6,9,6,10,6,2,7,4,7,6,7,7,7
         dw 10,7,11,7,12,7,4,8,5,8,7,8,10,8,13,8,4,9,7,9,10,9,4,10,7,10,10
         dw 10,4,11,7,11,10,11,4,12,6,12,10,12,4,13,10,13
         dw 10,14,10,15                                    ;'价'的字模,以0ffh结束
         dw 0ffh,0ffh         
buffer5  dw 11,1,5,2,11,2,6,3,10,3,7,4,9,4,5,5,6,5,7,5,8,5,9,5,10,5,11,5,5
         dw 6,8,6,11,6,5,7,7,7,8,7,9,7,11,7,5,8,8,8,11,8,6,9,7,9,8,9,9,9
         dw 10,9,8,10,7,11,8,11,9,11,10,11,3,12,4,12,5,12,6,12,8,12,11,12
         dw 12,12,13,12,14,12,8,13,8,15,8,14
         dw 0ffh,0ffh                                      ;单         
buffer6  dw 8,1,8,2,8,3,4,4,5,4,6,4,7,4,8,4,9,4,10,4,11,4,7,5,6,6,8,6,5,7,8
         dw 7,5,8,6,8,7,8,8,8,9,8,10,8,8,9,8,10,10,10,11,10,12,10,13,10,5
         dw 11,6,11,7,11,8,11,9,11,3,12,4,12,8,12,8,13,8,14,8,15
         dw 0ffh,0ffh                                      ;车         
buffer7  dw 9,2,9,3,3,4,7,4,8,4,9,4,10,4,11,4,4,5,9,5,4,6,7,6,8,6,9,6,10,6
         dw 11,6,4,7,6,7,9,7,12,7,4,8,7,8,8,8,9,8,10,8,11,8,4,9,8,9,9,9
         dw 11,9,4,10,7,10,9,10,11,10,4,11,7,11,9,11,11,11,3,12,4,12,5,12
         dw 6,12,7,13,8,13,9,13,10,13,11,14,12,14,13,14,14,14
         dw 0ffh,0ffh                                      ;速
buffer8  dw 10,2,4,3,10,3,5,4,9,4,6,5,8,5,5,6,6,6,7,6,8,6,9,6,10,6,5,7,10
         dw 7,5,8,9,8,6,9,7,9,8,9,11,10,12,10,2,11,4,11,7,11,8,11,9,11,13
         dw 11,2,12,5,12,6,13,12,13,7,14,8,14,9,14,10,14,11,14,12,14,13,14
         dw 0ffh,0ffh                                     ;总
buffer9  dw 5,3,6,3,7,3,8,3,9,3,10,3,11,3,4,4,8,4,12,4,4,5,8,5,12,5,4,6,6
         dw 6,7,6,8,6,9,6,10,6,12,6,4,7,8,7,12,7,5,8,6,8,7,8,8,8,9,8,10,8
         dw 11,8,8,9,8,10,6,11,7,11,8,11,9,11,10,11,8,12,8
         dw 13,3,14,4,14,5,14,6,14,7,14,8,14,9,14,10,14,11,14,12,14,13,14
         dw 0ffh,0ffh                                     ;里         
buffer10 dw 6,1,6,2,5,3,4,4,9,4,10,4,11,4,12,4,13,4,2,5,3,5,5,5,9,5,13,5,5
         dw 6,9,6,13,6,2,7,3,7,4,7,5,7,6,7,7,7,9,7,10,7,11,7,12,7,4,8,5,8
         dw 3,9,5,9,6,9,9,9,10,9,11,9,12,9,13,9,2,10,5,10,7,10,11,10,2,11
         dw 5,11,11,11,5,12,10,12,11,12,12,12,5,13,11,13,5,14,8,14,9,14,10
         dw 14,11,14,12,14,13,14,14,14,5,15 
         dw 0ffh,0ffh                                     ;程

;....................................文本字符表
buffertxt1 db 5,5,218, 5,34,170, 12,5,192,12,34,217       ;边框四角
           db 7,12,58,9,12,58,11,12,58, 7,26,58,9,26,58              ;':'
           db 7,18,157, 9,18,157,9,19,47,9,20,107,9,21,109;¥,¥/km
           db 11,18,107,11,19,109,11,20,47,11,21,104      ;km/h
           db 7,32,157, 9,32,107,9,33,109                 ;¥/km
           db 0ffh,0ffh  ;0ffh为文本结束标志
bufferflag db 11,28,17,1,11,30,14,1, 11,32,254,2          ;运行,暂停,停止(■)
           ;依次为行值,列值,字符值,颜色
           db 0ffh,0ffh  ;0ffh为文本结束标志 
           
liner      db 196,89h,5,6,34, 196,89h,12,6,34, 196,8ah,19,0,40, 196,8ah,22,0,40
           ;依次为字符值,颜色,行值,起始与终止列值
           db 0ffh,0ffh  ;0ffh为结束标志
linel      db 179,89h,5,6,12, 179,89h,34,6,12
           ;依次为字符值,颜色,列值,起始与终止行值
           db 0ffh,0ffh
colortxt   db 10001001b
           ;文本字符颜色10001000b黑色(不可见)10001001b青色10001010b品红10001011b白色
disdataptr db 7,12,03, 9,12,03, 11,12,02, 7,26,02, 9,26,02
           ;数据起步价,单价,车速,总价,里程显示属性,分别为行值,列值,颜色
bufferzx1  db 21,1,196,21,2,32,21,3,196,21,4,32,21,5,196,21,6,32,21,7,196,21,8,32,21,9,196
           db 21,10,32,21,11,196,21,12,32,21,13,196,21,14,32,21,15,196,21,16,32,21,17,196
           db 21,18,32,21,19,196,21,20,32,21,21,196,21,22,32,21,23,196,21,24,32,21,25,196
           db 21,26,32,21,27,196,21,28,32,21,29,196,21,30,32,21,31,196,21,32,32,21,33,196
           db 21,34,32,21,35,196,21,36,32,21,37,196,21,38,32,21,39,196;路中线          
           ;每三个为一组数据,依次为文本字符的行(从上到下)、列(从左到右)、字符值
           db 0ffh,0ffh  ;0ffh为文本结束标志
bufferzx2  db 21,0,196,21,1,32,21,2,196,21,3,32,21,4,196,21,5,32,21,6,196,21,7,32,21,8,196,21,9,32
           db 21,10,196,21,11,32,21,12,196,21,13,32,21,14,196,21,15,32,21,16,196,21,17,32
           db 21,18,196,21,19,32,21,20,196,21,21,32,21,22,196,21,23,32,21,24,196,21,25,32
           db 21,26,196,21,27,32,21,28,196,21,29,32,21,30,196,21,31,32,21,32,196,21,33,32
           db 21,34,196,21,35,32,21,36,196,21,37,32,21,38,196;路中线         
           ;每三个为一组数据,依次为文本字符的行(从上到下)、列(从左到右)、字符值
           db 0ffh,0ffh  ;0ffh为文本结束标志
           
;..............................音乐频率及节拍表
frequency1  dw 330,330,349,392,392,349, 330,294,262,262,294,330,330,294,294,-1;欢乐颂(前段)
            
timetable1  dw 8 dup(25)
            dw 4 dup(25),50,2 dup(25)
            
frequency2  dw 5 dup(262),293,293,329,294, 262,262,523,494,440,392,392
            dw 3 dup(440),392,349,349,392,392,440,262, 3 dup(293),262,294
            dw 440,329,440,392,392,-1
timetable2  dw 25,12,13,25,25,25,12,13,50,25,25,50,25,12,13,50
            dw 25,12,13,12,13,25,25,12,13,50,25,12,13,25,25
            dw 12,13,25,50,75                                            ;对面
            
frequency3  dw 330,330,349,392,392,349, 330,294,262,262,294,330,294,262,262,-1;欢乐颂(后段)            
timetable3  dw 8 dup(25)
            dw 4 dup(25),50,2 dup(25)        
           
DATAS ENDS
;....................................

;....................................

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS
;::::::::::::::::::::::::::::::::::::::::::::::::
;.....................主程序.....................
;________________________________________________
CODES SEGMENT
     ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
     MOV AX,DATAS
     MOV DS,AX

     call chushihua;完成一系列初始化
     
restart:
     call getstart ;车辆启动程序
lop: 
     daconver chesu,chesu3
     mov ax,chesu3
     cmp ax,0
     jz  next1    ;车速为0,动画停止
     cmp ax,3000
     jbe next2
     mov ax,3000;车速大于300km/h,限速处理
     mov chesu3,ax
     call speedconver
next2:
     mov al,flagdis
     cmp al,0
     jnz nextlop
     call diszhongxian2;显示路中线2
     mov al,1
     mov flagdis,al
nextlop:
     call diszhongxian1;显示路中线1
     mov al,0
     mov flagdis,al
     
next1:
     call varyspeed  ;键盘输入增减速度

     call delay0
     
     call chulilicheng;处理里程

     call jizongjia   ;计算并显示总价
     
     
     call checkkey    ;检键盘命令
     
     jmp lop
     
     
;....................................     
exit:
     MOV AH,4CH
     INT 21H
;::::::::::::::::::::::::::::::::::::::::::::::::
;------------------------------------------------

;*****键盘输入停止处理****
stop proc
     lea si,bufferflag
     mov al,1
     mov [si+3],al
     mov al,1
     mov [si+7],al
     mov al,2
     mov [si+11],al
     call disflag  ;修改运行,暂停,停止(■)标志并显示
     
     call movecar
     
     music frequency3,timetable3 ;播放结束音乐
     call clearscreen            ;清屏
     setdistype distype
     
     lea dx,demand               ;显示输入提示信息
     mov ah,09h
     int 21h
lpstop:
     in  al,60h
     cmp al,4bh
     jnz nextstop

     lea si,licheng+4
     
     mov ax,0
     mov dx,0
     mov bx,10
     div bx
     add dl,30h
     mov [si],dl  ;存小数位
     dec si
     dec si
     
     mov dx,0
     div bx
     add dl,30h
     mov [si],dl  ;存个位
     dec si
     
     mov dx,0
     div bx
     cmp ax,0
     jz  nexxtsc1
     add dl,30h
     mov [si],dl  
     dec si
     jmp nexxtsc3
     
nexxtsc1:
     cmp dl,0
     jnz nexxtsc2
     mov dl,' '
     mov [si],dl
     dec si
     mov [si],dl
     jmp exxitsc
nexxtsc2:
     add dl,30h
     mov [si],dl
     mov dl,' '
     dec si
     mov [si],dl
     jmp exxitsc   ;存十位
     
nexxtsc3:
     add al,30h
     mov [si],al  ;存百位

exxitsc:
     call chushi2
    
     jmp far ptr restart       ;小键盘4重启

⌨️ 快捷键说明

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