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

📄 light control.asm

📁 基于16F877A的路灯控制系统的设计
💻 ASM
📖 第 1 页 / 共 5 页
字号:
         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 + -