📄 wcon.asm
字号:
;******************************************************
; 功 能:车载空调除霜通风控制 具体见原理图
; 硬 件: PIC16C54C
; 时 钟: XT 4MHz, WDT_OFF
; 作 者;whaul
; 日 期: 07.05.16
; 版 本: V1.00
;******************************************************
LIST P=16C54C
#include P16C5x.inc
AC_OUT EQU 0 ; AC输出口 (PA0)
YS_OUT EQU 2 ; 电机延时输出口(PA2)
GD_OUT EQU 1 ; 电机正反转输出口(PA1)
AC_IN EQU 0 ; AC输入口,通过SW1这一按钮取其脉冲信号(PB0)
CS_IN EQU 1 ; 除霜口,它为1时,GD-OUT为0,YS-OUT为1并延时7秒后回到0(PB1)
MC_IN EQU 2 ; 循环请求,通过SW2这一按钮取其脉冲信号(PB2)
XH_IN EQU 3 ; 熄火信号,它为0时,AC-OUT=1,GD-OUT=0,YS-OUT=1并延时7秒后回到0(PB3)
GF_IN EQU 4 ; 鼓风机分档信号,0档时,AC-OUT=1(PB4)
FLAGA EQU 0FH
F_KEYCYC_EN EQU 0 ;CYC按键有效标志
FLAG EQU 10H ;(SW1标志位)
F_KEY_AC EQU 0 ;AC按键标志;
F_KEY_CYC EQU 1 ;CYC按键标志
F_YS7S EQU 2 ;delay 7S enable?
F_DH EQU 3 ;点火标志
KEY_AC_ENABLE EQU 4 ;AC按键按下标志
F_CS EQU 5 ;除霜标志
KEY_CYC_ENABLE EQU 6 ;CYC按键按下标志
F_KEYAC_EN EQU 7 ;AC按键有效标志
COUNT EQU 11H ;每计时溢出一次,此寄存器加1,到250时即计时1S;
COUNT7S EQU 12H ;7S延时计时寄存器
ACCOUNT EQU 13H ;AC按键延时计时寄存器
CSCOUNT EQU 14H ;CS按键延时计时寄存器,延时:3*4ms
COMP_REG EQU 15H ;放置定时比较值
;---------------------------------
ORG 1FFH
GOTO START
;----------------------------------------
org 000H
;----------------------------------------
START nop
; BTFSC 3,NOT_PD ;WHEN /PD=1:POWER_UP RESET ; WHEN /PD=0:/MCLR WAKE_UP RESET;
; GOTO WAKEUP
MOVLW 00H
MOVWF FLAG ;清标志位
MOVWF COUNT
MOVWF COUNT7S
MOVWF COMP_REG
;WAKEUP
MOVLW 00H
TRIS 5
MOVLW 0FFH
TRIS 6
MOVLW 06H ;N = 256-6 =250,
MOVWF TMR0 ;主程跑一圈必须在2ms以内,否则定时误差就可能超过4ms
MOVLW 03H ;PRESCALE = 16, TIMER =16US * N(=250) =2000US =4MS
OPTION ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
BSF 5,AC_OUT
BCF 5,GD_OUT
BSF 5,YS_OUT
BSF FLAG,F_YS7S
CLRF COUNT ;清此位,使7S定时误差控制在4ms左右.
INITSTATE NOP
CALL TIMOVER
MOVLW 06H ;大于6才循环结束,所以实际定时7S
MOVWF COMP_REG
MOVF COUNT7S,0
SUBWF COMP_REG,0
BTFSC STATUS,0 ;定时>=7S,则初始化结束
GOTO INITSTATE ;不到7S,继续检测延时,判断
CLRF COUNT7S
BCF FLAG,F_YS7S
BCF 5,YS_OUT
;***********初始化结束,判断点火信号****************
BTFSC 6,XH_IN ;点火信号判断
GOTO MAIN
BSF 5,AC_OUT ;熄火处理
BCF 5,GD_OUT
BSF 5,YS_OUT
BCF FLAG,F_DH
BSF FLAG,F_YS7S ;开标志位,开始定时
CLRF COUNT
MAIN CALL TIMOVER ;放于此处,循环一次即判断一次.
BTFSC 6,XH_IN
GOTO DHENABLE ;点火有效
BTFSS FLAG,F_DH
GOTO YSENABLE
BCF FLAG,F_DH
BSF 5,AC_OUT ;熄火处理
BCF 5,GD_OUT
BSF 5,YS_OUT
BSF FLAG,F_YS7S ;开标志位,开始定时
CLRF COUNT
CLRF COUNT7S
GOTO MAIN
YSENABLE MOVLW 06H
MOVWF COMP_REG
MOVF COUNT7S,0
SUBWF COMP_REG,0
BTFSC STATUS,0 ;定时>=7S,则延时结束
GOTO MAIN ;不到7S,继续检测延时,判断
CLRF COUNT7S
BCF FLAG,F_YS7S
BCF 5,YS_OUT
;***********************************************
;此处可插入进入睡眠态设置
;***************************************************
GOTO MAIN
DHENABLE BSF FLAG,F_DH ;置点火有效标志位.
;***************鼓风机档位判断****************************
BTFSC 6,GF_IN ;点火有效,判断鼓风档位信号
GOTO GFENABLE
BSF 5,AC_OUT ;0档,AC关闭,AC_OUT = 1
GOTO CS_DETECT
GFENABLE CALL KEY_AC
BTFSS FLAG,F_KEYAC_EN
GOTO CS_DETECT ;无键,则跳过动作
BTFSC FLAG,KEY_AC_ENABLE ;有键判断是关还是开
GOTO C1
BSF 5,AC_OUT ;关
GOTO CS_DETECT
C1 BCF 5,AC_OUT ;按键有效,AC开启,AC—OUT = 0
;***********************除霜判断*************************************
CS_DETECT BTFSS 6,CS_IN
GOTO CYC_DETECT
BTFSC FLAG,F_CS
GOTO CS_DLYOK
BSF FLAG,F_CS
BCF 5,GD_OUT
BSF 5,YS_OUT
BSF FLAG,F_YS7S
CLRF COUNT
CLRF COUNT7S
GOTO MAIN ;开始定时,回到MAIN
CS_DLYOK MOVLW 06H ;已在定时中,判断定时到否
MOVWF COMP_REG
MOVF COUNT7S,0
SUBWF COMP_REG,0
BTFSC STATUS,0
GOTO BK0
CLRF COUNT7S ;定时大于7S,则清延时标志,置低AC—OUT
BCF FLAG,F_YS7S
BCF 5,YS_OUT
BK0 GOTO MAIN
;**************循环键判断*****************************
CYC_DETECT BCF FLAG,F_CS
CALL KEY_CYC
BTFSS FLAGA,F_KEYCYC_EN
GOTO DISCYCKEY
BTFSC FLAG,KEY_CYC_ENABLE ;FALG.6
GOTO CYCEN
BCF 5,GD_OUT ;新风态
BSF 5,YS_OUT
BSF FLAG,F_YS7S
CLRF COUNT
CLRF COUNT7S
GOTO MAIN
CYCEN BSF 5,GD_OUT ;循环风
BSF 5,YS_OUT
BSF FLAG,F_YS7S
CLRF COUNT
CLRF COUNT7S
GOTO MAIN
DISCYCKEY BTFSS FLAG,F_YS7S
GOTO E1
MOVLW 06H ;处于延时中,判断延时到否
MOVWF COMP_REG
MOVF COUNT7S,0
SUBWF COMP_REG,0
BTFSC STATUS,0
GOTO E1
BCF FLAG,F_YS7S
CLRF COUNT7S
BCF 5,YS_OUT
E1 GOTO MAIN
;************************************************************************
;TIMER0定时子程,总定时1秒,COUNT7S加一;
;prescale = 16 ; initial value = (256-250);
;************************************************************************
TIMOVER MOVLW 05H
MOVWF COMP_REG
MOVF TMR0,0
SUBWF COMP_REG,0
BTFSS STATUS,0 ;C=1,计数值比6小,即已计满重新开始
GOTO W1 ;C=0,计数值比6大,即正常计数,返回,
MOVLW 06H ;计到256后溢出处理,置初值,重置分频设置
MOVWF TMR0
MOVLW 03H ;PRESCALE = 16, TIMER = 16US * N(=250) =4000US =4MS
OPTION ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
INCF COUNT,1
BTFSS FLAG,F_KEY_AC
GOTO NX2
INCF ACCOUNT,1
NX2 BTFSS FLAG,F_KEY_CYC
GOTO NX3
INCF CSCOUNT,1
NX3 MOVLW 0F9H ;249(修正后的值)
MOVWF COMP_REG
MOVF COUNT,0
SUBWF COMP_REG,0
BTFSC STATUS,0 ;C=0,计数值比250大,即1S定时到
GOTO W1 ;C=1,计数值比250小,即1S定时未到,
NX4 CLRF COUNT
BTFSS FLAG,F_YS7S
GOTO W1
INCF COUNT7S,1
W1 RETLW 0
;**************************************************************************
;KEY IN
;BUG:当一直按键不放,直到keycount值从256变为小于3的值时释放,则被误认为按键无效
;********************************************************************
KEY_AC BTFSC 6,AC_IN
GOTO BACK0
BTFSC FLAG,F_KEY_AC
GOTO BACK ;按住键不放的过程,继续延时计时,不动作。
BSF FLAG,F_KEY_AC ;刚判断到有键,置有键标志,同时清键延时寄存器keycount
CLRF ACCOUNT
B1 GOTO BACK
BACK0 BTFSS FLAG,F_KEY_AC ;检测到无键,是无键态还是释放态
GOTO BACK ;无键态,则不动作返回
MOVLW 03H ;是释放态,判断延时时间是否大于12ms
MOVWF COMP_REG
MOVF ACCOUNT,0
SUBWF COMP_REG,0
BTFSC STATUS,0
GOTO BACK1 ;延时小于12ms,则认为是抖动态,不动作。
MOVLW 10H ;FLAG.4与1异或,即取反,其它位与0异或,值不变
XORWF FLAG,1 ;KEYCOUNT > 3, 即按键定时到,取反有键标志位
BSF FLAG,F_KEYAC_EN
CLRF ACCOUNT ;延时大于12ms,按键有效,取反AC键
BCF FLAG,F_KEY_AC
GOTO BACK2
BACK1 BCF FLAG,F_KEY_AC
CLRF ACCOUNT
BACK BCF FLAG,F_KEYAC_EN
BACK2 RETLW 0
;******************************************************************************************
KEY_CYC BTFSC 6,MC_IN
GOTO BCK0
BTFSC FLAG,F_KEY_CYC
GOTO BCK ;按住键不放的过程,继续延时计时,不动作。
BSF FLAG,F_KEY_CYC ;刚判断到有键,置有键标志,同时清键延时寄存器keycount
CLRF CSCOUNT
D1 GOTO BCK
BCK0 BTFSS FLAG,F_KEY_CYC ;检测到无键,是无键态还是释放态
GOTO BCK ;无键态,则不动作返回
MOVLW 03H ;是释放态,判断延时时间是否大于12ms
MOVWF COMP_REG
MOVF CSCOUNT,0
SUBWF COMP_REG,0
BTFSC STATUS,0
GOTO BCK1 ;延时小于12ms,则认为是抖动态,不动作。
; CLRF CSCOUNT ;延时大于12ms,按键有效,取反AC键
MOVLW 40H ;FLAG.6与1异或,即取反,其它位与0异或,值不变
XORWF FLAG,1 ;KEYCOUNT > 3, 即按键定时到,取反有键标志位
BSF FLAGA,F_KEYCYC_EN
BCF FLAG,F_KEY_CYC
CLRF CSCOUNT
GOTO BCK2
BCK1 BCF FLAG,F_KEY_CYC
CLRF CSCOUNT
BCK BCF FLAGA,F_KEYCYC_EN
BCK2 RETLW 0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -