📄 wcon.sdi
字号:
,,, 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
,,,FLAG EQU 10H ; (SW1标志位)
,,,F_KEY_AC EQU 0
,,,F_KEY_CYC EQU 1
,,,F_YS7S EQU 2
,,,F_DH EQU 3
,,,KEY_AC_ENABLE EQU 4
,,,F_CS EQU 5
,,,KEY_CYC_ENABLE EQU 6
,,,F_KEYAC_EN EQU 7
,,,
,,,COUNT EQU 11H
,,,COUNT7S EQU 12H
,,,ACCOUNT EQU 13H
,,,CSCOUNT EQU 14H
,,,COMP_REG EQU 15H
,,,;REGA EQU 15H ;REGA = 6
,,,;REGB EQU 16H ;REGB = 250
,,,;REGC EQU 17H ;REGC = 7 KEY DELAY = 7S
,,,;REGD EQU 18H ;REGD = 3 KEY DELAY TIME = 3 * 4mS
,,,
,,,;PIC54 EQU 1FFH
,,,;SUB EQU 0
,,,;---------------------------------
,,,
000001FF,,, ORG 1FFH
000001FF,0A00,, GOTO START
,,,;----------------------------------------
,,,; org 0x000
,,,; goto START
00000000,,, org 000H
,,,;----------------------------------------
00000000,0000,START,START nop
,,,; BTFSC 3,NOT_PD ;WHEN /PD=1:POWER_UP RESET ; WHEN /PD=0:/MCLR WA
,,,; GOTO WAKEUP
00000001,0C00,, MOVLW 00H
00000002,0030,, MOVWF FLAG ;清标志位
00000003,0031,, MOVWF COUNT
00000004,0032,, MOVWF COUNT7S
00000005,0035,, MOVWF COMP_REG
,,,;WAKEUP
00000006,0C00,, MOVLW 00H
00000007,0005,, TRIS 5
00000008,0CFF,, MOVLW 0FFH
00000009,0006,, TRIS 6
0000000A,0C06,, MOVLW 06H ;N = 256-6 =250,
0000000B,0021,, MOVWF TMR0 ;主程跑一圈必须在2ms以内,否则定时误差就可能超过4ms
0000000C,0C03,, MOVLW 03H ;PRESCALE = 16, TIMER =16US * N(=250) =2000US =4
0000000D,0002,, OPTION ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
,,,
0000000E,0505,, BSF 5,AC_OUT
0000000F,0425,, BCF 5,GD_OUT
00000010,0545,, BSF 5,YS_OUT
00000011,0550,, BSF FLAG,F_YS7S
00000012,0071,, CLRF COUNT ;清此位,使7S定时误差控制在4ms左右.
00000013,0000,INITSTATE,INITSTATE NOP
00000014,097D,, CALL TIMOVER
00000015,0C07,, MOVLW 07H
00000016,0035,, MOVWF COMP_REG
00000017,0212,, MOVF COUNT7S,0
00000018,0095,, SUBWF COMP_REG,0
00000019,0623,, BTFSC STATUS,1 ;定时>=7S,则初始化结束
0000001A,0A13,, GOTO INITSTATE ;不到7S,继续检测延时,判断
0000001B,0072,, CLRF COUNT7S
0000001C,0450,, BCF FLAG,F_YS7S
0000001D,0445,, BCF 5,YS_OUT
,,,;***********初始化结束,判断点火信号****************
0000001E,0666,, BTFSC 6,XH_IN ;点火信号判断
0000001F,0A26,, GOTO MAIN
00000020,0505,, BSF 5,AC_OUT ;熄火处理
00000021,0425,, BCF 5,GD_OUT
00000022,0545,, BSF 5,YS_OUT
00000023,0470,, BCF FLAG,F_DH
00000024,0550,, BSF FLAG,F_YS7S ;开标志位,开始定时
00000025,0071,, CLRF COUNT
00000026,097D,MAIN,MAIN CALL TIMOVER ;放于此处,循环一次即判断一次.
00000027,0666,, BTFSC 6,XH_IN
00000028,0A3D,, GOTO DHENABLE ;点火有效
00000029,0770,, BTFSS FLAG,F_DH
0000002A,0A33,, GOTO YSENABLE
0000002B,0470,, BCF FLAG,F_DH
0000002C,0505,, BSF 5,AC_OUT ;熄火处理
0000002D,0425,, BCF 5,GD_OUT
0000002E,0545,, BSF 5,YS_OUT
0000002F,0550,, BSF FLAG,F_YS7S ;开标志位,开始定时
00000030,0071,, CLRF COUNT
00000031,0072,, CLRF COUNT7S
00000032,0A26,, GOTO MAIN
00000033,0C07,YSENABLE,YSENABLE MOVLW 07H
00000034,0035,, MOVWF COMP_REG
00000035,0212,, MOVF COUNT7S,0
00000036,0095,, SUBWF COMP_REG,0
00000037,0623,, BTFSC STATUS,1 ;定时>=7S,则延时结束
00000038,0A26,, GOTO MAIN ;不到7S,继续检测延时,判断
00000039,0072,, CLRF COUNT7S
0000003A,0450,, BCF FLAG,F_YS7S
0000003B,0445,, BCF 5,YS_OUT
,,,;***********************************************
,,,;此处可插入进入睡眠态设置
,,,;***************************************************
0000003C,0A26,, GOTO MAIN
0000003D,0570,DHENABLE,DHENABLE BSF FLAG,F_DH ;置点火有效标志位.
,,,; BTFSS FLAG,F_YS7S
,,,; GOTO A1
,,,; MOVLW 07H
,,,; MOVWF REGC
,,,; MOVF COUNT7S,0
,,,; SUBWF REGC,0
,,,; BTFSC STATUS,1 ;定时>=7S,则延时结束
,,,; GOTO A1 ;不到7S,继续检测延时,判断
,,,; CLRF COUNT7S
,,,; BCF FLAG,F_YS7S
,,, ; BCF 5,YS_OUT
,,,;***************鼓风机档位判断****************************
0000003E,0686,, BTFSC 6,GF_IN ;点火有效,判断鼓风档位信号
0000003F,0A42,, GOTO GFENABLE
00000040,0505,, BSF 5,AC_OUT ;0档,AC关闭,AC_OUT = 1
00000041,0A4A,, GOTO CS_DETECT
00000042,0999,GFENABLE,GFENABLE CALL KEY_AC
00000043,07F0,, BTFSS FLAG,F_KEYAC_EN
00000044,0A4A,, GOTO CS_DETECT ;无键,则跳过动作
00000045,0690,, BTFSC FLAG,KEY_AC_ENABLE ;有键判断是关还是开
00000046,0A49,, GOTO C1
00000047,0505,, BSF 5,AC_OUT ;关
00000048,0A4A,, GOTO CS_DETECT
00000049,0405,C1,C1 BCF 5,AC_OUT ;按键有效,AC开启,AC—OUT = 0
,,,;***********************除霜判断*************************************
0000004A,0726,CS_DETECT,CS_DETECT BTFSS 6,CS_IN
0000004B,0A5F,, GOTO CYC_DETECT
0000004C,06B0,, BTFSC FLAG,F_CS
0000004D,0A55,, GOTO CS_DLYOK
0000004E,05B0,, BSF FLAG,F_CS
0000004F,0425,, BCF 5,GD_OUT
00000050,0545,, BSF 5,YS_OUT
00000051,0550,, BSF FLAG,F_YS7S
00000052,0071,, CLRF COUNT
00000053,0072,, CLRF COUNT7S
00000054,0A26,, GOTO MAIN ;开始定时,回到MAIN
00000055,0C07,CS_DLYOK,CS_DLYOK MOVLW 07H ;已在定时中,判断定时到否
00000056,0035,, MOVWF COMP_REG
00000057,0212,, MOVF COUNT7S,0
00000058,0095,, SUBWF COMP_REG,0
00000059,0623,, BTFSC STATUS,1
0000005A,0A5E,, GOTO BK0
0000005B,0072,, CLRF COUNT7S ;定时大于7S,则清延时标志,置低AC—OUT
0000005C,0450,, BCF FLAG,F_YS7S
0000005D,0445,, BCF 5,YS_OUT
0000005E,0A26,BK0,BK0 GOTO MAIN
,,,;**************循环键判断*****************************
0000005F,04B0,CYC_DETECT,CYC_DETECT BCF FLAG,F_CS
00000060,09B2,, CALL KEY_CYC
00000061,070F,, BTFSS FLAGA,F_KEYCYC_EN
00000062,0A71,, GOTO DISCYCKEY
00000063,06D0,, BTFSC FLAG,KEY_CYC_ENABLE ;FALG.6
00000064,0A6B,, GOTO CYCEN
00000065,0425,, BCF 5,GD_OUT ;新风态
00000066,0545,, BSF 5,YS_OUT
00000067,0550,, BSF FLAG,F_YS7S
00000068,0071,, CLRF COUNT
00000069,0072,, CLRF COUNT7S
0000006A,0A26,, GOTO MAIN
0000006B,0525,CYCEN,CYCEN BSF 5,GD_OUT ;循环风
0000006C,0545,, BSF 5,YS_OUT
0000006D,0550,, BSF FLAG,F_YS7S
0000006E,0071,, CLRF COUNT
0000006F,0072,, CLRF COUNT7S
00000070,0A26,, GOTO MAIN
00000071,0750,DISCYCKEY,DISCYCKEY BTFSS FLAG,F_YS7S
00000072,0A7C,, GOTO E1
00000073,0C07,, MOVLW 07H ;处于延时中,判断延时到否
00000074,0035,, MOVWF COMP_REG
00000075,0212,, MOVF COUNT7S,0
00000076,0095,, SUBWF COMP_REG,0
00000077,0623,, BTFSC STATUS,1
00000078,0A7C,, GOTO E1
00000079,0450,, BCF FLAG,F_YS7S
0000007A,0072,, CLRF COUNT7S
0000007B,0445,, BCF 5,YS_OUT
0000007C,0A26,E1,E1 GOTO MAIN
,,,
,,,
,,,;************************************************************************
,,,;TIMER0定时子程,总定时1秒,COUNT7S加一;
,,,;prescale = 16 ; initial value = (256-250);
,,,;************************************************************************
0000007D,0C05,TIMOVER,TIMOVER MOVLW 05H
0000007E,0035,, MOVWF COMP_REG
0000007F,0201,, MOVF TMR0,0
00000080,0095,, SUBWF COMP_REG,0
00000081,0723,, BTFSS STATUS,1 ;C=1,计数值比6小,即已计满重新开始
00000082,0A98,, GOTO W1 ;C=0,计数值比6大,即正常计数,返回,
00000083,0C06,, MOVLW 06H ;计到256后溢出处理,置初值,重置分频设置
00000084,0021,, MOVWF TMR0
00000085,0C03,, MOVLW 03H ;PRESCALE = 16, TIMER = 16US * N(=250) =4000US =
,,,4MS
00000086,0002,, OPTION ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
00000087,02B1,, INCF COUNT,1
00000088,0710,, BTFSS FLAG,F_KEY_AC
00000089,0A8B,, GOTO NX2
0000008A,02B3,, INCF ACCOUNT,1
0000008B,0730,NX2,NX2 BTFSS FLAG,F_KEY_CYC
0000008C,0A8E,, GOTO NX3
0000008D,02B4,, INCF CSCOUNT,1
0000008E,0CFA,NX3,NX3 MOVLW 0FAH
0000008F,0035,, MOVWF COMP_REG
00000090,0211,, MOVF COUNT,0
00000091,0095,, SUBWF COMP_REG,0
00000092,0623,, BTFSC STATUS,1 ;C=0,计数值比250大,即1S定时到
00000093,0A98,, GOTO W1 ;C=1,计数值比250小,即1S定时未到,
00000094,0071,NX4,NX4 CLRF COUNT
00000095,0750,, BTFSS FLAG,F_YS7S
00000096,0A98,, GOTO W1
00000097,02B2,, INCF COUNT7S,1
00000098,0800,W1,W1 RETLW 0
,,,;**************************************************************************
,,,;KEY IN
,,,;BUG:当一直按键不放,直到keycount值从256变为小于3的值时释放,则被误认为按键无效
,,,;********************************************************************
00000099,0606,KEY_AC,KEY_AC BTFSC 6,AC_IN
0000009A,0AA0,, GOTO BACK0
0000009B,0610,, BTFSC FLAG,F_KEY_AC
0000009C,0AB0,, GOTO BACK ;按住键不放的过程,继续延时计时,不动作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -