moon.asm
来自「基于ADEK-PC实验系统多路温度信号(0~85℃)数据测量采集系统」· 汇编 代码 · 共 423 行 · 第 1/2 页
ASM
423 行
cache_len equ 1006 ; 定义缓冲区大小,单位字节(byte)
;****************
;宏定义
;****************
print macro num,len,x,y,color ;在指定位置显示字符串num->调用串号,len->长度,x,y->坐标,color->颜色
mov bp,seg tab_&num
mov es,bp
mov bp,offset tab_&num
mov cx,len
mov dl,x
mov dh,y
mov bl,color
mov al,1
mov ah,13h
int 10h
endm
;****************
cur macro x,y ;设置光标位置,x,y->坐标
mov ah,02
mov bh,0
mov dl,x
mov dh,y
int 10h
endm
;****************
clear macro y ;清空一行(打印一行空格),y->指定行
mov ah,02
mov bh,0
mov dl,0
mov dh,y
int 10h
mov ah,09
lea dx,talk_2
int 21h
endm
;****************
push_cache macro ;把dl内容存入以datarec为标志的缓存区中,point为缓存区指针
lea bx,datarec
add bx,point
inc point
mov [bx],dl
endm
;****************
scren macro scren_color ;清屏,并设置背景色和前景色
mov bh,scren_color
mov ax,0600h
mov cx,0
mov dx,184fh
int 10h
endm
;****************
cls_key macro ;清除键盘缓冲区,
mov ah,0ch
mov al,08h
int 21h
endm
;****************
error macro type ;文件操作报错,type 为提示类型
mov dx,temp_dx
inc dh
inc dh
inc dh
mov current_y,dh
mov current_x,dl
print type,17,current_x,current_y,yellow
endm
;********************
;段定义
;********************
.model small ;定义为一般程序模式,所有数据和代码分别位于两个64kb的段内,临近访问
.stack
.data
;********************
;子程序compute使用的变量
num_in db 0ffh ;采样数据临时入口,初始为0ffh
num_x db 3 ;转换倍率255/85=3
num_y db 10 ;十进制转换参量
num_out_up db 00h ;完成转换后的采样数据整数位-BCD形式
num_out_down db 00h ;完成转换后的采样数据小数位-BCD形式
point dw 0 ;缓冲区指针,初始为0
;********************
;子程序editfile使用的变量
datarec db cache_len dup(' ') ;定义缓冲区
handle dw ? ;文件代号,单位字(word)
pathnam db 'datarec.txt',00 ;存盘路径,ASCIZ串(ASCII_ZERO)
tab_12 db '***open error***' ;建文件出错信息
tab_13 db '***write error***' ;写文件出错信息
;********************
;主程序main使用的变量
white equ 1fh ;宏print中使用的颜色参量,高位->背景,低位->前景。参见int 10h
yellow equ 1eh ;1->蓝
green equ 1ah
red equ 1ch
temp_dx dw ? ;临时储存光标坐标,dl->x,dh->y
count db 0
current_x db ?
current_y db ?
talk_1 db ' ' ;提示信息
db 'Temperature Measure'
db 0ah,0dh
db 0ah,0dh
db ' '
db 'USST (R) version beta 1.0 By shen-bin'
db 0ah,0dh
db ' '
db '(c) Copyright USST 2004~????'
db 0ah,0dh
db ' '
db 'All rights reserved'
db 0ah,0dh,'$'
talk_2 db 80 dup(' '),'$' ;80个空格,用来清空一行
tab_1 db ' >>>>>>>>','$'
tab_2 db ' <<<<<<<<','$'
tab_3 db 30 dup(0cdh) ;显示一行“=”,30个
tab_4 db 'Please select one CHANNEL to display on LED(1~8)'
db 0ah,0dh
db ' Press <ESC> to quit!'
tab_5 db 'You choose the CHANNEL < >'
tab_6 db 'Program terminated normally.'
db 0ah,0dh
db ' Thanks for useing !'
tab_7 db ? ;choose返回的用户选择
tab_8 db 'This channel',27h,'s data will be shown on the LED'
tab_9 db ' ',1ah,'1',1bh,' ' ;显示->1<-等
db ' ',1ah,'2',1bh,' '
db ' ',1ah,'3',1bh,' '
db ' ',1ah,'4',1bh,' '
db ' ',1ah,'5',1bh,' '
db ' ',1ah,'6',1bh,' '
db ' ',1ah,'7',1bh,' '
db ' ',1ah,'8',1bh
tab_10 db 'Press any key to SCAN'
tab_11 db 'Press ESC to end SCAN'
put_led db 0ffh
;********************
.code ;代码段
start:
main proc far ;主程序
mov ax,@data ;初始化数据段和附加段
mov ds,ax
mov es,ax
scren white ;清屏,设为蓝底白字
cur 0,0 ;设光标位置0,0
mov ah,09h
lea dx,talk_1
int 21h ;显示提示信息
print 1,28,0,0,red
print 2,10,50,0,red
print 3,30,25,6,green
print 4,100,16,8,yellow
mov temp_dx,dx ;保存光标坐标
call choose ;接受选择结果存tab_7
clear 9 ;清空第9行
cmp tab_7,0ffh ;判断是否为ESC
jnz kkk
jmp bye ;为ESC则跳转显示结束信息
kkk: print 5,28,26,9,yellow
print 7,1,51,9,red ;回显用户选择
print 8,44,18,10,yellow
print 3,30,25,12,green
print 9,60,10,14,red ;构造8通道显示区
print 10,21,29,18,yellow
cur 10,16
cls_key ;清除键盘缓冲区,为扫描中的用户操作作准备
call circle ;调用主扫描程序
call editfile ;生成文件记录数据
mov dx,219h
mov al,put_led
not al
out dx,al
bye: mov dx,temp_dx ;取回原光标坐标
inc dh
inc dh ;下移两行
mov tab_7,dh ;暂用tab_7存行数,这是由于temp_dx为word不能用于print中
print 3,30,25,tab_7,green
inc dh
inc dh
mov tab_7,dh
print 6,80,26,tab_7,red
mov ah,02h
mov dl,0ah
int 21h
mov al,0dh
int 21h ;显示结束信息
mov ax,4c00h ;返回DOS
int 21h
main endp
;********************
choose proc near ;子程序choose,接受键盘输入,键值以tab_7,al返回
notyet: mov ah,07h
int 21h
cmp al,1bh ;为ESC?
jz move
cmp al,31h ;是否为1~8,否则循环等待
jl notyet
cmp al,39h
jnl notyet
mov tab_7,al
jmp die
move: mov tab_7,0ffh ;为ESC时,置tab_7为0ffh
die: ret
choose endp
;********************
circle proc near ;子程序choose
mov ah,3
mov bh,0
int 10h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?