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

📄 light control.asm

📁 基于16F877A的路灯控制系统的设计
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;***************************************
;实现LIGHTCONTROL.ASM
;***************************************
         LIST     P=16F877A
         INCLUDE  "P16F877A.INC"
         
         EXTERN INITLCD,PUTCLCD,SENDCMD,CLRLCD
         EXTERN LONGDELAY,DELAY
         EXTERN INITADKEY,GETADKEY,KEYRES
         EXTERN InitUart,TXDATA,RCintsever,TX_END
;***************************************
;定义变量区
;***************************************
         LC_GROUP  UDATA
         
         BACKLIGHT RES  1
         W_TEMP    RES  1   ;这两个是中断中用于保护W,STATUS的变量
         S_TEMP    RES  1
         FSR_TEMP  RES  1
         DELAYAD   RES  1   ;为了保证单片机的运行效率,防止对交流电压,电流采样满20的
                            ;的间隔太近,设置次参数,保证对电流的采样比对电压的采样
                            ;晚10MS
         LIGHTAD   RES  1   ;存放光敏电阻A/D转换值
         ADCOUNT   RES  1   ;存放AD转换的次数
         ADSTORE   RES  1   ;A/D转换的限值
         COUNTLINE RES  1   ;检测键值循环得循环数
         KEYRES_B  RES  1   ;转存键值得ACSII码
         MODE      RES  1   ;存储当前的模式
         STATE     RES  1   ;存储当前路灯的状态
         ADDR      RES  1   ;存储数据到EEPROM时的地址
         VALUE     RES  1   ;存储数据到EEPROM时的数据
         HOUR      RES  1   ;以下三个分别存储当前时间的时,分,秒
         MINUTE    RES  1
         SECOND    RES  1
         HOUR1     RES  1   ;以下两个分别存储定时开时间的时,分
         MINUTE1   RES  1
         HOUR2     RES  1   ;以下两个分别存储定时关时间的时,分
         MINUTE2   RES  1
         ADCTMER   RES  1   ;上位机是否对定时时间进行了调整,
                            ;01-对定时开时间有调整
                            ;02-对定时关时间有调整
         IFCHANGE  RES  1   ;存储是否对定时开关时间进行了调整
         M_INPUT   RES  1   ;子程序BIN2BCDT的参数
         OUTPUT1   RES  1
         OUTPUT2   RES  1
         IFTIMEDIS RES  1   ;用于处理TMR1的中断,标志当前的模式是不时间显示
         IFMINC    RES  1   ;用于标志MINUTE(分钟)是否变化,是则进行定时比较 
         MULTIPLY1 RES  1
         MULTIPLY2 RES  1
         MMIDH     RES  1
         MMIDL     RES  1
         MRESULTH  RES  1
         MRESULTL  RES  1
         DIVIDEDH  RES  1
         DIVIDEDL  RES  1
         DIVIDEH   RES  1
         DIVIDEL   RES  1
         DMIDH     RES  1
         DMIDL     RES  1
         DRESULTH  RES  1
         DRESULTL  RES  1
         DCOUNT    RES  1
         DCOUNT1   RES  1
         XORCOUNTH RES  1
         XORCOUNTL RES  1
         VORI      RES  1
         ADVCOUNT  RES  1
         ADVSTOREH RES  1
         ADVSTOREL RES  1
         ADICOUNT  RES  1
         ADISTOREH RES  1         
         ADISTOREL RES  1 
         VCOUNT    RES  1
         ICOUNT    RES  1 
         IFCOUNT   RES  1
         WHICHV    RES  1
         STOREV1H  RES  1
         STOREV1L  RES  1
         STOREV2H  RES  1
         STOREV2L  RES  1
         SECONDV   RES  1
         SECONDI   RES  1
         STOREIL   RES  1
         STOREIH   RES  1
         STOREWLH  RES  1
         STOREWLL  RES  1
         STOREWM   RES  1   ;功的第一位小数
         STOREWH   RES  1   ;功的整数部分
                          
                            ;以下为通信相关的变量
         TX_TEMP1  EQU  50H ;发送缓存,定义地址为了寄存器间接寻址
         TX_TEMP2  EQU  51H
         TX_TEMP3  EQU  52H
         TX_TEMP4  EQU  53H 
         RC_TEMP   EQU  54H ;接收缓存,定义地址为了寄存器间接寻址
         RC_TEMP1  EQU  55H
         RC_TEMP2  EQU  56H
         RC_TEMP3  EQU  57H 
         RC_TEMP4  EQU  58H
         
;***************************************
        
         ORG     0X0000
         
RESET    NOP
         
         GOTO    START
         
;***************************************
;中断入口程序
;***************************************
         ORG     0X0004
         GOTO    INT_SERVE



;***************************************
;主程序
;***************************************
         PROG_LC CODE
START
         BCF    STATUS,RP1
         BCF    STATUS,RP0
         BCF    INTCON,GIE
         CALL   INITIO
         CALL   INITMR2   
         CALL   INITMR1
         CALL   INITADKEY
         CALL   INITLCD
         CALL   InitUart
         CALL   INITVALUE
         CALL   ALLOFF
         BSF    INTCON,GIE
         BSF    INTCON,PEIE
         

         MOVLW   40H           ;初始化液晶CGRAM
         CALL    SENDCMD
         MOVLW   40H
         CALL    SENDCMD
    
MENU         
         CALL   INITIALLCD     ;显示如下MENU 1-MC2-TD
                               ;        3-TA 4-TRA 5H
;***************************************
;检测键值
;***************************************
TESTKEY1  
         CALL   WCALCULATE
         CALL   IFSTORE
         CALL   GETADKEY                                                                    
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSC  STATUS,Z
         GOTO   TESTKEY1
TESTKEY2
         DECFSZ COUNTLINE,F     ;循环判断键值,以防止有干扰或是误判
         GOTO   TESTKEY2
         MOVF   KEYRES,W
         MOVWF  KEYRES_B        ;将KEYRES的值转存到KEYRES_B
                                ;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3
         CALL   GETADKEY        ;直到键盘弹击再进行下一步
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY3




;**************************************
;菜单选择
;**************************************
         MOVLW  31H             ;检测键值是否为1,是则进入模式选择页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   MODECHOOSE
         MOVLW  32H             ;检测键值是否为2,是则进入时间显示页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   TIMEDISPLAYMAIN
         MOVLW  33H             ;检测键值是否为3,是则进入时间校对页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   TIMEADJUST
         MOVLW  34H             ;检测键值是否为4,是则进入定时校对页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   TIMERADJUST
         MOVLW  35H             ;检测键值是否为5,是则进入手动开关页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   HANDONOFF 
         GOTO   TESTKEY1
;**************************************
;模式选择模块,一共有三种模式,分别为1-光控模式
;2-定时模式,3-手动开关模式
;**************************************
MODECHOOSE
         CALL   MODECHOOSELCD   ;显示提示信息
;***************************************
;检测键值
;***************************************
TESTKEY1_1
         CALL   WCALCULATE
         CALL   IFSTORE  
         CALL   GETADKEY
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSC  STATUS,Z
         GOTO   TESTKEY1_1
TESTKEY2_1
         DECFSZ COUNTLINE,F     ;循环判断键值,以防止有干扰或是误判
         GOTO   TESTKEY2_1
         MOVF   KEYRES,W
         MOVWF  KEYRES_B        ;将KEYRES的值转存到KEYRES_B
                                ;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_1
         CALL   GETADKEY        ;直到键盘弹击再进行下一步
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY3_1
;***************************************
;开始模式选择
;***************************************
         MOVLW  31H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   MODE1
         MOVLW  32H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   MODE2
         MOVLW  33H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   MODE3
         MOVLW  39H              ;按9键,则返回到MENU页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY1_1
         GOTO   MENU
;***************************************
;模式一选择
;***************************************
MODE1
         MOVLW  01H
         MOVWF  MODE
         MOVWF  ADCTMER
         GOTO   STOREMODE
MODE2  
         MOVLW  02H
         MOVWF  MODE
         MOVLW  01H
         MOVWF  ADCTMER
         GOTO   STOREMODE
MODE3
         MOVLW  03H
         MOVWF  MODE
         MOVLW  01H
         MOVWF  ADCTMER
         GOTO   STOREMODE
STOREMODE
         MOVLW  8FH              ;首先显示
         CALL   SENDCMD
         MOVLW  30H
         ADDWF  MODE,W
         CALL   PUTCLCD
         GOTO   TESTKEY1_1



;***************************************
;时间显示模块
;***************************************
TIMEDISPLAYMAIN
         MOVLW  01H
         MOVWF  IFTIMEDIS
TIMEDISPLAY
         CALL   TIMEDISPLAYLCD
TDIFSTORE
         MOVLW  01H
         XORWF  ADCTMER,W
         BTFSC  STATUS,Z
         CALL   STORE1
         MOVLW  02H
         XORWF  ADCTMER,W
         BTFSC  STATUS,Z
         CALL   STORE2
         CLRF   ADCTMER
;***************************************
;检测键值
;***************************************
TESTKEY1_2  
         CALL   WCALCULATE
         CALL   IFCOUNT
         CALL   GETADKEY
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSC  STATUS,Z
         GOTO   TESTKEY1_2
TESTKEY2_2
         DECFSZ COUNTLINE,F     ;循环判断键值,以防止有干扰或是误判
         GOTO   TESTKEY2_2
         MOVF   KEYRES,W
         MOVWF  KEYRES_B        ;将KEYRES的值转存到KEYRES_B
                                ;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_2
         CALL   GETADKEY        ;直到键盘弹起再进行下一步
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY3_2
;***************************************
         CLRF   BACKLIGHT
         MOVLW  01H
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   CLRWDIS
         MOVLW  39H              ;按9键,则返回到MENU页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSS  STATUS,Z
         GOTO   TDIFSTORE
         CLRF   IFTIMEDIS
         GOTO   MENU
CLRWDIS
         CLRF   STOREWH
         CLRF   STOREWM
         MOVLW  02H
         MOVWF  ADCTMER
         GOTO   TIMEDISPLAY




;***************************************
;时间校对模块
;模块功能说明:
;1键的功能是将小时加一,2键的功能是将小时减一
;3键的功能是分钟加一,4键的功能是将分钟减一
;5键的功能是暂停,6是继续,9键返回到MENU,屏幕显示当前时间
;***************************************
TIMEADJUST
         CALL TIMEADJUSTLCD
         CALL TIMERLCD
;***************************************
;检测键值
;***************************************
TESTKEY1_3
         CALL   WCALCULATE
         CALL   IFSTORE  
         CALL   GETADKEY
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSC  STATUS,Z
         GOTO   TESTKEY1_3
TESTKEY2_3
         DECFSZ COUNTLINE,F     ;循环判断键值,以防止有干扰或是误判
         GOTO   TESTKEY2_3
         MOVF   KEYRES,W
         MOVWF  KEYRES_B        ;将KEYRES的值转存到KEYRES_B
                                ;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_3
         CALL   GETADKEY        ;直到键盘弹击再进行下一步
         MOVLW  0X30
         XORWF  KEYRES,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY3_3
;***************************************
         MOVLW  31H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   INCHOUR
         MOVLW  32H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   DECHOUR
         MOVLW  33H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   INCMINUTE
         MOVLW  34H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   DECMINUTE
         MOVLW  35H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   TIMEGO
         MOVLW  36H
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSC  STATUS,Z
         GOTO   TIMEPAUSE
         MOVLW  39H              ;按9键,则返回到MENU页面
         BCF    STATUS,Z
         XORWF  KEYRES_B,W
         BTFSS  STATUS,Z
         GOTO   TESTKEY1_3
         GOTO   MENU
;***************************************
INCHOUR                          ;小时加一并且显示
         CLRF   SECOND           ;每次清秒,为了准确定时
         MOVLW  17H             
         BCF    STATUS,Z         ;如果加到了23,则将小时置0
         XORWF  HOUR,W
         BTFSC  STATUS,Z
         GOTO   INCH1
         GOTO   INCH2
INCH1
         CLRF   HOUR
         GOTO   DISH1
INCH2
         INCF   HOUR,F
DISH1
         MOVF   HOUR,W
         MOVWF  M_INPUT
         CALL   BIN2BCDT
         MOVLW  0X0C0
         CALL   SENDCMD
         MOVF   OUTPUT1,W
         CALL   PUTCLCD
         MOVF   OUTPUT2,W
         CALL   PUTCLCD
         GOTO   TESTKEY1_3
;**********************************
DECHOUR                          ;小时减一并且显示
         CLRF   SECOND
         MOVLW  00H             
         BCF    STATUS,Z         ;如果减到了0,则将小时置23
         XORWF  HOUR,W
         BTFSC  STATUS,Z
         GOTO   DECH1
         GOTO   DECH2
DECH1
         MOVLW  17H
         MOVWF  HOUR
         GOTO   DISH2
DECH2
         DECF   HOUR,F
DISH2
         MOVF   HOUR,W
         MOVWF  M_INPUT
         CALL   BIN2BCDT
         MOVLW  0X0C0
         CALL   SENDCMD
         MOVF   OUTPUT1,W
         CALL   PUTCLCD
         MOVF   OUTPUT2,W
         CALL   PUTCLCD
         GOTO   TESTKEY1_3
;*********************************
INCMINUTE                        ;分钟加一并且显示
         CLRF   SECOND
         MOVLW  3BH             
         BCF    STATUS,Z         ;如果加到了59,则将小时置0
         XORWF  MINUTE,W
         BTFSC  STATUS,Z
         GOTO   INCM1
         GOTO   INCM2
INCM1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -