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

📄 controllogic.asm

📁 Alarm clock with PIC microcontroller
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                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 + -