📄 light control.asm
字号:
CALL IFSTORE
CALL GETADKEY
MOVLW 0X30
XORWF KEYRES,W
BTFSC STATUS,Z
GOTO TESTKEY1_7
TESTKEY2_7
DECFSZ COUNTLINE,F ;循环判断键值,以防止有干扰或是误判
GOTO TESTKEY2_7
MOVF KEYRES,W
MOVWF KEYRES_B ;将KEYRES的值转存到KEYRES_B
;以防止在监测键盘是否弹起时将其覆盖
TESTKEY3_7
CALL GETADKEY ;直到键盘弹击再进行下一步
MOVLW 0X30
XORWF KEYRES,W
BTFSS STATUS,Z
GOTO TESTKEY3_7
;***************************************
MOVLW 39H ;检测键值是否为9,是则返回MENU
BCF STATUS,Z
XORWF KEYRES_B,W
BTFSC STATUS,Z
GOTO MENU
GOTO TESTKEY1_7
;***************************************
ALLON ;所有的路灯开启子程序
BSF PORTB,0
BSF PORTB,6
BSF PORTB,7
BSF PORTC,3
BSF PORTC,4
BSF PORTC,5
MOVLW 0FFH
MOVWF PORTD
BSF PORTE,1
BSF PORTE,2
MOVLW 01H
MOVWF STATE
RETURN
;***************************************
ALLOFF ;所有路灯关闭
BCF PORTB,0
BCF PORTB,6
BCF PORTB,7
BCF PORTC,3
BCF PORTC,4
BCF PORTC,5
MOVLW 00H
MOVWF PORTD
BSF PORTE,1
BSF PORTE,2
MOVLW 00H
MOVWF STATE
RETURN
;***************************************
;初始化程序
;***************************************
INITIO
;****************************************
;设置I/O口的输入输出方向
BSF STATUS,RP0
MOVLW 3FH ;即00111111,RA5为LCD读写使能控制(出)
MOVWF TRISA ;RA2为光敏电阻输入,RA0为键盘输入,其余接路灯输出
;RA1为测220V电压的模拟输入,RA4为测交流电流的模拟通道
MOVLW 00H ;RB5-RB2为与LCD的数据线,RB1为数据指令控制线
MOVWF TRISB ;都应为输出
MOVLW 83H ;即10000011,RC7为串行输入,RC6为串行输出,
MOVWF TRISC ;RC1,RC0为TMR1的自带震荡输入,RC2为背光控制
MOVLW 00H ;PORTD,PORE都用来控制路灯
MOVWF TRISD
MOVLW 01H
MOVWF TRISE
BCF STATUS,RP0
RETURN
;***************************************
;设置定时器TMR1
INITMR1
clrf TMR1L
movlw 0x80
movwf TMR1H
movlw 0x0F ;即00001111,分频比0:0,外部时钟源,不同步
movwf T1CON
BSF STATUS,RP0
BSF PIE1,TMR1IE
BCF STATUS,RP0
RETURN
;***************************************
;初始化TMR2,将其设定在延时可调的周期性定时器
;完成每1ms产生一次中断,以对电压或电流电路的采样
INITMR2
BSF STATUS,RP0
BSF PIE1,TMR2IE
MOVLW 64H
MOVWF PR2 ;PR2的值设为100
BCF STATUS,RP0
MOVLW 28H ;即00101000,后分频比为1:10,预分频比为1:1并启动
MOVWF T2CON
RETURN
;***************************************
;设置参数初始值
INITVALUE
MOVLW 00H ;设置时钟的初始值为00:00:00
MOVWF SECOND
MOVWF MINUTE
MOVWF HOUR
MOVLW 00H
CALL READEEPROM
BSF STATUS,RP0
BSF STATUS,RP1
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
BCF STATUS,IRP
MOVWF MODE
MOVLW 01H ;设置定时开关时间的初始值,首先从
CALL READEEPROM ;存储器中读取,然后检测是不是都是0FF
BSF STATUS,RP0 ;如果都是0FF则表示是程序第一次运行,
BSF STATUS,RP1 ;则设开初始值为6点,关初始值为18点
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF HOUR1
MOVLW 02H
CALL READEEPROM
BSF STATUS,RP0
BSF STATUS,RP1
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF MINUTE1
MOVLW 03H
CALL READEEPROM
BSF STATUS,RP0
BSF STATUS,RP1
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF HOUR2
MOVLW 04H
CALL READEEPROM
BSF STATUS,RP0
BSF STATUS,RP1
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
BCF STATUS,RP1
MOVWF MINUTE2
MOVLW 0FFH
BCF STATUS,Z
XORWF HOUR1,W
BTFSS STATUS,Z
GOTO REMIAN
MOVLW 0FFH
BCF STATUS,Z
XORWF MINUTE1,W
BTFSS STATUS,Z
GOTO REMIAN
MOVLW 0FFH
BCF STATUS,Z
XORWF HOUR2,W
BTFSS STATUS,Z
GOTO REMIAN
MOVLW 0FFH
BCF STATUS,Z
XORWF MINUTE2,W
BTFSS STATUS,Z
GOTO REMIAN
MOVLW 01H
MOVWF MODE ;默认模式为光控模式
MOVLW 06H ;说明是第一运行,因为都是0
MOVWF HOUR1
CLRF MINUTE1
MOVLW 12H
MOVWF HOUR2
CLRF MINUTE2
CLRF IFCOUNT
CLRF ADVCOUNT
CLRF ADICOUNT
CLRF WHICHV
MOVLW 0AH
MOVWF DELAYAD
MOVLW 01H
MOVWF VORI
MOVLW 25H
MOVWF ADSTORE ;设置光敏电阻A/D转换的限值
MOVLW 0AH
MOVWF ADCOUNT
MOVLW 55H
MOVWF FSR ;初始化FSR,使接收从55开始
CLRF IFTIMEDIS
CLRF IFMINC
CLRF ADCTMER
CLRF BACKLIGHT
MOVLW 01H
MOVWF IFCHANGE
REMIAN
RETURN
;**************************************
; 以下是关于读写EEPROM数据存储器的子程序。
;存储单元安排如下00H:模式参数MODE的值01H:HOUR1
;02H:MINUTE1 03H:HOUR2 04H:MINUTE2
;**************************************
;**************************************
;读EEPROM数据存储器的子程序
;**************************************
;入口参数:W,用于存放欲访问的存储单元的地址
;出口参数:WREG,用于存放读取到的数据值
READEEPROM
BSF STATUS,RP1
BCF STATUS,RP0
MOVWF EEADR
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
RETURN
;**************************************
;写EEPROM数据存储器的子程序
;**************************************
;入口参数:ADDR:存放存储单元的地址
; VALUE:欲写入的值
;出口参数:无
WRITEEEPROM
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON1,WR
GOTO $-1
BCF STATUS,RP1
BCF STATUS,RP0
MOVF ADDR,W
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP1
BCF STATUS,RP0
MOVF VALUE,W
BSF STATUS,RP1
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
RETURN
STORE1
MOVLW 02H
MOVWF ADDR
MOVF HOUR1,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 03H
MOVWF ADDR
MOVF MINUTE1,W
MOVWF VALUE
CALL WRITEEEPROM
RETURN
STORE2
MOVLW 04H
MOVWF ADDR
MOVF HOUR2,W
MOVWF VALUE
CALL WRITEEEPROM
MOVLW 05H
MOVWF ADDR
MOVF MINUTE2,W
MOVWF VALUE
CALL WRITEEEPROM
RETURN
;**********************************
;判断计算机是否通过串行口对模式和定时时间进行了调整
;如果是,则在EEPROM中存储新值
;**********************************
IFSTORE
CLRW
XORWF ADCTMER,W
BTFSC STATUS,Z
GOTO OVERIFSTORE
MOVLW 01H
XORWF ADCTMER,W
BTFSC STATUS,Z
GOTO MSTORE
MOVLW 02H
XORWF ADCTMER,W
BTFSC STATUS,Z
GOTO WCSTORE
MOVLW 03H
XORWF STATUS,Z
GOTO TMRONSTORE
MOVLW 04H
XORWF ADCTMER,W
BTFSC STATUS,Z
GOTO TMROFFSTORE
GOTO OVERIFSTORE
MSTORE
MOVLW 01H
MOVWF ADDR
MOVF MODE,W
MOVWF VALUE
CALL WRITEEEPROM
GOTO OVERIFSTORE
WCSTORE
MOVLW 06H
MOVWF ADDR
CLRF VALUE
CALL WRITEEEPROM
INCF ADDR,F
CALL WRITEEEPROM
GOTO OVERIFSTORE
TMRONSTORE
MOVLW 02H
MOVWF ADDR
MOVF HOUR1,W
MOVWF VALUE
CALL WRITEEEPROM
INCF ADDR,F
MOVF MINUTE1,W
MOVWF VALUE
CALL WRITEEEPROM
GOTO OVERIFSTORE
TMROFFSTORE
MOVLW 04H
MOVWF ADDR
MOVF HOUR2,W
MOVWF VALUE
CALL WRITEEEPROM
INCF ADDR,F
MOVF MINUTE2,W
MOVWF VALUE
CALL WRITEEEPROM
GOTO OVERIFSTORE
OVERIFSTORE
CLRF ADCTMER
RETURN
;*************************************
;LCD显示子程序
;*************************************
;LCD的MENU显示子程序
;显示如下MENU 1-MC 2-TD ?
; 3TA 4TRA 5H 6W ?
;*************************************
INITIALLCD
CALL CLRLCD
MOVLW 80H
CALL SENDCMD
MOVLW 'M'
CALL PUTCLCD
MOVLW 'E'
CALL PUTCLCD
MOVLW 'N'
CALL PUTCLCD
MOVLW 'U'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '1'
CALL PUTCLCD
MOVLW '-'
CALL PUTCLCD
MOVLW 'M'
CALL PUTCLCD
MOVLW 'C'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '2'
CALL PUTCLCD
MOVLW '-'
CALL PUTCLCD
MOVLW 'T'
CALL PUTCLCD
MOVLW 'D'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW 30H
ADDWF MODE,W
CALL PUTCLCD
MOVLW 0X0C0
CALL SENDCMD
MOVLW '3'
CALL PUTCLCD
MOVLW 'T'
CALL PUTCLCD
MOVLW 'A'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '4'
CALL PUTCLCD
MOVLW 'T'
CALL PUTCLCD
MOVLW 'R'
CALL PUTCLCD
MOVLW 'A'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '5'
CALL PUTCLCD
MOVLW 'H'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW '6'
CALL PUTCLCD
MOVLW 'W'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW 30H
ADDWF STATE,W
CALL PUTCLCD
RETURN
;*********************************
;1-MC,模式选择显示子程序
;显示如下:MODE CHOOSE ?
; 1-LC 2-TC 3-HC ?
MODECHOOSELCD
CALL CLRLCD
MOVLW 0X080
CALL SENDCMD
MOVLW 'M'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
MOVLW 'D'
CALL PUTCLCD
MOVLW 'E'
CALL PUTCLCD
MOVLW ' '
CALL PUTCLCD
MOVLW 'C'
CALL PUTCLCD
MOVLW 'H'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
MOVLW 'O'
CALL PUTCLCD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -