moon.asm
来自「基于ADEK-PC实验系统多路温度信号(0~85℃)数据测量采集系统」· 汇编 代码 · 共 423 行 · 第 1/2 页
ASM
423 行
mov temp_dx,dx ;取当前光标位置,并存于temp_dx中
mov current_x,dl
mov current_y,dh
mov dx,21bh
mov al,89h
out dx,al
;mov cx,255
first: mov count,0
cool: call ad_sub
call compute ;转换一个采样数据,并回显
mov dl,' '
mov ah,02h
int 21h
int 21h ;输出两空格
push cx
print 11,21,29,18,yellow ;提示按ESC退出
pop cx
add current_x,8 ;调整光标参数
cur current_x,current_y
inc count
cmp count,8
jnz cool
mov ah,1 ;读键盘缓冲区的字符,ZF=1空 ZF=0 AL=字符码
int 16h
jz void ;键盘缓冲区则跳转
push ax
push cx
print 10,21,29,18,yellow ;提示按任意键继续
pop cx
pop ax
cmp al,1bh ;为ESC?
jnz hope ;有ESC按下,退出扫描
ret
hope: cls_key ;无ESC按下,清空键盘缓冲区,继续扫描
void: mov dx,temp_dx ;重设光标坐标
mov current_x,dl
cur current_x,current_y
mov dl,0dh ;向缓冲区存入一组换行符
push_cache
mov dl,0ah
push_cache
cmp point,cache_len ;缓冲区是否已满?
jnb full
jmp first
full: mov point,0 ;若满则置0
jmp first
ret
circle endp
;****************
compute proc near ;子程序compute从num_in得原始采样数据,按比率转换为xx.x形式并以xx.x℃形式回显
pushf
push ax
push cx
push dx ;保护现场
mov al,num_in ;原始采样数据入al
mov ah,00h
div num_x ;将0~255除3转为0~85结果入ax
push ax ;保存转换结果于ax:商->al,余数->ah
mov ah,00h ;清0~255/3的余数
div num_y ;取商的十位及个位
mov dl,ah ;余数入dl
mov ah,0
mov cl,4
rol ax,cl ;十位数左移
or al,dl ;十位及个位组合完成,入al
mov num_out_up,al ;num_out_up得到原始采样数据按比率转换后整数部分,以BCD形式保存
pop ax ;取回转换结果
cmp ah,00h ;判断余数是否为0
mov num_out_down,0
jz jump ;为0:保存余数于num_out_down 并跳过小数约取步骤
and al,00h ;不为0:进行小数约取步骤,精度0.0,四舍五入
xchg ah,al
mul num_y ;取0.x位小数
div num_x ;0~255/3调整
mov num_out_down,al ;暂存num_out_down
and al,00h ;继续取0.0x位小数
xchg ah,al
mul num_y
div num_x
cmp al,5 ;判断,并四舍五入
jb jump
mov al,num_out_down
add al,1
mov num_out_down,al
jump: mov al,num_out_up ;做输出准备,al暂存高位
mov ch,2 ;设置2次循环,分别控制十位和个位的显示
mov cl,4 ;4次移位控制参量
nextb: rol al,cl
push ax
mov dl,al
and dl,0fh
or dl,30h ;完成十位/个位的ascII码转换
mov ah,2
int 21h ;输出十位/个位
push_cache ;推入缓存区
pop ax
dec ch ;控制2次循环,ch自减
jnz nextb ;循环两次输出十位/个位
mov ah,2
mov dl,'.'
int 21h ;输出“.”
push_cache ;推入缓存区
mov dl,num_out_down
or dl,30h
mov ah,2
int 21h ;输出小数位
push_cache
mov dl,' '
push_cache ;推入缓存区,小数位和空格
mov dl,0f8h ;显示“°”
mov ah,2
int 21h
mov dl,'C' ;显示“C”
mov ah,2
int 21h
pop dx ;恢复现场
pop cx
pop ax
popf
ret
compute endp
;****************
editfile proc near ;子程序editfile,建立文件并记录缓存区中的数据
call create ;建立文件
call write ;写文件
call close ;关闭文件
ret
editfile endp
;****************
create proc near
xor ax,ax
mov ah,3ch ;请求新建文件
mov cx,0 ;文件为一般属性
lea dx,pathnam ;设置文件路径
int 21h
jc cte_erro ;出错?
mov handle,ax ;储存文件代号
ret
cte_erro:error 12
ret
create endp
;****************
write proc near
xor ax,ax
mov ah,40h ;请求写入字符串
mov bx,handle ;说明目的文件代号
mov cx,cache_len ;写入长度
lea dx,datarec ;字符串入口
int 21h
jnc normal ;正常写入?
error 13 ;报错
normal:ret
write endp
;****************
close proc near
xor ax,ax
mov ah,3eh ;请求关闭文件
mov bx,handle ;说明关闭文件代号
int 21h
ret
close endp
;****************
ad_sub proc near
cld
mov dx,220h
add dl,count
mov al,6
out dx,al
mov dx,21ah
no_conv:in al,dx
test al,80h
jnz no_conv
no_eoc:in al,dx
test al,80h
jz no_eoc
mov dx,220h
add dl,count
in al,dx
mov num_in,al
mov ah,count
inc ah
or ah,30h
sub ah,tab_7
jnz feet
mov put_led,al
feet: ret
ad_sub endp
end start
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?