⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 user.asm

📁 基于PIC16F72的超声波清洗机源程序(汇编).
💻 ASM
字号:
INCLUDE "P16XX.EQU"
INCLUDE "SYS.INI"
;**********************************************************************
#DEFINE  USE_T0       1H   ;T0中断使用标记
#DEFINE  USE_EX       0H   ;外部中断使用标记
#DEFINE  USE_EEROM    0H   ;93C46是否有效
#DEFINE  USE_595      0H   ;显示595驱动是否有效
#DEFINE  USE_H2D      0H   ;使用2字节HEX-->DEC程序
#DEFINE  TIM_SUM      3H   ;赋任务数为3
#DEFINE  DW_SYB       0H   ;单双档标志
;*************************************************************************
INCLUDE "USER.INI"

        ORG     00H             ; Retset Vector
        GOTO    MAIN            

        ORG     04H             ; Skip over interrupt vecter
        GOTO    INTZ
;**********************************************************************************        
;显示编码表       
DS_BM  CLRF    PCLATH
       ADDWF   PCL,1
       RETLW   B'00111111'  ;0
       RETLW   B'00000110'  ;1
       RETLW   B'01011011'  ;2
       RETLW   B'01001111'  ;3 
       RETLW   B'01100110'  ;4 
       RETLW   B'01101101'  ;5 
       RETLW   B'01111101'  ;6
       RETLW   B'00000111'  ;7
       RETLW   B'01111111'  ;8
       RETLW   B'01101111'  ;9
       RETLW   B'01110111'  ;A
       RETLW   B'11010110'  ;B
       RETLW   B'11110000'  ;C
       RETLW   B'11000111'  ;D
       RETLW   B'11110010'  ;E
       RETLW   B'01110010'  ;F
       RETLW   B'00000000'  ;熄灭码
       RETLW   B'01110011'  ;P  
       RETLW   B'01000010'  ;R  
       RETLW   B'10010111'  ;Y
       RETLW   B'01000110'  ;N
       RETLW   B'11000110'  ;O
       RETLW   B'01010111'  ;H
;***********************************************************************
              
;******************************************************************
;              控制程序
;******************************************************************  

;主循环
MAIN   CALL    INIT              ;初始化系统 
       CALL    INT_TASK          ;初始化任务
       BCF     SYS_REG,SYS_ON    ;开始默认输出无效       
       CALL    INIT_CS           ;初始化参数       
       GOTO    OS_START          ;系统启动
       GOTO    $  
;*******************************************************************       
;任务0处理,显示处理,及扫键
TASK0  BCF     TIM_OV,TASKID0
       CLRF    PCLATH
       MOVF    DS_COM,W
       ANDLW   B'00000011'
       ADDWF   PCL,1
       GOTO    DS_RUN    ;0:正常显示参数
       GOTO    DS_FS1    ;1:闪烁显示
       GOTO    CLS
       
;***************************************************************       
DS_RUN BTFSS   SYS_REG,NEW_DAT ;如果数据已经转换,则不再转换;
       GOTO    DS_OUT
DS_CH  BCF     SYS_REG,NEW_DAT

       MOVLW   DS_RAM
       MOVWF   FSR
       
       MOVF    WORK_MIN,W
       CALL    HEXTOBCD        ;分,进制转换
       
       MOVF    DS_S2,W
       MOVWF   INDF     ;LED1
       
       INCF    FSR,1
       MOVF    DS_S1,W
       MOVWF   INDF
       
       MOVF    WORK_SEC,W     ;秒,进制转换
       CALL    HEXTOBCD       
       INCF    FSR,1
       MOVF    DS_S2,W
       MOVWF   INDF     ;LED3
       
       INCF    FSR,1
       MOVF    DS_S1,W
       MOVWF   INDF
       GOTO    DS_OUT
;**************************************************************
;闪烁控制       
DS_FS1 BTFSC   SYS_REG,NEW_DAT
       GOTO    DS_CH
       
       INCF    DS_FP,1
       BTFSS   DS_FP,7
       GOTO    DS_OUT   ;0.5S闪烁1次
       MOVF    DS_SS,W
       SUBWF   DS_PC,W
       BTFSC   STATUS,C ;如果当前位需要闪烁,则替换成熄灭码
       GOTO    DS_OUT
       CLRF    DS_S1
       GOTO    SET_PC
      
;*****************************************************************

;****************************************************************************
DS_OUT MOVLW   DS_RAM
       ADDWF   DS_PC,W   ;指向指针所指向的单元
       MOVWF   FSR
       MOVF    INDF,W    ;取数据
       ANDLW   B'00011111'
       CALL    DS_BM     ;查显示编码
       MOVWF   DS_S1     ;设置显示数据
       MOVF    DS_PC,W
       SUBLW   D'1'
       BTFSS   STATUS,C
       GOTO    SET_PC
       
       BTFSS   SYS_REG,DS_SS_SY
       BCF     DS_S1,7
       BTFSC   SYS_REG,DS_SS_SY
       BSF     DS_S1,7       
       
SET_PC MOVLW   7FH
       MOVWF   DS_S2
       MOVF    DS_PC,W
       MOVWF   DS_CNT    ;取显示指针
PC_RATE       
       MOVF    DS_CNT,W
       BTFSC   STATUS,Z
       GOTO    INC_PC    ;设置显示指针
       BSF     STATUS,C
       RRF     DS_S2,1
       DECF    DS_CNT,1
       GOTO    PC_RATE    
INC_PC INCF    DS_PC,1   ;指向下一个显示单元
       BTFSC   DS_PC,2
       CLRF    DS_PC     ;如果超位,则归零  
       GOTO    DS_END
;*************************************************************************              
CLS    CLRF    DS_S1     ;清屏
       CLRF    DS_S2
       CLRF    DS_PC     ;显示指针归零  
DS_END CALL    XS_DRV_SC ;驱动显示
;**************************************************************************
;开始扫键处理
K_BEG
       INCF    K_LB,1      ;滤波器递增
       MOVF    KSTA,W
       ANDLW   B'00001111' ;取有效的按键信息
       MOVWF   K_NEW
       XORLW   B'00001111'
       BTFSC   STATUS,Z
       GOTO    NO_KEY      ;无键,则转
       
       CLRF    K_N_LB       
       MOVF    K_NEW,W
       XORWF   K_VAL,W
       BTFSC   STATUS,Z    ;判别是否和上次按键一样
       GOTO    K_LB_S      ;一样,则滤波开始 
       CLRF    K_LB
       MOVF    K_NEW,W     ;否则替换按键信息
       MOVWF   K_VAL
       
K_LB_S BTFSS   K_LB,5      ;滤波等待
       GOTO    K_END
       
       MOVF    K_VAL,W
       XORWF   K_OLD,W
       BTFSS   STATUS,Z
       GOTO    KEY_YX      ;如果不是重复键,则直接有效       
       
   
       MOVF    K_VAL,W
       XORLW   K_ON
       BTFSC   STATUS,Z
       GOTO    K_END       
       
IF   DW_SYB       
       MOVF    K_VAL,W
       XORLW   K_TYP
       BTFSC   STATUS,Z
       GOTO    K_END       ;在单档时,档位按键做秒键使用,也连续有效 
ENDIF             
       
       BTFSS   K_LB,6      ;滤波等待(时间设置滤波时间长)
       GOTO    K_END       
    
KEY_YX MOVF    K_VAL,W
       MOVWF   K_OLD        ;替换上次按键信息  
       MOVLW   TASKID1      ;击活按键处理
       CALL    EN_TASK
NO_KEY INCF    K_N_LB,1
       BTFSS   K_N_LB,3
       GOTO    K_END
       CLRF    K_N_LB
       CLRF    K_OLD
       CLRF    K_LB  
K_END  RETURN 
;**********************************************************************
                   
;****************************************************************************
;任务1处理,按键处理
TASK1  BCF     TIM_OV,TASKID1
       MOVF    K_VAL,W
       XORLW   K_MIN
       BTFSC   STATUS,Z         ;分键值判别
       GOTO    MIN_CL
 
       MOVF    K_VAL,W          ;秒键值判别
       XORLW   K_SEC
       BTFSC   STATUS,Z
       GOTO    SEC_CL      
       
       MOVF    K_VAL,W          ;档为位键值判别
       XORLW   K_TYP
       BTFSC   STATUS,Z
       GOTO    TYP_CL       
       
       MOVF    K_VAL,W          ;启动键值判别
       XORLW   K_ON 
       BTFSC   STATUS,Z
       GOTO    ON_CL
       GOTO    KEY_CL_END
;*******************************************************************
;双档程序
IF   DW_SYB
;各键处理       
MIN_CL BTFSC   SYS_REG,SYS_ON     ;只有没有启动输出时有效
       GOTO    KEY_CL_END
       BSF     SYS_REG,NEW_DAT    ;新数据标志
       
       INCF    WORK_MIN,1         ;分递增
       MOVLW   D'0'               ;0号参数:0--15
       MOVWF   PAR_LIT
       MOVLW   D'16'

       SUBWF   WORK_MIN,W
       BTFSS   STATUS,C
       GOTO    KEY_CL_END         ;判别是否到上限        
       
       MOVF    PAR_LIT,W          ;到上限了,则清到下限
       MOVWF   WORK_MIN
       MOVF    WORK_SEC,W
       BTFSS   STATUS,Z
       GOTO    KEY_CL_END
       MOVLW   D'10'
       MOVWF   WORK_SEC
       GOTO    KEY_CL_END         ;最小为10S

;***************************************************************************       
SEC_CL BTFSC   SYS_REG,SYS_ON     ;只有没有启动输出时有效
       GOTO    KEY_CL_END
       BSF     SYS_REG,NEW_DAT    ;新数据标志
       
      
       MOVLW   D'10'
       ADDWF   WORK_SEC,1         ;秒*10递减
 
       MOVLW   D'0'               ;0号参数:0--15
       MOVWF   PAR_LIT
       
       MOVLW   D'60'

       SUBWF   WORK_SEC,W
       BTFSS   STATUS,C
       GOTO    KEY_CL_END         ;判别是否到上限  

       MOVF    PAR_LIT,W          ;到上限了,则清到下限
       MOVWF   WORK_SEC
       
       MOVF    WORK_MIN,W
       BTFSS   STATUS,Z
       GOTO    KEY_CL_END        
       MOVLW   D'10' 
       MOVWF   WORK_SEC              
       GOTO    KEY_CL_END            
           
;******************************************************************************
TYP_CL BTFSS   SYS_REG,SYS_TYP
       GOTO    SET_TYP
       BCF     SYS_REG,SYS_TYP
       GOTO    KEY_CL_END
SET_TYP
       BSF     SYS_REG,SYS_TYP       
       GOTO    KEY_CL_END         
       
ENDIF       
;*******************************************************************************
IF  DW_SYB==0
;各键处理       
MIN_CL BTFSC   SYS_REG,SYS_ON     ;只有没有启动输出时有效
       GOTO    KEY_CL_END
       BSF     SYS_REG,NEW_DAT    ;新数据标志
       
       MOVLW   D'10'
       ADDWF   W_MIN_T,1          ;分十位递增
       
LIM_PB 
       MOVF    W_MIN_T,W
       ADDWF   W_MIN_S,W
       MOVWF   WORK_MIN           ;合成分时间
       SUBLW   D'31'
       BTFSS   STATUS,C
       CLRF    WORK_MIN
       MOVF    WORK_MIN , W
       BTFSS   STATUS,Z
       GOTO    KEY_CL_END         ;如果时间为0,则转成1(禁止为0)
       CLRF    W_MIN_T
       CLRF    W_MIN_S
       
       MOVF    WORK_SEC ,W
       BTFSS   STATUS   ,Z
       GOTO    KEY_CL_END
             
       MOVLW   D'10'               
       MOVWF   WORK_SEC 
       GOTO    KEY_CL_END
       

;***************************************************************************       
SEC_CL BTFSC   SYS_REG,SYS_ON     ;只有没有启动输出时有效
       GOTO    KEY_CL_END
       BSF     SYS_REG,NEW_DAT    ;新数据标志
       INCF    W_MIN_S,1          ;分个位递减
       MOVF    W_MIN_S,W
       XORLW   0AH
       BTFSC   STATUS,Z
       CLRF    W_MIN_S
       GOTO    LIM_PB           
           
;******************************************************************************
TYP_CL BTFSC   SYS_REG,SYS_ON     ;只有没有启动输出时有效
       GOTO    KEY_CL_END
       BSF     SYS_REG,NEW_DAT    ;新数据标志
       
      
       MOVLW   D'10'
       ADDWF   WORK_SEC,1         ;秒*10递减
 
       
       MOVLW   D'0'               ;0号参数:0--15
       MOVWF   PAR_LIT
       MOVLW   D'60'

       SUBWF   WORK_SEC,W
       BTFSS   STATUS,C
       GOTO    KEY_CL_END         ;判别是否到上限        
       
       MOVF    PAR_LIT,W          ;到上限了,则清到下限
       MOVWF   WORK_SEC
       
       MOVF    WORK_MIN,W
       BTFSS   STATUS,Z
       GOTO    KEY_CL_END        
       MOVLW   D'10' 
       MOVWF   WORK_SEC              
       GOTO    KEY_CL_END    

ENDIF
;********************************************************************************
ON_CL  BTFSS   SYS_REG,SYS_ON
       GOTO    SET_ON
       BCF     SYS_REG,SYS_ON
       GOTO    KON_INIT
SET_ON
       BSF     SYS_REG,SYS_ON       
KON_INIT
       CALL    INIT_CS
KEY_CL_END  
       CLRF   K_VAL 
       RETURN
;********************************************************************************************************
;输出监控
TASK2  BCF     TIM_OV,TASKID2
       BTFSS   SYS_REG,SYS_ON
       GOTO    TASK_END

       MOVF    WORK_MIN,W
       BTFSS   STATUS,Z
       GOTO    SC_EN_ING
       
       MOVF    WORK_SEC,W
       BTFSS   STATUS,Z
       GOTO    SC_EN_ING          ;判别是否完成
             
       BCF     SYS_REG,SYS_ON
       BCF     SYS_REG,SYS_TYP   ;完成后,停止输出
       BCF     ON_OUT
       BCF     DL_LED
       BCF     DH_LED
       CALL    INIT_CS           ;初始化为上电状态 
       MOVLW   TASKID2
       CALL    DS_TASK           ;挂起本任务
       GOTO    TASK_END
       
SC_EN_ING BTFSS   SYS_REG,SYS_ON
          BCF     ON_OUT
          BTFSC   SYS_REG,SYS_ON ;没有完成,则根据设置输出
          BSF     ON_OUT
          
          MOVF    TIM_SS,W
          BTFSS   STATUS,Z
          GOTO    DW_PB_SC
          MOVLW   D'5'
          MOVWF   TIM_SS       ;闪烁间隔时间复位
          
          BTFSC   SYS_REG,DS_SS_SY
          GOTO    DS_SS_WX
          BSF     SYS_REG,DS_SS_SY
          GOTO    DW_PB_SC 
DS_SS_WX  BCF     SYS_REG,DS_SS_SY
DW_PB_SC  BTFSS   SYS_REG,SYS_TYP
          GOTO    L_WD_SC
          
          BCF     DL_LED
          BSF     DH_LED
          BSF     DW_OUT
          GOTO    TASK_END
         
L_WD_SC   BSF     DL_LED
          BCF     DH_LED
          BCF     DW_OUT       
TASK_END  RETURN
;********************************************************************************************************      
;T0服务程序        
INT_SERVER_T0 
        BTFSS   SYS_REG,SYS_ON    ;判别是否输出允许
        GOTO    T0_CL_END
        
        DECFSZ  TIM_MS,1
        GOTO    T0_CL_END
IF  CRY_PL== D'4'        
        MOVLW   D'5'
        MOVWF   TIM_MS     ;MS时间间隔
ENDIF        

IF  CRY_PL== D'16'        
        MOVLW   D'20'
        MOVWF   TIM_MS     ;MS时间间隔
ENDIF      
        DECFSZ  TIM_HS,1
        GOTO    T0_CL_END
        MOVLW   D'100'
        MOVWF   TIM_HS       ;100MS时间间隔
        
        MOVF    TIM_SS,W
        BTFSS   STATUS,Z
        DECF    TIM_SS,1 
         
        DECFSZ  TIM_S,1
        GOTO    T0_CL_END
        MOVLW   D'10'
        MOVWF   TIM_S        ;1S时间间隔
        
        
        MOVF    WORK_MIN,W
        BTFSS   STATUS,Z
        GOTO    WORK_EDC
        MOVF    WORK_SEC,W
        BTFSC   STATUS,Z
        GOTO    T0_CL_END    ;工作时间递减
        
WORK_EDC 
        BSF     SYS_REG,NEW_DAT ;刷新显示       
        DECF    WORK_SEC,1   ;工作秒递减  
        MOVF    WORK_SEC,W
        XORLW   0FFH
        BTFSS   STATUS,Z
        GOTO    T0_CL_END  
        MOVLW   D'59'
        MOVWF   WORK_SEC     
        DECF    WORK_MIN,1      
T0_CL_END
        RETURN  
;********************************************************************* 
            

INCLUDE "INIT.ASM"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -