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 + -
显示快捷键?