📄 light control.asm
字号:
CLRF MINUTE
GOTO DISM1
INCM2
INCF MINUTE,F
DISM1
MOVF MINUTE,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_3
;**********************************
DECMINUTE ;分钟减一并且显示
CLRF SECOND
MOVLW 00H
BCF STATUS,Z ;如果减到了0,则将小时置59
XORWF MINUTE,W
BTFSC STATUS,Z
GOTO DECM1
GOTO DECM2
DECM1
MOVLW 3BH
MOVWF MINUTE
GOTO DISM2
DECM2
DECF MINUTE,F
DISM2
MOVF MINUTE,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_3
TIMEGO
BCF T1CON,TMR1ON
CALL TIMERLCD
GOTO TESTKEY1_3
TIMEPAUSE
BSF T1CON,TMR1ON
CALL TIMERLCD
GOTO TESTKEY1_3
;******************************************
;定时时间校对
;功能说明;
;首先进入的是开启时间的校对,按9键退出开启时间校对并自动
;进入关闭时间校对。在此之前如果对时间有调整择对调整后的值
;进行保存。关闭时间校对也是一样。调整方法与时间相同
;***************************************
TIMERADJUST
;***************************************
;先是开启时间调整
CALL TIMEONLCD
;***************************************
;检测键值
;***************************************
TESTKEY1_4
CALL WCALCULATE
CALL IFSTORE
CALL GETADKEY
MOVLW 0X30
XORWF KEYRES,W
BTFSC STATUS,Z
GOTO TESTKEY1_4
TESTKEY2_4
DECFSZ COUNTLINE,F ;循环判断键值,以防止有干扰或是误判
GOTO TESTKEY2_4
MOVF KEYRES,W
MOVWF KEYRES_B ;将KEYRES的值转存到KEYRES_B
;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_4
CALL GETADKEY ;直到键盘弹击再进行下一步
MOVLW 0X30
XORWF KEYRES,W
BTFSS STATUS,Z
GOTO TESTKEY3_4
;***************************************
MOVLW 31H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO INCHOUR1
MOVLW 32H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO DECHOUR1
MOVLW 33H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO INCMINUTE1
MOVLW 34H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO DECMINUTE1
MOVLW 39H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSS STATUS,Z
GOTO TESTKEY1_4
GOTO TIMEROFF
;***************************************
INCHOUR1 ;小时加一并且显示
CLRF IFCHANGE
MOVLW 17H
BCF STATUS,Z ;如果加到了23,则将小时置0
XORWF HOUR1,W
BTFSC STATUS,Z
GOTO AINCH1
GOTO AINCH2
AINCH1
CLRF HOUR1
GOTO ADISH1
AINCH2
INCF HOUR1,F
ADISH1
MOVF HOUR1,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C0
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_4
;**********************************
DECHOUR1 ;小时减一并且显示
CLRF IFCHANGE
MOVLW 00H
BCF STATUS,Z ;如果减到了0,则将小时置23
XORWF HOUR1,W
BTFSC STATUS,Z
GOTO ADECH1
GOTO ADECH2
ADECH1
MOVLW 17H
MOVWF HOUR1
GOTO ADISH2
ADECH2
DECF HOUR1,F
ADISH2
MOVF HOUR1,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C0
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_4
;*************************************
INCMINUTE1 ;分钟加一并且显示
CLRF IFCHANGE
MOVLW 3BH
BCF STATUS,Z ;如果加到了59,则将小时置0
XORWF MINUTE1,W
BTFSC STATUS,Z
GOTO AINCM1
GOTO AINCM2
AINCM1
CLRF MINUTE1
GOTO ADISM1
AINCM2
INCF MINUTE1,F
ADISM1
MOVF MINUTE1,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_4
;************************************
DECMINUTE1 ;分钟减一并且显示
CLRF IFCHANGE
MOVLW 00H
BCF STATUS,Z ;如果减到了0,则将小时置59
XORWF MINUTE1,W
BTFSC STATUS,Z
GOTO ADECM1
GOTO ADECM2
ADECM1
MOVLW 3BH
MOVWF MINUTE1
GOTO ADISM2
ADECM2
DECF MINUTE1,F
ADISM2
MOVF MINUTE1,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_4
;*************************************
;关闭时间调整
TIMEROFF
CALL TIMEOFFLCD
;***************************************
;检测键值
;***************************************
MOVLW 00H ;测试是否对开启时间进行了调整
BCF STATUS,Z ;是则保存新的时间,保存到EEPROM
XORWF IFCHANGE,W ;否则进行关闭时间的校时
BTFSS STATUS,Z
GOTO TESTKEY1_5
MOVLW 02H
MOVWF ADDR
MOVF HOUR1,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 03H
MOVWF ADDR
MOVF MINUTE1,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 01H
MOVWF IFCHANGE
TESTKEY1_5
CALL WCALCULATE
CALL IFSTORE
CALL GETADKEY
MOVLW 0X30
XORWF KEYRES,W
BTFSC STATUS,Z
GOTO TESTKEY1_5
TESTKEY2_5
DECFSZ COUNTLINE,F ;循环判断键值,以防止有干扰或是误判
GOTO TESTKEY2_5
MOVF KEYRES,W
MOVWF KEYRES_B ;将KEYRES的值转存到KEYRES_B
;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_5
CALL GETADKEY ;直到键盘弹击再进行下一步
MOVLW 0X30
XORWF KEYRES,W
BTFSS STATUS,Z
GOTO TESTKEY3_5
;***************************************
MOVLW 31H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO INCHOUR2
MOVLW 32H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO DECHOUR2
MOVLW 33H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO INCMINUTE2
MOVLW 34H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO DECMINUTE2
MOVLW 39H
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSS STATUS,Z
GOTO TESTKEY1_5
GOTO STOREOFF
;***************************************
INCHOUR2 ;小时加一并且显示
CLRF IFCHANGE
MOVLW 17H
BCF STATUS,Z ;如果加到了23,则将小时置0
XORWF HOUR2,W
BTFSC STATUS,Z
GOTO AINCH3
GOTO AINCH4
AINCH3
CLRF HOUR2
GOTO ADISH3
AINCH4
INCF HOUR2,F
ADISH3
MOVF HOUR2,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C0
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_5
;*********************************
DECHOUR2 ;小时减一并且显示
CLRF IFCHANGE
MOVLW 00H
BCF STATUS,Z ;如果减到了0,则将小时置23
XORWF HOUR2,W
BTFSC STATUS,Z
GOTO ADECH3
GOTO ADECH4
ADECH3
MOVLW 17H
MOVWF HOUR2
GOTO DISH4
ADECH4
DECF HOUR2,F
DISH4
MOVF HOUR2,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C0
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_5
;*********************************
INCMINUTE2 ;分钟加一并且显示
CLRF IFCHANGE
MOVLW 3BH
BCF STATUS,Z ;如果加到了59,则将小时置0
XORWF MINUTE2,W
BTFSC STATUS,Z
GOTO AINCM3
GOTO AINCM4
AINCM3
CLRF MINUTE2
GOTO ADISM3
AINCM4
INCF MINUTE2,F
ADISM3
MOVF MINUTE2,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_5
;*********************************
DECMINUTE2 ;分钟减一并且显示
CLRF IFCHANGE
MOVLW 00H
BCF STATUS,Z ;如果减到了0,则将小时置59
XORWF MINUTE2,W
BTFSC STATUS,Z
GOTO ADECM3
GOTO ADECM4
ADECM3
MOVLW 3BH
MOVWF MINUTE2
GOTO ADISM4
ADECM4
DECF MINUTE2,F
ADISM4
MOVF MINUTE2,W
MOVWF M_INPUT
CALL BIN2BCDT
MOVLW 0X0C3
CALL SENDCMD
MOVF OUTPUT1,W
CALL PUTCLCD
MOVF OUTPUT2,W
CALL PUTCLCD
GOTO TESTKEY1_5
STOREOFF
MOVLW 00H ;测试是否对开启时间进行了调整
BCF STATUS,Z ;是则保存新的时间,保存到EEPROM
XORWF IFCHANGE,W ;否则进行关闭时间的校时
BTFSS STATUS,Z
GOTO MENU
MOVLW 04H
MOVWF ADDR
MOVF HOUR2,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 05H
MOVWF ADDR
MOVF MINUTE2,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 01H
MOVWF IFCHANGE
GOTO MENU
;***************************************
;手动开关模块,进入时,首先检测当前模式是否为手动模式
;是则可以进入手控界面,且1-开2-关9-返回
;否则显示MODE ERROR!PLEASE CHOOSE M3,并按9返回
;***************************************
HANDONOFF
MOVLW 03H
XORWF MODE,W
BTFSS STATUS,Z
GOTO MODEERROR
CALL HANDONOFFLCD
;***************************************
;检测键值
;***************************************
TESTKEY1_6
CALL WCALCULATE
CALL IFSTORE
CALL GETADKEY
MOVLW 0X30
XORWF KEYRES,W
BTFSC STATUS,Z
GOTO TESTKEY1_6
TESTKEY2_6
DECFSZ COUNTLINE,F ;循环判断键值,以防止有干扰或是误判
GOTO TESTKEY2_6
MOVF KEYRES,W
MOVWF KEYRES_B ;将KEYRES的值转存到KEYRES_B
;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_6
CALL GETADKEY ;直到键盘弹击再进行下一步
MOVLW 0X30
XORWF KEYRES,W
BTFSS STATUS,Z
GOTO TESTKEY3_6
;***************************************
MOVLW 31H ;检测键值是否为1,是则开启路灯
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO LALLON
MOVLW 32H ;检测键值是否为2,是则关闭路灯
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO LALLOFF
MOVLW 39H ;检测键值是否为9,是则返回MENU
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO MENU
GOTO TESTKEY1_6
LALLON
CALL ALLON
GOTO TESTKEY1_6
LALLOFF
CALL ALLOFF
GOTO TESTKEY1_6
MODEERROR
CALL MODEERRORLCD
;***************************************
;检测键值
;***************************************
TESTKEY1_7
CALL WCALCULATE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -