movlw b’11000000’; Включаем зеленый СИД
movwf PORTB
bsf PORTA,BUZ; Выключаем звук
; Считываем начальное значение из EEPROM
clrf EEADR; Адрес в EEPROM — 00
call EE_GET; Считываем начальное значение
movwf MINUTE
movlw d’59’; Начальное значение секунд
movwf SECOND; равно 59
clrf JIPPY
DISPLAY movf MINUTE,w; Берем значение минут
call OUTPUT; Выводим его на дисплей
; Фаза 2-минутной готовности ------------
; За две минуты до конца включаем звук на одну секунду и включаем
; желтый светодиод
TWO movf MINUTE,w; Счетчик минут =2?
addlw -2
btfss STATUS,Z
goto ONE; ЕСЛИ нет, ТО проверим след, фазу
movlw b’10100000’; Включаем желтый СИД
movwf PORTB
bcf PORTA,BUZ; Включаем пищалку
TWO_LOOP movf NEW_SEC,f; Проверяем флаг NEW_SEC
btfsc STATUS,Z; ЕСЛИ не ноль, ТО пропускаем
goto TWO_LOOP; ИНАЧЕ проверяем снова
bsf PORTA,BUZ; Выключаем пищалку через 1 секунду
goto REPEAT; Выводим интервал на дисплей
; Фаза 1-минутной готовности —
; За одну минуту до конца включаем звук на две секунды и включаем красный светодиод
ONE movf MINUTE,w; Счетчик минут = 1?
addlw -1
btfss STATUS,Z
goto ZERO; ЕСЛИ нет, ТО проверим след, фазу
movlw b’01100000’; Включаем красный СИД
movwf PORTB
bcf PORTA,BUZ; Включаем пищалку
ONE_LOOP movf NEW_SEC,f; Проверяем флаг NEW_SEC
btfsc STATUS,Z; ЕСЛИ не ноль, ТО пропускаем
goto ONE_LOOP; ИНАЧЕ проверяем снова
clrf NEW_SEC; Сбрасываем флаг NEW_SEC
UN_LOOP movf NEW_SEC,f; Проверяем флаг NEW_SEC
btfsc STATUS,Z; ЕСЛИ не ноль, ТО пропускаем
goto UN_LOOP; ИНАЧЕ проверяем снова
bsf PORTA,BUZ; Выключаем пищалку через 2 секунды
goto REPEAT; Выводим интервал на дисплей
; Фаза тайм-аута —
; Когда счетчик минут становится равным нулю, включаем пищалку
; до тех пор, пока не будет нажата кнопка СТОП
ZERO movf MINUTE,f; Счетчик минут =0?
btfss STATUS,Z
goto REPEAT; ЕСЛИ нет, ТО повторим проверку через
bcf PORTA,BUZ; Включаем пищалку
ZERO_LOOP
btfsc PORTB,STOP; Проверяем кнопку СТОП
goto ZERO_LOOP; и продолжаем, пока не будет нажата
FINI movlw b’11100000’; Выключаем индикаторы
movwf PORTB
bsf PORTA,BUZ; и пищалку
movlw b’11111111’; Код для очистки индикаторов
movwf DATA_OUT_L
movwf DATA_OUT_H
call SPI_WRITE; Очищаем оба индикатора
sleep; и ждем следующего сброса
REPEAT btfss PORTB,STOP; Проверяем кнопку СТОП
goto FINI; ЕСЛИ нажата, ТО прекращаем работу
movf SECOND,f; Ждем обнуления счетчика секунд,
btfss STATUS,Z; т. е. наступления следующей минуты
goto REPEAT; ЕСЛИ нет, ТО ждем дальше
clrf NEW_SEC; ИНАЧЕ ждем еще секунду
R_LOOP movf NEW_SEC,f; Проверяем флаг NEW_SEC
btfsc STATUS,Z; ЕСЛИ не ноль, ТО пропускаем
goto R_LOOP; ИНАЧЕ проверяем снова
goto DISPLAY; Повторяем вывод на дисплей