Поочередно проверяются все пять кнопок, подключенных к порту В. При замыкании кнопки включается либо один из СИД, либо звуковой излучатель. Таким образом, проверяется состояние кнопок и соответствующих органов индикации. Разумеется, работоспособность кнопки ДИАГ. проверяется по переходу системы в режим диагностики, а работоспособность кнопки СБРОС — по запуску процесса инициализации.
Если число органов управления в устройстве больше числа органов индикации, то можно либо включать определенные комбинации индикаторов, либо задействовать для этой цели один или более сегментов 7-сегментного индикатора.
СИД и звуковой излучатель
Устройства вывода статической информации проверяются совместно с кнопками, как описано выше. Разумеется, отсутствие свечения у СИД или звука у излучателя может быть обусловлено неисправностью как входного, так и выходного узла. Какой именно из узлов неисправен, достаточно легко выясняется при помощи вольтметра или логического пробника. Помните также, что светодиоды должны светиться во время установки временного интервала.
Дисплей
Каждый из индикаторов дисплея проверяется путем поочередного включения одного из сегментов с периодом в одну секунду. Это реализуется формированием значения с «бегущим нулем» (b’11111110’ —> Ь’11111101’ —> … —> b’01111111’), которое передается подпрограммой SPI_WRITE при каждом ненулевом значени регистра NEW_SEC. Данный регистр инкрементируется в обработчике прерывания от Таймера 0 при каждом инкрементировании счетчика секунд и сбрасывается в процедуре диагностики. То есть он играет роль храпового механизма, обеспечивая вывод каждого нового символа не ранее чем через секунду.
Процесс установки интервала запускается в том случае, если при выходе микроконтроллера из состояния сброса кнопка УСТ. оказывается замкнутой. Данный процесс предназначен для того, чтобы оператор мог изменить содержимое ячейки EEPROM с адресом h’00’ на любое значение от 1 до 99. В этой ячейке хранится начальное значение, используемое основным процессом для определения длительности процедуры счета.
В этой подпрограмме, код которой приведен в Программе 17.5, сначала в счетчик секунд записывается число 99, которое затем декрементируется с периодом в одну секунду в соответствии с логикой работы обработчика прерывания. Содержимое регистра SECOND передается в подпрограмму вывода на дисплей каждый раз, когда обработчик прерывания записывает в регистр-флаг NEW_SEC ненулевое значение, т. е. каждую секунду. В подпрограмме DISPLAY регистр NEW_SEC обнуляется, благодаря чему обновление дисплея происходит опять же только раз в секунду. Кроме того, каждую секунду проверяется состояние кнопки УСТ. — при ее размыкании состояние счетчика секунд сохраняется в EEPROM в секции UPDATE вызовом подпрограммы низкого уровня EE_PUT из Программы 15.2 (стр.547).
; *****************
; * ФУНКЦИЯ: Медленно считает от 99 до 00. При отпускании
; * кнопки УСТ. в EEPROM заносится новое значение интервала
; * РЕСУРСЫ: П\п DISPLAY, EE_PUT, ISR; переменная TIME_OUT *
; * ВХОД: Кнопка УСТ. нажата *
; * ВЫХОД: Обновляется содержимое EEPROM по адресу 00 *
; *****************
SET_TIME movlw d’99’; Начинаем счет со значения 99
movwf SECOND
movlw b’00000000’; Включаем все СИД
movwf PORTB
SET_LOOP movf SECOND,w; Берем значение счетчика секунд
call OUTPUT; и выводим его на дисплей
btfsc PORTB,SETT; Проверяем, не надо ли прекратить счет?
goto UPDATE; ЕСЛИ да, ТО обновляем EEPROM и выходим
movf SECOND,w; Берем отображаемое число
movwf TIME_OUT; Делаем временную копию
SLOOP movf NEW_SEC,f; Проверяем флаг секунды
btfsc STATUS,Z; ЕСЛИ не ноль, ТО пропускаем
goto S_LOOP; ИНАЧЕ проверяем снова
goto SET_LOOP; Повторяем
UPDATE movf TIME_OUT,w; Берем значение
movwf EEDATA; Инициализируем EEPROM
clrf EEADR
call EE_PUT; Пишем в EEPROM
return; и возвращаемся в основную программу