📄 user.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 + -