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

📄 2.asm

📁 计算机硬件技术基础课程设计,用汇编语言编写的出租车计价器。
💻 ASM
📖 第 1 页 / 共 3 页
字号:
nextstop:
     cmp al,4dh                ;小键盘6结束程序
     jnz lpstop     
     jmp far ptr exit
     ret
stop endp
;.....................
chushi2 proc

     lea si,zongjia+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  nexxxtsc1
     add dl,30h
     mov [si],dl  
     dec si
     jmp nexxtsc3
     
nexxxtsc1:
     cmp dl,0
     jnz nexxxtsc2
     mov dl,' '
     mov [si],dl
     dec si
     mov [si],dl
     jmp exxxitsc
nexxxtsc2:
     add dl,30h
     mov [si],dl
     mov dl,' '
     dec si
     mov [si],dl
     jmp exxxitsc   ;存十位
     
nexxxtsc3:
     add al,30h
     mov [si],al  ;存百位

exxxitsc:
     call chushisc ;屏幕初始化
     call dischars ;显示汉字及图形的字模
     call distexts ;显示数字及其他单列文本字符
     call disflag  ;运行,暂停,停止(■)标志显示
     call txtliner ;画横行
     call txtlinel ;画纵列     
     call disdatas ;即时显示起步价,单价,车速,总价,里程信息
     call diszhongxian1;显示路中线1

     ret
chushi2 endp

;*****延时一会****
delay proc
     mov ecx,0ffffh     
lpdelayy:
     mov ebx,0ffh
lpdelay:
     dec ebx
     jnz lpdelay
     loop lpdelayy
     
     ret
delay endp

;*****键盘输入检测及处理****
checkkey proc

     in  al,60h
     cmp al,4ch  ;小键盘'5'为暂停键
     jnz nextck
     call pause
nextck:
     cmp al,4dh  ;小键盘'6'为停止键
     jnz nextck2
     call stop
nextck2:     
     ret
checkkey endp

;*****键盘输入暂停处理****
pause proc
     lea si,bufferflag
     mov al,1
     mov [si+3],al
     mov al,2
     mov [si+7],al
     mov al,1
     mov [si+11],al
     call disflag  ;修改运行,暂停,停止(■)标志并显示
     music frequency2,timetable2
lppause:
     in  al,60h
     cmp al,4bh  ;小键盘'4'为继续键
     jnz nextpause
     call moveon
     jmp exitpause
nextpause:
     cmp al,4dh  ;小键盘'6'为停止键
     jnz lppause
     call stop
exitpause:
     ret
pause endp
;*****键盘输入继续处理****
moveon proc
     lea si,bufferflag
     mov al,2
     mov [si+3],al
     mov al,1
     mov [si+7],al
     mov al,1
     mov [si+11],al
     call disflag  ;修改运行,暂停,停止(■)标志并显示

     call jishi1  ;计时1

     ret
moveon endp


;*****计算并显示总价****
jizongjia proc
     mov bx,licheng3
     cmp bx,10
     jb  exitjzj
     mov ax,licheng4
lpjzj:
     cmp ax,bx
     jae nextjzj
     add ax,5
     mov licheng4,ax
     jmp lpjzj
nextjzj:
     sub ax,10
     mov dx,danjia2
     mul dx
     mov bx,10
     div bx
     add ax,qibujia2
     
     lea di,zongjia+4
     mov dx,0
     mov bx,10
     div bx
     add dl,30h
     mov [di],dl
     dec di
     mov dl,'.'
     mov [di],dl
     dec di
lpjzj2:
     cmp ax,0
     jz  exitjzj
     mov bl,10
     div bl
     add ah,30h
     mov [di],ah
     mov ah,0
     dec di
     jmp lpjzj2
     
exitjzj: 
     ret
jizongjia endp

;*****处理里程****
chulilicheng proc
     call jishi2   ;计时2,调用程序计录此该系统时间     
     call jilicheng;计算即刻里程
     call jishi1   ;计时1
     call disdatas
     
     ret
chulilicheng endp
;*****完成一系列初始化****
chushihua proc
          
     call inputdata;数据起步价,单价,车速初始输入
     
     call chushisc ;屏幕初始化
     call dischars ;显示汉字及图形的字模
     call distexts ;显示数字及其他单列文本字符
     call disflag  ;运行,暂停,停止(■)标志显示
     call txtliner ;画横行
     call txtlinel ;画纵列     
     call disdatas ;即时显示起步价,单价,车速,总价,里程信息
     call diszhongxian1;显示路中线1
     
     ret
chushihua endp

;*****计算即刻里程****
;
jilicheng proc
     
     call shicha  ;计算时差,修改subtime
     call jichesu ;车速折算,存于chesu2
     
     mov eax,2;subtime
     mov edx,0
     mov dl,chesu2
     cmp dl,0
     jz  nextjlc3 ;当速度变为0就不用计算了
     mul edx      ;相乘得两个时刻间的里程,单位m
     add eax,licheng2
     mov licheng2,eax ;累加到里程的暂存器里面
     
     ;mov edx,0
     ;mov ebx,1000
     ;div ebx
     
     mov edx,eax
     shr edx,16
     mov bx,100
     div bx
     mov licheng3,ax ;以0.1km为基本单位
     
     mov cx,0
     mov dx,0
     mov bx,10
     div bx
     mov dh,dl
     push dx
     inc cx          ;保存小数位
     
     mov dh,'.'
     push dx
     inc cx          ;保存小数点
lpjlc1:
     cmp ax,0
     jz  nextjlc
     mov bl,10
     div bl
     push ax
     mov ah,0     
     inc cx
     jmp lpjlc1     ;找出各整数位并压栈保存
     
nextjlc:
     lea di,licheng+5
     sub di,cx
lpjlc2:
     pop ax
     cmp ah,'.'
     jz  nextjlc2
     add ah,30h
nextjlc2:
     mov [di],ah
     inc di
     loop lpjlc2
nextjlc3:     
     ret
jilicheng endp
;*****车速折算****
;由于模拟运行,时间尺度按1h=>1min折算
;车速chesu2=chesu*1000/60/100 [m/(1/100)s]
;先把车速chesu由字符串转化成数值chesu3
;那么chesu2=chesu3/6
jichesu proc
     daconver chesu,chesu3
     mov ax,chesu3
     cmp ax,0
     jz  nextjic
     mov dx,0
     mov bx,60
     div bx
     cmp al,1
     ja  nextjic
     mov al,1
nextjic:
     mov chesu2,al
      
     ret
jichesu endp
;*****车速数字转成字符串****
;chesu3为作寄存器
;将chesu3的值转化成chesu字符串
speedconver proc
     lea si,chesu+4
     
     mov ax,chesu3
     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  nextsc1
     add dl,30h
     mov [si],dl  
     dec si
     jmp nextsc3
     
nextsc1:
     cmp dl,0
     jnz nextsc2
     mov dl,' '
     mov [si],dl
     dec si
     mov [si],dl
     jmp exitsc
nextsc2:
     add dl,30h
     mov [si],dl
     mov dl,' '
     dec si
     mov [si],dl
     jmp exitsc   ;存十位
     
nextsc3:
     add al,30h
     mov [si],al  ;存百位

exitsc:
     ret
speedconver endp
;*****键盘输入增减速度****
varyspeed proc
     in al,60h
     cmp al,47h  ;小键盘'7'为加速键
     jnz nextvs
     call speedup
     jmp exitvs
nextvs:
     cmp al,4fh  ;小键盘'1'为减速键
     jnz exitvs
     call speeddown
     
exitvs:    
     ret
varyspeed endp
;*****键盘输入增速度****
speedup proc
     daconver chesu,chesu3
     mov ax,10
     add chesu3,ax
     mov ax,9999
     cmp chesu3,ax
     ja  exitsu ;到最大值,则速度维持最大值不变
     call speedconver
exitsu:
     ret
speedup endp
;*****键盘输入减速度****
speeddown proc
     daconver chesu,chesu3
     mov ax,10
     sub chesu3,ax
     js  exitsd ;到最小值,则速度维持最小值不变
     call speedconver
exitsd:
     ret
speeddown endp

;*****计算前后两次调用系统时间间隔****
;为方便后在面计算,将时差转为以1/100s为单位
;结果存在变量subtime中
shicha proc
     mov eax,0
     mov ecx,0
     mov ax,time4
     push ax
     mov ax,time3
     mov bx,time1
     sub ah,bh
     jz  nextshic1
     mov cl,al
     mov al,ah
     mov ah,0
     mov bh,60
     mul bh
     add cl,al
     mov al,cl  ;处理小时
nextshic1:
     sub al,bl
     jz  nextshic2
     pop cx
     mov dl,60
     mov ah,0
     mul dl
     add ch,al
     push cx   ;处理分钟    
nextshic2:
     pop ax
     mov bx,time2
     mov ecx,0
     cmp al,bl
     jb  nextshic3
     sub al,bl
     mov cl,al
     add subtime,ecx
     jmp nextshic4
nextshic3:
     dec ah
     add al,100
     sub al,bl
     mov cl,al
     add subtime,ecx;处理1/100s
nextshic4:
     sub ah,bh
     mov al,ah
     mov ah,0
     mov bl,100
     mul bl
     mov cx,ax
     add subtime,ecx;处理s
     
     ret
shicha endp   
;....................................子程序
;*****车辆启动程序****
;首先等待键盘启动(小键盘'5')
;启动后,先修改运行标志
;再播放一段音乐
getstart proc

lpstart:
     in  al,60h
     cmp al,4bh    ;小键盘'4'为启动键
     jnz lpstart   ;按键启动
     
     lea si,bufferflag
     mov al,2
     mov [si+3],al
     mov al,1
     mov [si+7],al
     mov al,1
     mov [si+11],al
     call disflag  ;修改运行,暂停,停止(■)标志并显示
     music frequency1,timetable1   ;启动音乐
     
     lea si,qibujia
     lea di,zongjia
     mov cx,5
lpgs:
     mov al,[si]
     mov [di],al
     inc si
     inc di
     loop lpgs
     
     call disdatas
     call jishi1  ;计时1
     
     ret
getstart endp
;*****运行,暂停,停止(■)标志显示****
disflag proc
     lea si,bufferflag
lpdf:
     mov dh,[si]   ;光标行号
     cmp dh,0ffh
     jz  exitdf    ;为offh时退出
     inc si

⌨️ 快捷键说明

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