; *********************
; * При каждом вызове обработчика прерывания внутренний *
; * счетчик увеличивается на 20-мс дискрет *
; * Каждую секунду в NEW_SEC заносится ненулевое значение *
; *********************
; Сначала сохраним контекст
ISR movwf _work;
Сохраняем Wswapf STATUS,w
; и регистр STATUSmovwf _status
; ================
; Основной код
btfss INTCON,T0IF
; Произошло переполнение Таймера 0?goto ISR_EXIT
; ЕСЛИ нет, ТО ложная тревогаbtfsc Pause,0
; Проверяем флаг паузыgoto ISR_EXIT
; ЕСЛИ нажата, не инкрементируемincf JIFFY,f
; Регистрируем очередные 1/50 сmovlw d’50’
; Досчитали до 50?subwf JIFFY,w
btfss STATUS,Z
goto ISR_EXIT
; ЕСЛИ нет, ТО выходимclrf JIFFY
; ИНАЧЕ обнуляем счетчик дискретовmovf SECOND,f
; Счетчик секунд равен нулю?btfsc STATUS,Z
goto NEW_MIN
; ЕСЛИ да, ТО смотрим минутыdecf SECOND,f
; ИНАЧЕ декрементируем счетчик секунд,incf NEW_SEC,f
; извещаем основную программу о прохождении секундыgoto ISR_EXIT
; и выходимNEW_MIN movlw d’59’
;Реинициализируем счетчик секундmovwf SECOND
movf MINUTE,f
; Счетчик минут равен нулю?btfsc STATUS,Z
goto ISR_EXIT
; ЕСЛИ да, ТО делать больше нечегоdecf MINUTE,f
; ИНАЧЕ декрементируем счетчик минут; *************************
ISR_EXIT btfss PORTB,PAUSE
; Проверяем кнопку ПАУЗАcall FREEZE
; ЕСЛИ нажата, ТО обновляем флаг паузыbcf INTCON,T0IF
; Сбрасываем флаг прерыванияswapf _status,w
; Восстанавливаем регистр STATUSmovwf STATUS
swapf _work,f
; Восстанавливаем W,swapf _work,w
; не меняя состояния STATUS,retfie
; и возвращаемся из прерывания; ***********************
; * ФУНКЦИЯ: Инкрементирует флаг паузы. *
; * ЕСЛИ 1, ТО отображает десятичные точки *
; * ЕСЛИ 0, ТО отображает нормальный отсчет минут *
; * РЕСУРСЫ П/п SPI_WRITE, переменная Pause *
; * ВХОД;Кнопка ПАУЗА нажата *
; * ВЫХОД Кнопка ПАУЗА отжата; соответствующая индикация *
*************************
FREEZE incf Pause,f
; Обновляем 0-й бит флага паузыbtfss Pause,0
; Проверяем его состояниеgoto UNFREEZE
; Переход 1 —> 0, разблокируем; Дисплей заблокирован
movlw b’01111111’
;Код для десятичной точкиmovwf DATA_OUT_L
movwf DATA_OUT_H
call SPI_WRITE
goto FREEZE EXIT
UNFREEZE
; Сюда переходим, если 0-й бит флага изменился 1 —> 0.movf MINUTE,w
; Отображаем оставшееся количество минутcall OUTPUT
FREEZE_EXIT
btfss PORTB,PAUSE
; Ждем отпускания кнопкиgoto FREEZE_EXIT
; Сбрасываем таймер/предделительclrf TMR0
return