📄 controllogic.asm
字号:
call ShowTime ; Update the displayed time
banksel CTRL
bcf CTRL,CTRL_SECS
call WaitForChange
banksel SCRATCH
movwf SCRATCH
btfsc SCRATCH,SW_R
goto TweakTime
btfsc SCRATCH,SW_H
goto TweakHour
btfsc SCRATCH,SW_M
goto TweakMinute
goto TimeAdjust
TweakHour:
banksel HOURS
incf HOURS,W ; Bump the hour by one
andlw h'3f' ; Mask out all but the hours and PM
addlw .6 ; Add one and check for >9 digit
skpdc
addlw -.6 ; Its not, so take back 6
movwf HOURS
andlw h'1f' ; Mask out all but hours
addlw -h'13' ; Is the value >12?
skpc
goto Set12HourBit
movf HOURS,W
addlw .14
movwf HOURS
Set12HourBit:
bsf HOURS,6 ; Force AM/PM mode
bsf CHANGED,7 ; Set the changed flag
call WaitForRelease
goto TimeAdjust ; Go and wait for another switch press
TweakMinute:
banksel MINUTES
incf MINUTES,W ; Bump the minutes by one
addlw .6 ; See if the lo nybble is >9
skpdc
addlw -.6 ; Its not, so take the 6 back
movwf MINUTES
addlw -h'60' ; Is the value >59?
skpnc
clrf MINUTES ; Yes, set it back to 0
bsf CHANGED,7 ; Set the changed flag
call WaitForRelease
goto TimeAdjust ; Go and wait for another switch press
TweakTime:
banksel CHANGED ; Was the time changed?
btfss CHANGED,7
goto AdjustDate
banksel I2C_REGISTER ; Set I2C registers to update SECONDS,
movlw RTC_SECONDS ; .. MINUTES and HOURS
movwf I2C_REGISTER
movlw .3
movwf I2C_REGCOUNT
bankisel SECONDS ; Point the FSR at the SECONDS
movlw SECONDS
movwf FSR
lcall DS1307Tx ; And write them back
;------------------------------------------------------------------------------
AdjustDate:
call WaitForRelease
banksel CHANGED
clrf CHANGED
DateAdjust:
call ShowDate ; Show current day and date
banksel CTRL
bcf CTRL,CTRL_SECS
call WaitForChange
banksel SCRATCH
movwf SCRATCH
btfsc SCRATCH,SW_R
goto TweakDayDate
btfsc SCRATCH,SW_H
goto TweakDay
btfsc SCRATCH,SW_M
goto TweakDate
goto DateAdjust
TweakDay:
banksel DAY ; Bump the day by one
incf DAY,W
andlw h'07' ; Mask back to a valid day
skpnz
movlw .1 ; Ensure zero is skipped
movwf DAY
bsf CHANGED,7 ; Set the changed flag
call WaitForRelease
goto DateAdjust
TweakDate:
banksel DATE
movf DATE,W ; Wrap last day back to zero
addlw -h'31'
skpnc
clrf DATE
incf DATE,W ; Bump the date by one
addlw .6 ; Handle BCD carry
skpdc
addlw -.6
movwf DATE
bsf CHANGED,7
call WaitForRelease
goto DateAdjust
TweakDayDate:
banksel CHANGED ; Was the date changed?
btfss CHANGED,7
goto AdjustYear
banksel I2C_REGISTER ; Set I2C registers to update DAY
movlw RTC_DAY ; .. and DATE
movwf I2C_REGISTER
movlw .2
movwf I2C_REGCOUNT
bankisel DAY ; Point the FSR at the SECONDS
movlw DAY
movwf FSR
lcall DS1307Tx ; And write them back
;------------------------------------------------------------------------------
AdjustYear:
call WaitForRelease
banksel CHANGED
clrf CHANGED
YearAdjust:
call ShowMonth ; Show current month and year
banksel CTRL
bcf CTRL,CTRL_SECS
call WaitForChange
banksel SCRATCH
movwf SCRATCH
btfsc SCRATCH,SW_R
goto TweakYearMonth
btfsc SCRATCH,SW_H
goto TweakMonth
btfsc SCRATCH,SW_M
goto TweakYear
goto YearAdjust
TweakMonth:
banksel MONTH
movf MONTH,W
addlw -h'12'
skpnc
clrf MONTH
incf MONTH,W
addlw .6
skpdc
addlw -.6
movwf MONTH
bsf CHANGED,7
call WaitForRelease
goto YearAdjust
TweakYear:
banksel YEAR
incf YEAR,W
addlw .6
skpdc
addlw -.6
addlw h'60'
skpc
addlw -h'60'
movwf YEAR
bsf CHANGED,7
call WaitForRelease
goto YearAdjust
TweakYearMonth:
banksel CHANGED
btfss CHANGED,7
goto AdjustAlarmDy
banksel I2C_REGISTER ; Set I2C registers to update MONTH
movlw RTC_MONTH ; .. and YEAR
movwf I2C_REGISTER
movlw .2
movwf I2C_REGCOUNT
bankisel MONTH ; Point the FSR at the MONTH
movlw MONTH
movwf FSR
lcall DS1307Tx ; And write them back
;------------------------------------------------------------------------------
AdjustAlarmDy:
call WaitForRelease
banksel CHANGED
clrf CHANGED
AlarmDyAdjust:
bankisel AL_DAY_MIN ; Point the FSR at the MINUTES
movlw AL_DAY_MIN
movwf FSR
call ShowTime ; Update the displayed time
banksel CTRL
bcf CTRL,CTRL_SECS
call WaitForChange
banksel SCRATCH
movwf SCRATCH
btfsc SCRATCH,SW_R
goto TweakAlarmDy
btfsc SCRATCH,SW_H
goto TweakHourDy
btfsc SCRATCH,SW_M
goto TweakMinDy
goto AlarmDyAdjust
TweakHourDy:
bankisel AL_DAY_HOUR
movlw AL_DAY_HOUR
movwf FSR
call TweakAlarmHour
banksel CHANGED
bsf CHANGED,7
call WaitForRelease
goto AlarmDyAdjust
TweakMinDy:
bankisel AL_DAY_MIN
movlw AL_DAY_MIN
movwf FSR
call TweakAlarmMinute
banksel CHANGED
bsf CHANGED,7
call WaitForRelease
goto AlarmDyAdjust
TweakAlarmDy:
banksel CHANGED
btfss CHANGED,7
goto AdjustAlarmSa
banksel I2C_REGISTER ; Set I2C registers to update MINUTE
movlw RTC_AL_DAY_MIN ; .. and HOUR
movwf I2C_REGISTER
movlw .2
movwf I2C_REGCOUNT
bankisel AL_DAY_MIN ; Point the FSR at the MINUTE
movlw AL_DAY_MIN
movwf FSR
lcall DS1307Tx ; And write them back
;------------------------------------------------------------------------------
AdjustAlarmSa:
call WaitForRelease
banksel CHANGED
clrf CHANGED
AlarmSaAdjust:
bankisel AL_SAT_MIN ; Point the FSR at the MINUTES
movlw AL_SAT_MIN
movwf FSR
call ShowTime ; Update the displayed time
banksel CTRL
bcf CTRL,CTRL_SECS
call WaitForChange
banksel SCRATCH
movwf SCRATCH
btfsc SCRATCH,SW_R
goto TweakAlarmSa
btfsc SCRATCH,SW_H
goto TweakHourSa
btfsc SCRATCH,SW_M
goto TweakMinSa
goto AlarmSaAdjust
TweakHourSa:
bankisel AL_SAT_HOUR
movlw AL_SAT_HOUR
movwf FSR
call TweakAlarmHour
banksel CHANGED
bsf CHANGED,7
call WaitForRelease
goto AlarmSaAdjust
TweakMinSa:
bankisel AL_SAT_MIN
movlw AL_SAT_MIN
movwf FSR
call TweakAlarmMinute
banksel CHANGED
bsf CHANGED,7
call WaitForRelease
goto AlarmSaAdjust
TweakAlarmSa:
banksel CHANGED
btfss CHANGED,7
goto AdjustAlarmSu
banksel I2C_REGISTER ; Set I2C registers to update MINUTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -