; ************************************
; * ФУНКЦИЯ: Считывает состояние N-й зоны и включает N-ю лампу *
; * ВХОД: N передается в регистре ZONE в виде b’00000nnn’ *
; * ВЫХОД: Включается N-я лампа, если состояние N-й зоны отлично от 0*
; * ВЫХОД: Регистр ZONE обнуляется, регистр TEMP не изменяется *
; ************************************
ZONE_N bsf STATUS,RP0; Переключаемся в 1-й банк
movlw h’FF’; Конфигурируем порт В как вход
movwf TRISB
clrf TRISA; Конфигурируем порт А как выход
bcf STATUS,RP0; Возвращаемся в 0-й банк
; -------------------------------------
movf ZONE,w; Считываем N, используемое
movwf PORTA; для выбора буферов N-й зоны
nop; Формируем задержку для установления сигнала
nop; в случае длинных соединительных линий
movf PORTB,w; Теперь считываем данные с порта В
btfsc STATUS,Z; ЕСЛИ не 0, ТО проникновение!
goto LAMP_OFF; ИНАЧЕ выключаем все лампы
; Обнаружено проникновение, включаем сигнальную лампу ------
bsf STATUS,RP0; Переключаемся в 1-й банк
clrf TRISB; Теперь конфигурируем порт В как выход
bcf STATUS,RP0; Возвращаемся в 0-й банк
; Преобразуем двоичное число в унарный эквивалент для включения соотв. лампы ---
movlw h’FF’; Все биты переменной TEMP
movwf TEMP; установлены в 1
bcf STATUS,С; Обнуляем бит переноса
incf ZONE,f; Транслируем номер зоны в диапазон 1…8
Z_LOOP rlf TEMP,f; Сдвигаем маску влево
bsf STATUS,С; Устанавливаем бит переноса
decfsz ZONE,f; Декрементируем номер зоны
goto Z_LOOP; и повторяем N раз
; В TEMP теперь находится маска для включения требуемой лампы ---
movf TEMP,w; Сохраняем ее в рабочем регистре
LAMP_OUT bsf PORTA,3; Разрешаем выходной порт
movwf PORTB; Выставляем маску
bsf PORTA,0; Формируем тактовый импульс
bcf PORTA,0
return; Все сделано
; Сюда переходим при отсутствии проникновения (нужно выключить все лампы) ---
LAMP_OFF bsf STATUS,RP0; Переключаемся в 1-й банк
clrf TRISB; Теперь конфигурируем порт В как выход
bcf STATUS,RP0; Возвращаемся в 0-й банк
movlw h’FF’; Выключаем все лампы
goto LAMP_OUT
Для проверки состояния датчиков