movlw b’11000000’
; Включаем зеленый СИДmovwf PORTB
bsf PORTA,BUZ
; Выключаем звук; Считываем начальное значение из EEPROM
clrf EEADR
; Адрес в EEPROM — 00call EE_GET
; Считываем начальное значениеmovwf MINUTE
movlw d’59’
; Начальное значение секундmovwf SECOND
; равно 59clrf 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_SECbtfsc 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_SECbtfsc STATUS,Z
; ЕСЛИ не ноль, ТО пропускаемgoto ONE_LOOP
; ИНАЧЕ проверяем сноваclrf NEW_SEC
; Сбрасываем флаг NEW_SECUN_LOOP movf NEW_SEC,f
; Проверяем флаг NEW_SECbtfsc 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_SECbtfsc STATUS,Z;
ЕСЛИ не ноль, ТО пропускаемgoto R_LOOP;
ИНАЧЕ проверяем сноваgoto DISPLAY;
Повторяем вывод на дисплей