📄 2.asm
字号:
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 + -