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