📄 light control.asm
字号:
;***************************************
;实现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 + -