Выбрать главу

Рис. 17.3. Блок-схема основной фоновой процедуры

Программа 17.6. Основная фоновая процедура

     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; Повторяем вывод на дисплей

Преамбула

Если в момент сброса не нажата ни кнопка УСТ., ни кнопка ДИАГ., то управление переходит к основной программе, обозначенной меткой MAIN_PROC. В этой секции осуществляется считывание значения отсчитываемого периода из ячейки EEPROM с адресом h’00’ и инициализация счетных регистров. Зеленый СИД включается, а остальные световые индикаторы и звуковой излучатель выключаются.

Обратный отсчет

В фазе обратного отсчета осуществляется периодический ВЫВОД на дисплей значения счетчика минут — обновление дисплея осуществляется в прерывании. Зеленый СИД остается во включенном состоянии до тех пор, пока на дисплее не появится число