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