;--------------------------------- "ШАПКА"  ПРОГРАММЫ ----------------------------------------
;*********************************************************************************************
; Файл текста программы: uzu_40.8 asm          
; Программа разработана для устройства ультразвукового уровнемера.
; Частота посылки 40кГц Время посылки 100мкс, период посылки 300мс. 300мс*3=900mс
; Подсчитывается результат 3 посылок с проверкой на вход в диапазон 5см 
; и среднее значение выводится на индикатор 
; Используется TMR1 c коэфф делителя 1.  Коэфф. предделителя wdt 128 WDT ОТКЛЮЧЕН
; Используется индикация аварии: светодиодная + надпись потери эхо смгнала "no SEnSor"
; Одна общая задержка для каждой свои значения констант 
; Измеряемый уровень 40-750 см
; Возможность выставления объема резервуара и отсчета растояния от дна до воды
; Изменена на без косвеной адресации подпрограмма считывания из EEPROM 
; Добавлены команды в NEW1 определения PCLATH
; Добавлена возможность выбора работы откачка\закачка жидкости
; Индикация количества отраженных эхо сигналов
; При обрыве датчика (земляного вывода) высвечивается надпись "obriv" 
;----------------------------------------------------------------------------------------
; RA0 - ЖКИ (DB0)
; RA1 - ЖКИ (DB1)
; RA2 - ЖКИ (DB2)
; RA3 - ЖКИ (DB3)
; RA5 - MCLR
; RA6 - ЖКИ (AO)
; RA7 - ЖКИ (WR1)
; RB0 - Вход отраженного сигнала 
; RB1 - Кнопка "Парамметры", "-"
; RB2 - Кнопка "Сброс", "+"
; RB3 - Выход пачки
; RВ4 - Выход на светодиод потери эхо сигнала
; RВ5 - Выход 1 канала
; RB6 - Вход отраженного сигнала (для замера количества отраженных эхо сигналов) 
; RB7 - Выход 2 канала
;********************************************************************************************* 
; Автор: Кукса Алексей Николаевич, сентябрь 2012г.Добавлена термокомпенсация -автор Саволюк А.М.
;*********************************************************************************************
; Используется микроконтроллер PIC16F876A. Внутреняя частота  4000кГц.
;*********************************************************************************************
; Объем программы: 1682 слова в памяти программ.
;*********************************************************************************************
            LIST       p=16F876;   ; Определение типа микроконтроллера.
            #include  P16F876.inc
            errorlevel  2    
            __CONFIG   03D39H      ; Биты конфигурации.
;                         --- Макрокоманды ---
jnz	MACRO	metka1             ; условный переход,
	btfss	STATUS,Z           ; если не 0
	goto	metka1
	endm
jz	MACRO	metka2             ; условный переход,
	btfsc	STATUS,Z           ; если 0
	goto	metka2
	endm
jnc	MACRO	metka3             ; условный переход,
	btfss	STATUS,C	   ; если нет переноса
	goto	metka3
	endm
jc	MACRO	metka4             ; условный переход,
	btfsc	STATUS,C	   ; если перенос
	goto	metka4
	endm
mov     MACRO   DEST1,SOURCE1      ; пересылка регистр-регистр
	movf    SOURCE1,W
	movwf   DEST1
	endm
mvi     MACRO   DEST2,CONST2       ; пересылка константы в регистр
	movlw   CONST2
	movwf   DEST2
	endm
;===============================================================================================
; Определение названия и положения регистров общего назачения.
;==============================================================================================
Mem         equ         20h         ; Регистр оперативной памяти.
SecH        equ         21h         ; Регистр таймера Н
SecL        equ         22h         ; Регистр таймера L  
SecM        equ         23h         ; Регистр таймера M
Niz         equ         24h         ; Регистр проходов просмотра установки нижних уровней 
setup       equ         25h         ; Регистр проходов просмотра установки верхних уровней
Memory      equ         26h         ; Регистр определения входа в ПП "no SenSor"
TempD1      equ         27h         ; Регистр временного хранения D1    
TempD3      equ         28h         ; Регистр временного хранения D3
Sensor      equ         29h         ; Регистр определения времени включения светодиода портВ,4
rezervuarL  equ         2Ah         ; Регистр обьема резервуара нижний
rezervuarM  equ         2Bh         ; Регистр обьема резервуара верхний
d0          equ         2Ch         ; Регистр записи в знакоместо индикатора d0
d1          equ         2Dh         ; Регистр записи в знакоместо индикатора d1
vichitL     equ         2Eh         ; Вычитаемое L- используется для определения пределов "+" "-"
vichitM     equ         2Fh         ; Вычитаемое М - используется для определения пределов "+" "-"

Temp        equ         30h         ; Регистр временного хранения данных.
Index       equ         31h         ; Регистр счетчика количества малых колец индикации.
TimM        equ         32h         ; Регистр хранения уровня обьёма в резервуаре верхний
Uup2M       equ         33h         ; Уровень верхний 2 уровень (включение)
Uup1M       equ         34h         ; Уровень верхний 1 уровень (включение)
temd1       equ         35h         ; Временное хранение d1
temd2       equ         36h         ; Временное хранение d2
temd3       equ         37h         ; Временное хранение d3
EEE         equ         38h         ; Регистр проверки нажатия кнопки "-"
ABD         equ         39h         ; Регистр количества проходов до входа в ПП выставления верхних и нижних уровней
temd6       equ         3Ah         ; Временное хранение d6
temd7       equ         3Bh         ; Временное хранение d7
temd8       equ         3Ch         ; Временное хранение d8
Sensor1     equ         3Dh         ; Регистр времени задержки отабражения индикации "no SenSor"
ABC         equ         3Eh         ; Регистр количества проходов до сброса уровня в 0
Flag        equ         3Fh         ; Регистр флагов 

Del         equ         40h         ; Регистр делителя используется ПП математических операциях
RegL        equ         41h         ; Регистр используется в ПП математических операциях нижний 
RegH        equ         42h         ; Регистр используется в ПП математических операциях верхний
Rezult_L    equ         43h         ; Регистр используется в ПП математических операциях нижний
Rezult_H    equ         44h         ; Регистр используется в ПП математических операциях верхний
RegM        equ         45h         ; Регистр используется в ПП математических операциях средний
Slog_L      equ         46h         ; Регистр получения результата после сложения на 50 нижний
Slog_M      equ         47h         ; Регистр получения результата после сложения на 50 средний
CntDiv      equ         48h         ; Регистр используется в ПП математических операциях
Temp1       equ         49h         ; Регистр временного хранения 1        
Temp2       equ         4Ah         ; Регистр временного хранения 2 
Temp3       equ         4Bh         ; Регистр временного хранения 3 
Count2      equ         4Ch         ; Регистр количества проходов
nakopitL    equ         4Dh         ; Накопительный регистр хранения количества замеров младшего разряда
nakopitM    equ         4Eh         ; Накопительный регистр хранения количества замеров старшего разряда
Coun        equ         4Fh         ; Регистр счетчика количества больших колец индикации.

d2          equ         50h         ; Регистр записи в знакоместо индикатора d2 
d3          equ         51h         ; Регистр записи в знакоместо индикатора d3
d4          equ         52h         ; Регистр записи в знакоместо индикатора d4
d5          equ         53h         ; Регистр записи в знакоместо индикатора d5
d6          equ         54h         ; Регистр записи в знакоместо индикатора d6
d7          equ         55h         ; Регистр записи в знакоместо индикатора d7
d8          equ         56h         ; Регистр записи в знакоместо индикатора d8
d9          equ         57h         ; Регистр записи в знакоместо индикатора d9
impuls1L    equ         58h         ; Регистр 1-го замера с которым потом будут сравниваться последующие замеры младший
impuls1M    equ         59h         ; Регистр 1-го замера с которым потом будут сравниваться последующие замеры старший
temd4       equ         5Ah         ; Временное хранение d4
temd5       equ         5Bh         ; Временное хранение d5
TTL         equ         5Ch         ; Регистр временного хранения TimerL
TTM         equ         5Dh         ; Регистр временного хранения TimerM
umenL       equ         5Eh         ; Уменьшаемое L- используется для определения пределов "+" "-" 
umenM       equ         5Fh         ; Уменьшаемое М- используется для определения пределов "+" "-"
signal	    equ         60h
Flag1       equ         61h         ; Регистр флагов 
TH		   EQU	          062h			; Температура - старший байт
TL		    EQU 	        063h			; Температура - младший байт
CRCPIC		EQU	  064h	; Контрольная сумма, подсчитанная микроконтроллером
TRY		EQU	      065h			; Попытки чтения по 1-Wire
COUNTER		EQU	  066h	; Счетчик (используется при передаче данных по 1-Wire)
OUTA		EQU	    067h			; Хранение состояний защелок порта
TEMP11            EQU      068h              ;Ячейки для врЕменного
TEMP21            EQU      069h              ; хранения данных
Tempo             equ      6Ah
LEDtemp           equ      6Bh  
Counto             equ     6Ch
Tempo1             equ     6Dh 
Cora              equ      6Eh
LED0        equ         70h         ; Регистр хранения результатов преобразований
LED1        equ         71h         ; ------- 2-го -------------------------
LED2        equ         72h         ; ------- 3-го -------------------------
TimerL      equ         73h         ; Регистр младшего разряда 3-байтного двоичного числа.
TimerM      equ         74h         ; Регистр среднего разряда 3-байтного двоичного числа.
Udn2L       equ         75h         ; Уровень нижний 2 уровень (выключение)
Stat_Temp   equ         76h         ; Регистр временного хранения содержимого реистра Status
W_Temp      equ         77h         ; Регистр временного хранения содержимого реистра W
Udn1L       equ         78h         ; Уровень нижний 1 уровень (выключение)
Uup1L       equ         79h         ; Уровень нижний 1 уровень (включение)
TimerH      equ         7Ah         ; Регистр cтаршего разряда 3-байтного двоичного числа.
Count       equ         7Bh         ; Регистр счетчика количества прохода преобразования двоичных в двоично-десятичные.
TimL        equ         7Ch         ; Регистр хранения уровня обьёма в резервуаре нижний
Uup2L       equ         7Dh         ; Уровень нижний 1 уровень (включение)
Udn1M       equ         7Eh         ; Уровень верхний 1 уровень (выключение)
Udn2M       equ         7Fh         ; Уровень верхний 2 уровень (выключение)
OPTIONR     equ         81h
;===============================================================================================
; Определение места размещения результатов операций.
;===============================================================================================
W           equ         0           ; Результат направить в аккумулятор.
F           equ         1           ; Результат направить в регистр.
;===============================================================================================
; Присваивание битам названий.
;===============================================================================================
C           equ         0           ; Флаг переноса-заема.
Z           equ         2           ; Флаг нулевого результата.
;===============================================================================================
;=============================================================================================
; Определение точки входа в программу.
;=============================================================================================
            org         2100h       ; Обращение к EEPROM памяти данных.
            DE          .0,.130,.150; Записать в ячейки 0,1,2 регистры Udn1M, Uup1L, Udn1L
            DE          .0,.125,.150; Записать в ячейки 3,4,5 регистры Udn2M, Uup2L, Udn2L
            DE          .0,.0,.0    ; Записать в ячейки 6,7,8 регистры setup, Uup1M, Uup2M, 
            DE          .144,.1     ; Записать в ячейки 9,10  регистры rezervuarL, rezervuarM
            org         0           ; Начать выполнение программы
            goto        START       ; Переход ПП START
;================================================================================
; Точка входа в прерывание.
;================================================================================
            org         4           ; Назначение вектора прерывания (назначается,
                                    ; если в программе используются прерывания).
;********************************************************************************
; НАЧАЛО ПРЕРЫВАНИЯ.
;================================================================================           
; Сохранение содержимого регистров STATUS и W в ОЗУ.
;--------------------------------------------------------------------------------
INT         movwf       W_Temp      ; Скопировать содержимое регистра W в W_Temp.
            movf        Status,W    ; Скопировать содержимое регистра Status W
            movwf       Stat_Temp   ; Скопировать содержимое W в Stat_Temp.
            clrf        IntCon      ; Очистка IntCon 
            bcf         T1CON,0     ; остановка TMR1
            movf        TMR1L,W     ; -----------------------------------------
            movwf       RegL        ; перезапись с TMR1 в Reg 
            movf        TMR1H,W     ; число записаное TMR1 должно быть разделено на 59
            movwf       RegH        ; результат равен растоянию от датчика до воды
;++++++++++++++++++++++++++++++++++++++++++++
;         Rem  2   1   0
;              0   0   0
;              0   0   1
;              ......
;              1   1   1
;=============================================
            btfsc      TEMP21,2
            goto       R1
            btfsc      TEMP21,0
            goto       C1
            btfsc      TEMP21,1
            goto       P010
            goto       P000
C1
            btfsc      TEMP21,1
            goto       P011
            goto       P001
R1
            btfsc      TEMP21,0
            goto       R2
            btfsc      TEMP21,1
            goto       P110
            goto       P100
R2
            btfsc      TEMP21,1
            goto       P111
            goto       P101
P000
            movlw      .60; 0
            goto       G1
P001
            movlw      .59;  8
            goto       G1
P010
            movlw      .58; 16
            goto       G1
P011
            movlw      .58; 24
            goto       G1
P100
            movlw      .57; 32
            goto       G1
P101
            movlw      .56; 40
            goto       G1
P110
            movlw      .56;  48
            goto       G1
P111
            movlw      .55;  56
G1
            movwf       Del         ;
;=============================================================================================
; Общие подготовительные операции.
;=============================================================================================
Pam            clrf        Temp1       ; Сброс в 0 содержимого регистра Temp1.
            clrf        Temp2       ; Сброс в 0 содержимого регистра Temp2.
            clrf        Count2      ; Сброс в 0 содержимого регистра Count.
            clrf        Rezult_L    ; Сброс в 0 содержимого регистра Rezult_L.
            clrf        Rezult_H    ; Сброс в 0 содержимого регистра Rezult_H.
            movlw       .4          ; Копирование константы .4
            movwf       CntDiv      ; в регистр CntDiv.
;=============================================================================================
; ПП деления.
;=============================================================================================
START_DIV
;          call      GoA
         call        MINUS       ; Переход по стеку в ПП MINUS.
;----> Возврат по стеку из ПП MINUS.
            btfsc       Flag,0      ; Проверка состояния флага.
            goto        PLUS        ; Если флаг поднят (1), то переход в ПП PLUS.
            incf        Count2,F    ; Если флаг опущен (0), то Count+1=... Результат - в Count.
            goto        START_DIV   ; Переход в ПП START_DIV.
;------------------------------------------------
PLUS        movf        Del,W       ;
            addwf       Temp1,F     ; Del_L + Temp1 = ...
            btfsc       Status,0    ; Перенос был или нет ?
            incf        Temp2,F     ; Если перенос был (С=1), то Temp2+1=? Результат - в Temp2.
            bcf         Status,0    ; Если переноса не было (С=0), то сброс флага С.
            rrf         CntDiv,W    ; Сдвиг вправо содержимого CntDiv. Результат - в W.
            movwf       FSR         ; Косвенная адресация к содержимому регистра с адресом,
                                    ; записанным в FSR (в W).
            movlw       Rezult_L    ; Запись в W адреса регистра Rezult_L.
            addwf       FSR,F       ; FSR + W = ... Результат - в FSR.
            btfss       CntDiv,0    ; Бит №0 регистра CntDiv =0 или =1 ?
            goto        NNH         ; Если =0, то переход в ПП NNH.
            swapf       Count2,W    ; Если не=0, то смена п/байтов регистра Count. Результат - в W.
            iorwf       Indf,F      ; "ИЛИ" содержимого W и регистра с адресом в FSR. Результат
                                    ; - в регистр с адресом в FSR.
            goto        FFF         ; Переход в ПП FFF.
;--------------------------------------------------
NNH         movf        Count2,W    ; Копирование содержимого Count в W.
            iorwf       Indf,F      ; "ИЛИ" содержимого W и регистра с адресом в SFR. Результат
                                    ; - в регистр с адресом в FSR.
;--------------------------------------------------
; Сдвиги нужны или нет?
;--------------------------------------------------
FFF         decf        CntDiv,F    ; CntDiv - 1 = ... Результат - в CntDiv.
            movlw       b'11111111' ;
            subwf       CntDiv,W    ; CntDiv - FFh = ... Результат - в W.
            btfsc       Status,2    ; Результат операции =0 или не=0 ?
            goto        FINAL       ; Если =0, то переход в ПП FINAL.
                                    ; Если не=0, то программа исполняется далее. 
;------------------------------------------------------
; 4 сдвига влево Temp1/Temp2 со сбросами флага С.
;------------------------------------------------------
NO_FIN      bcf         Status,0    ; Сброс в 0 флага С.
            rlf         Temp1,F     ; Сдвиг влево содержимого 2-х байтного
            rlf         Temp2,F     ; регистра Temp1/Temp2.

            bcf         Status,0    ; Сброс в 0 флага С.
            rlf         Temp1,F     ; ----------"----------
            rlf         Temp2,F     ; Еще один сдвиг (№2).

            bcf         Status,0    ; Сброс в 0 флага С.
            rlf         Temp1,F     ; ----------"----------
            rlf         Temp2,F     ; Еще один сдвиг (№3).
            bcf         Status,0    ; Сброс в 0 флага С.
            rlf         Temp1,F     ; ----------"----------
            rlf         Temp2,F     ; Еще один сдвиг (№4).
;---------------------------------------------------
            bcf         Status,0    ; Сброс в 0 флага С.
            rrf         CntDiv,W    ; Сдвиг вправо содержимого CntDiv. Результат - в W.
            movwf       FSR         ; Копирование содержимого W в FSR.
            movlw       RegL        ; Запись адреса регистра RegL в W.
            addwf       FSR,F       ; W + FSR = ... Результат - в FSR.
            btfsc       CntDiv,0    ; Бит №0 регистра CntDiv равен 0 или 1 ?
            goto        NNH_1       ; Если =1, то переход в ПП NNH_1.
            movlw       b'00001111' ; Если =0, то запись в W константы 0Fh.
            andwf       Indf,W      ; Блокировка старшего п/байта регистра с адресом
                                    ; в FSR и сохранение результата в W.
            iorwf       Temp1,F     ; "ИЛИ"  W и Temp1. Результат - в Temp1.
            goto        SNOVA       ; Переход в ПП SNOVA.
;--------------------------------------------------
NNH_1       swapf       Indf,W      ; Смена п/байтов регистра с адресом в FSR. Результат - в W.
            andlw       b'00001111' ; Блокировка старшего п/байта результата предшествующей
                                    ; операции. Результат - в W.
            iorwf       Temp1,F     ; "ИЛИ"  W и Temp1. Результат - в Temp1.
;--------------------------------------------------
SNOVA       clrf        Count2      ; Сброс в 0 содержимого регистра Count.
            goto        START_DIV   ; Переход в ПП START_DIV. 
;=============================================================================================
; ПП вычитания.
;=============================================================================================
MINUS       bcf         Flag,0      ; Сброс флага в 0.
            movf        Del,W       ; 
            subwf       Temp1,F     ; Temp1 - Del = ... Результат - в Temp1.
            btfsc       Status,0    ; Результат положительный или отрицательный ?
;------------------------------------
; Флаг опущен.
;------------------------------------
            return                  ; Если положительный (С=1), то возврат по стеку в ПП START_DIV.
                                    ; Если отрицательный (С=0), то программа исполняется далее.
            decf        Temp2,F     ; Temp2 - 1 = ... Результат - в Temp2.
            movlw       b'11111111' ;
            subwf       Temp2,W     ; Temp2 - FFh = ...
            btfss       Status,2    ; Результат =0 или не=0 ?
;------------------------------------
; Флаг опущен.
;------------------------------------
            return                  ; Если не=0, то возврат по стеку в ПП START_DIV.
            bsf         Flag,0      ; Если =0, то флаг поднимается (устанавливается в 1).
;------------------------------------
; Флаг поднят.
;------------------------------------
            return                  ; Возврат по стеку в ПП START_DIV.
;***************************************************************************************
;***************************************************************************************
; ПП сравнения 3 замеров и вслучаи входа в диапазон 5см сумирования
; вычисления средне арифметического 3 замеров с выдачей на индикатор
;***************************************************************************************
;***************************************************************************************
FINAL       btfsc       Flag,4      ; проверка бита 4 первого замера 
            goto        zamer2      ; если замер был, переход на запись и сравнения 1 замера и 2-го
            movf        Rezult_L,W  ; ---------------------------------------
            movwf       impuls1L    ;
            movwf       umenL       ;
            movf        Rezult_H,W  ; переписать из Rezult в impuls1 и umenL 
            movwf       impuls1M    ;
            movwf       umenM       ; ---------------------------------------
            bsf         Flag,4      ; запись в регистры первого замера произведена поднять бит 4 в 1
            goto        EndInt1     ; окончание прерывания

zamer2      btfsc       Flag,5      ; проверка суммирования 1 и 2 замеров 
            goto        IMP3        ; если 2й замер записан то переход IMP3
            movf        impuls1L,W  ; --------------------------------------------------
            movwf       umenL       ; 
            movf        impuls1M,W  ; запись в регистры для проведения вычитания
            movwf       umenM       ;
            movf        Rezult_L,W  ; 1 замера из 2го
            movwf       vichitL     ;
            movf        Rezult_H,W  ;
            movwf       vichitM     ;
            call        vihit       ; --------------------------------------------------
;--------------------------------------------------------------------------------------- 
            bcf         Status,2    ; --------------------------------------------------
            movf        vichitM,W   ;
            btfss       Status,2    ;
            goto        HET2        ; проверка в хода в диапазон 5 см если нет переход в HET2 
            movf        vichitL,W   ;
            sublw       .5          ;
            btfss       Status,C    ;
            goto        HET2        ; ---------------------------------------------------
            bsf         Flag,5      ;
            movf        impuls1L,W  ;
            movwf       nakopitL    ;
            movf        impuls1M,W  ; если входит в диапазон 5см то
            movwf       nakopitM    ;
            movf        Rezult_L,W  ; 
            addwf       nakopitL,F  ; 
            btfss       Status,C    ; суммирование 1 и 2го замеров
            goto        $+2         ; 
            incf        nakopitM,F  ; 
            movf        Rezult_H,W  ;    
            addwf       nakopitM,F  ; ----------------------------------------------------
            goto        EndInt1     ; окончание прерывания 
;----------------------------------------------------------------------------------------- 
HET2        bcf         Flag,5      ;-----------------------------------------------------
            btfsc       Flag,6      ; проверка если 2 замер непрошел, то дается еще одна
            goto        $+3         ;   
            bsf         Flag,6      ; 
            goto        EndInt1     ; попытка в случаи если и этот замер не входит в диапазон 
            bcf         Flag,4      ;
            bcf         Flag,5      ;
            bcf         Flag,6      ; 5см (сравнивается с 1-м замером), то опускются биты №4,5,6,7
            bcf         Flag,7      ;
            clrf        nakopitL    ; и очищаются накопительные регистры nakopit
            clrf        nakopitM    ; ----------------------------------------------------------   
            goto        EndInt1     ; окончание прерывания 
;--------------------------------------------------------------------------------------------
IMP3        movf        impuls1L,W  ; ------------------------------------------------------
            movwf       umenL       ;  
            movf        impuls1M,W  ; 
            movwf       umenM       ;  
            movf        Rezult_L,W  ;  запись в регистры для проведения вычитания
            movwf       vichitL     ;
            movf        Rezult_H,W  ;
            movwf       vichitM     ;
            call        vihit       ; --------------------------------------------------------
            bcf         Status,2    ;
            movf        vichitM,W   ; 
            btfss       Status,2    ;
            goto        HET3        ; проверка входа в диапазон 5см если нет то переход в HET3 
            movf        vichitL,W   ;
            sublw       .5          ;
            btfss       Status,C    ;
            goto        HET3        ; -------------------------------------------------------
            bcf         Flag,1      ; 3 замер входит в диапазон поэтому производится сброс битов 4-7 
            bcf         Flag,4      ;
            bcf         Flag,5      ; в 0 и производится сумирование (1 замер+2 замер)+3 замер
            bcf         Flag,6      ;
            bcf         Flag,7      ; -------------------------------------------------------
            movf        Rezult_L,W  ; 
            addwf       nakopitL,F  ; 
            btfss       Status,C    ; 
            goto        $+2         ;  само суммирование
            incf        nakopitM,F  ; 
            movf        Rezult_H,W  ;    
            addwf       nakopitM,F  ; --------------------------------------------------------
;---------------------------------------------------------------------------------------------
            movf        nakopitM,W  ; -------------------------------------------------------- 
	movwf       RegH	; запись в регистры для производства деления на 3
	movf        nakopitL,W  ; для получения среднеарифметического значения которое 
  	movwf       RegL	; будет выведено на индикатор
	movlw       .3 	; 
	movwf       Del	; --------------------------------------------------------
;---------------------------------------------------------------------------------------------
	clrf        Temp1       ; Сброс в 0 содержимого регистра Temp1.
	clrf        Temp2       ; Сброс в 0 содержимого регистра Temp2.
	clrf        Count       ; Сброс в 0 содержимого регистра Count2.
	clrf        Rezult_L    ; Сброс в 0 содержимого регистра Rezult_L.
	clrf        Rezult_H    ; Сброс в 0 содержимого регистра Rezult_H.
            movlw       .4          ; Копирование константы .4
	movwf       CntDiv      ; в регистр CntDiv.
START_D     call        MINUSIC     ; Переход по стеку в ПП MINUSIC
	btfsc       Flag,0      ; Проверка состояния флага.
	goto        PLU         ; Если флаг поднят (1), то переход в ПП PLU. 
	incf        Count,F     ; Если флаг опущен (0), то Count+1=... Результат - в Count.
	goto        START_D     ; Переход в ПП START_DIV.
;------------------------------------------------
PLU         movf        Del,W       ;
	addwf       Temp1,F     ; Del_L + Temp1 = ...
            btfsc       Status,C    ; Перенос был или нет ?
            incf        Temp2,F     ; Если перенос был (С=1), то Temp2+1=? Результат - в Temp2.
            bcf         Status,C    ; Если переноса не было (С=0), то сброс флага С.
	rrf         CntDiv,W    ; Сдвиг вправо содержимого CntDiv. Результат - в W.
	movwf       FSR         ; Косвенная адресация к содержимому регистра с адресом,
                                    ; записанным в FSR (в W).
	movlw       Rezult_L    ; Запись в W адреса регистра Rezult_L.
	addwf       FSR,F       ; FSR + W = ... Результат - в FSR.
	btfss       CntDiv,0    ; Бит №0 регистра CntDiv =0 или =1 ?
	goto        HNNH        ; Если =0, то переход в ПП HNNH.
	swapf       Count,W     ; Если не=0, то смена п/байтов регистра Count. Результат - в W.
	iorwf       Indf,F      ; "ИЛИ" содержимого W и регистра с адресом в FSR. Результат
                                    ; - в регистр с адресом в FSR.
	goto        FFFF        ;  Переход в ПП FFFF.
;--------------------------------------------------
HNNH	movf        Count,W     ; Копирование содержимого Count в W.
	 iorwf       Indf,F      ; "ИЛИ" содержимого W и регистра с адресом в SFR. Результат
FFFF	decf        CntDiv,F    ; - в регистр с адресом в FSR.
	 movlw       b'11111111' ;
	 subwf       CntDiv,W    ; CntDiv - FFh = ... Результат - в W.
            btfsc       Status,Z    ; Результат операции =0 или не=0 ?
            goto        YES_FIN     ; Если =0, то переход в ПП YES_FIN.
                                    ; Если не=0, то программа исполняется далее.
NO_FINAL    bcf         Status,C    ; Сброс в 0 флага С.
	rlf         Temp1,F     ; Сдвиг влево содержимого 2-х байтного
	rlf         Temp2,F     ; регистра Temp1/Temp2.

	bcf         Status,C    ; Сброс в 0 флага С.
	rlf         Temp1,F     ;  ----------"----------
	rlf         Temp2,F     ; Еще один сдвиг (№2). 

	bcf         Status,C    ; Сброс в 0 флага С.
	rlf         Temp1,F     ; ----------"----------
	rlf         Temp2,F     ; Еще один сдвиг (№3).

	bcf         Status,C    ; Сброс в 0 флага С.
	rlf         Temp1,F     ; ----------"----------
	rlf         Temp2,F     ; Еще один сдвиг (№4). 
;---------------------------------------------------
	bcf         Status,C    ; Сброс в 0 флага С.
	rrf         CntDiv,W    ; Сдвиг вправо содержимого CntDiv. Результат - в W. 
	movwf       FSR         ; Копирование содержимого W в FSR.
	movlw       RegL        ; Запись адреса регистра RegL в W.
	addwf       FSR,F       ; W + FSR = ... Результат - в FSR.
	btfsc       CntDiv,0    ; Бит №0 регистра CntDiv равен 0 или 1 ?
	goto        HNNH_1      ; Если =1, то переход в ПП HNNH_1.
	movlw       b'00001111' ; Если =0, то запись в W константы 0Fh.
	andwf       Indf,W      ; Блокировка старшего п/байта регистра с адресом
                                    ; в FSR и сохранение результата в W.
	iorwf       Temp1,F     ; "ИЛИ"  W и Temp1. Результат - в Temp1.
	goto        SNOVAL      ; Переход в ПП SNOVAL
;-------------------------------------------------------------------------------------------
HNNH_1	swapf       Indf,W      ; Смена п/байтов регистра с адресом в FSR. Результат - в W. 
	 andlw       b'00001111' ; Блокировка старшего п/байта результата предшествующей
                                    ; операции. Результат - в W.
	 iorwf       Temp1,F     ; "ИЛИ"  W и Temp1. Результат - в Temp1.
;-------------------------------------------------------------------------------------------
SNOVAL	clrf        Count       ; Сброс в 0 содержимого регистра Count.
	 goto        START_D     ; Переход в ПП START_D. 
;--------------------------------------------------------------------------------------------
YES_FIN	bcf         Status,C    ; Сброс в 0 бита С регистра Status.
	 rrf         Del,F       ; сдвиг вправо регистра Del
;--------------------------------------------------------------------------------------------
            movf        Temp1,W     ; 
            subwf       Del,W       ; Del - Temp1 = ... Результат - в W.
            btfsc       Status,C    ; проверка Status,C
	goto        FINISH      ; если 1 то переход в FINISH
;----------------------------------------------------------------------------------------------
            incfsz      Rezult_L,F  ; инкремент с проверкой на 0
	goto        FINISH      ; если нет 0 переход в FINISH
            incf        Rezult_H,F  ; если 0 инкремент Rezult_H
;----------------------------------------------------------------------------------------------
FINISH	movf        Rezult_L,W  ; ---------------------------------------------------------
	 movwf       TimerL      ; перезапись из регистров Rezult в регистры Timer
	 movf        Rezult_H,W  ; 
	 movwf       TimerM      ;----------------------------------------------------------
            clrf        nakopitL    ; очистить накопительные регистры так как будет проводится
            clrf        nakopitM    ; следующие 3 замера/3=результат на индикатор 
            goto        MODE        ; далее переход MODE  
; ---------------------------------------------------------------------------------------------
HET3        btfsc       Flag,7      ; Проверка количества несовпадений 
            goto        $+3         ; если 2 переход на 3 строки вниз 
            bsf         Flag,7      ; если 1 поднятие в 1 бита 7 и 
            goto        EndInt      ; переход в EndInt 
            bcf         Flag,4      ; ---------------------------------------------------------
            bcf         Flag,5      ;
            bcf         Flag,6      ; при 2 несовпадениях подряд очистить биты 4-7 и
            bcf         Flag,7      ;  
            clrf        nakopitL    ;
            clrf        nakopitM    ; очистка регисторов nakopit с переходом в EndInt1  
            goto        EndInt1     ; ----------------------------------------------------------               
;-----------------------------------------------------------------------------------------------
MINUSIC	bcf         Flag,0      ; Сброс флага в 0.
	 movf        Del,W       ; 
	 subwf       Temp1,F     ; Temp1 - Del = ... Результат - в Temp1.
	 btfsc       Status,C    ; Результат положительный или отрицательный ?
	 return                  ; 
;------------------------------------------------------------------------------------------------
	 decf        Temp2,F     ; Temp2 - 1 = ... Результат - в Temp2.
	 movlw       b'11111111' ; 
	 subwf       Temp2,W     ; Temp2 - FFh = ...
	 btfss       Status,Z    ; Результат =0 или не=0 ?
	 return                  ; если не=0, то возврат по стеку в ПП START_DIV.
	 bsf         Flag,0      ; Если =0, то флаг поднимается (устанавливается в 1).
	 return                  ; Возврат по стеку в ПП START_D.
;==============================================================================================
; ПП Вычитания двух последующих друг за другом посылок для определения входа в диапазон 
;==============================================================================================
vihit       comf        umenL,F     ; Инверсия всех битов в регистре RegL с последующим
            incf        umenL,F     ; инкрементом результата инвертирования.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        umenM,F     ; Если флаг поднят, то декремент содержимого регистра RegM
                                    ; с последующей инверсией всех битов регистра RegM.
            comf        umenM,F     ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра RegM.
            movf        umenL,W     ; Суммирование содержимого регистров RegL и TimerL
            addwf       vichitL,F   ; с сохранением результата суммирования в TimerL.
            btfss       Status,C    ; Проверка состояния флага переноса-заема.
            goto        MINi        ; Если переноса не было, то переход в ПП MINUS_1.
            incf        vichitM,F   ; Если перенос был, то инкремент содержимого регистра TimerM.
MINi        movf        umenM,W     ; Суммирование содержимого регистров RegM и TimerM
            addwf       vichitM,F   ; с сохранением результата суммирования в TimerM.
            btfsc       Status,C    ; Проверка состояния флага переноса-заема.
            goto        $+6         ; Если перенос был, то переход в ПП REZ_PLUS.
            comf        vichitL,F   ; Инверсия всех битов в регистре TimerL.
            incf        vichitL,F   ; Инкремент результата результата инверсии.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        vichitM,F   ; Если флаг поднят, то декремент содержимого регистра TimerM
                                    ; с последующей инверсией всех его битов. 
            comf        vichitM,F   ; Инверсия всех битов регистра TimerM.
            return

;************************************************************************
; Проверка от чего работать: датчик-вода setup,0=0, дно-вода setup,0=1
;************************************************************************
MODE        btfsc       setup,0     ; выбор дно-вода\датчик-вода
            goto        glubina     ; переход на подсчет дно-вода 
;-----------------------------------------------------------------------------
; Переход с размера от датчика до воды до уровня воды в резервуаре
; если сначала был размер от датчика до воды то надо задать первоначальные уставки TTM(L,M) TTP(L,M)
;----------------------------------------------------------------------------- 
prov        btfsc      Flag,3      ; Проверка бита 3 
            goto       diapazon    ; если 1 дальнейшая измерение от датчика до воды    
            bsf        Flag,3      ; если 0 бит 3 в единицу
            bcf        Flag,2      ; бит 2 в ноль и переход ПП povtor
            goto       povtor      ; нужно для того чтобы после перехода из дно-вода в
                                   ; датчик-вода был возможен в ход в диапазон от 32-750                

;--------------------------------------------------------------------------------
;  ПП Проверка диапазона уровней
; если set,1  в 1 то переход на измерение уровня от дна
;--------------------------------------------------------------------------------
diapazon    btfsc       setup,0     ; проверка дно-вода\датчик-вода
            goto        $+0Ah       ; переход на 10 строк вниз
            movf        Uup1L,W     ; ------------------------------------------------
            movwf       RegL        ; запись из регистров Uup1 в регистры Reg
            movf        Uup1M,W     ;
            movwf       RegM        ;
            movf        TimerL,W    ; запись из регистров Timer в регистры Tim
            movwf       TimL        ;
            movf        TimerM,W    ;
            movwf       TimM        ; ------------------------------------------------
            goto        $+9         ; переход на 9 строк вниз

            movf        TimerL,W    ; ------------------------------------------------
            movwf       RegL        ; запись из регистров Timer в регистры Reg
            movf        TimerM,W    ;
            movwf       RegM        ;
            movf        Uup1L,W     ; запись из регистров Uup1 в регистры Tim
            movwf       TimL        ;
            movf        Uup1M,W     ;
            movwf       TimM        ; -------------------------------------------------

            comf        RegL,F      ; Инверсия всех битов в регистре RegL с последующим
            incf        RegL,F      ; инкрементом результата инвертирования.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        RegM,F      ; Если флаг поднят, то декремент содержимого регистра RegM
                                    ; с последующей инверсией всех битов регистра RegM.
            comf        RegM,F      ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра RegM.
;==============================================================================================
; Промежуточное суммирование.
;==============================================================================================
; RegL + TimL с последующим анализом результата.
;-------------------------------------------------
            movf        RegL,W      ; Суммирование содержимого регистров RegL и TimL
            addwf       TimL,F      ; с сохранением результата суммирования в TimL.
            btfss       Status,C    ; Проверка состояния флага переноса-заема.
            goto        MINUS_2     ; Если переноса не было, то переход в ПП MINUS_2.
            incf        TimM,F      ; Если перенос был, то инкремент содержимого регистра TimM.
;-------------------------------------------------
; RegM + TimerM с последующим анализом результата.
;-------------------------------------------------
MINUS_2     movf        RegM,W      ; Суммирование содержимого регистров RegM и TimM
            addwf       TimM,F      ; с сохранением результата суммирования в TimM.
            btfsc       Status,C    ; Проверка состояния флага переноса-заема.
            goto        zero1up     ; ПП проверки на нулевой результат пример 238-238=0
;---------------------------------------------------------------------------------------------
; Эта группа команд выполняется в случае отрицательного результата вычитания.
;---------------------------------------------------------------------------------------------
            call        vkl1        ; измеряемый уровень меньше заданому то переод в vkl1 (включение 1 уровня)
            goto        diapazon_1  ; если нет переход в diapazon_1
;---------------------------------------------------------------------------------------------
zero1up     btfss       Status,Z    ; --------------------------------------------------- 
            goto        diapazon_1  ; проверка если измеряемый уровень равен заданому то
            bcf         Status,Z    ; переход в vkl1 (включение 1 уровня)
            movf        TimL,W      ;
            btfss       Status,Z    ;
            goto        diapazon_1  ; если не равен переход в diapazon_1
            call        vkl1        ; равен 0 переход в vkl1
;---------------------------------------------------------------------------------------------          
diapazon_1  btfsc       setup,0     ; проверка дно-вода\датчик-вода
            goto        $+0Ah       ; переход на 10 строк вниз
            movf        TimerL,W    ; ------------------------------------------------
            movwf       RegL        ; запись из регистров Timer в регистры Reg
            movf        TimerM,W    ;
            movwf       RegM        ;
            movf        Udn1L,W     ; запись из регистров Udn1 в регистры Tim
            movwf       TimL        ;
            movf        Udn1M,W     ;
            movwf       TimM        ; ------------------------------------------------
            goto        $+9         ; переход на 9 строк вниз

            movf        TimerL,W    ; ------------------------------------------------
            movwf       TimL        ; запись из регистров Timer в регистры Reg
            movf        TimerM,W    ;
            movwf       TimM        ;
            movf        Udn1L,W     ; запись из регистров Uup1 в регистры Tim
            movwf       RegL        ;
            movf        Udn1M,W     ;
            movwf       RegM        ; ------------------------------------------------

            comf        RegL,F      ; Инверсия всех битов в регистре RegL с последующим
            incf        RegL,F      ; инкрементом результата инвертирования.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        RegM,F      ; Если флаг поднят, то декремент содержимого регистра RegM
                                    ; с последующей инверсией всех битов регистра RegM.
            comf        RegM,F      ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра RegM.
;==============================================================================================
; Промежуточное суммирование.
;==============================================================================================
; RegL + TimL с последующим анализом результата.
;-------------------------------------------------
            movf        RegL,W      ; Суммирование содержимого регистров RegL и TimL
            addwf       TimL,F      ; с сохранением результата суммирования в TimL.
            btfss       Status,C    ; Проверка состояния флага переноса-заема.
            goto        MINUS_3     ; Если переноса не было, то переход в ПП MINUS_3.
            incf        TimM,F      ; Если перенос был, то инкремент содержимого регистра TimM.
;-------------------------------------------------
; RegM + TimerM с последующим анализом результата.
;-------------------------------------------------
MINUS_3     movf        RegM,W      ; Суммирование содержимого регистров RegM и TimM
            addwf       TimM,F      ; с сохранением результата суммирования в TimM.
            btfsc       Status,C    ; Проверка состояния флага переноса-заема.
            goto        zero1dn     ; ПП проверки на нулевой результат пример 238-238=0 
;---------------------------------------------------------------------------------------------
; Эта группа команд выполняется в случае отрицательного результата вычитания.
;---------------------------------------------------------------------------------------------
            call        otkl1       ; измеряемый уровень меньше заданому то переод в otkl1 (откл 1 уровня)
            goto        diapazon_2  ; если нет переход в diapazon_2
;---------------------------------------------------------------------------------------------
zero1dn     btfss       Status,Z    ; --------------------------------------------------- 
            goto        diapazon_2  ; проверка если измеряемый уровень равен заданому то
            bcf         Status,Z    ; переход в otkl1 (отключение 1 уровня)
            movf        TimL,W      ;
            btfss       Status,Z    ; проверка флага Z
            goto        diapazon_2  ; если не равен переход в diapazon_2
            call        otkl1       ; равен 0 переход в otkl1
;---------------------------------------------------------------------------------------------          
diapazon_2  btfsc       setup,0     ; проверка дно-вода\датчик-вода
            goto        $+0Ah       ; переход на 10 строк вниз
            movf        Uup2L,W     ; ------------------------------------------------
            movwf       RegL        ; запись из регистров Uup2 в регистры Reg
            movf        Uup2M,W     ;
            movwf       RegM        ;
            movf        TimerL,W    ; запись из регистров Timer в регистры Tim
            movwf       TimL        ;
            movf        TimerM,W    ;
            movwf       TimM        ; ------------------------------------------------
            goto        $+9         ; переход на 9 строк вниз
            
            movf        TimerL,W    ; ------------------------------------------------
            movwf       RegL        ; запись из регистров Timer в регистры Reg
            movf        TimerM,W    ;
            movwf       RegM        ;
            movf        Uup2L,W     ; запись из регистров Uup2 в регистры Tim
            movwf       TimL        ;
            movf        Uup2M,W     ;
            movwf       TimM        ; ------------------------------------------------

            comf        RegL,F      ; Инверсия всех битов в регистре RegL с последующим
            incf        RegL,F      ; инкрементом результата инвертирования.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        RegM,F      ; Если флаг поднят, то декремент содержимого регистра RegM
                                    ; с последующей инверсией всех битов регистра RegM.
            comf        RegM,F      ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра RegM.
;==============================================================================================
; Промежуточное суммирование.
;==============================================================================================
; RegL + TimL с последующим анализом результата.
;-------------------------------------------------
            movf        RegL,W      ; Суммирование содержимого регистров RegL и TimL
            addwf       TimL,F      ; с сохранением результата суммирования в TimL.
            btfss       Status,C    ; Проверка состояния флага переноса-заема.
            goto        MINUS_4     ; Если переноса не было, то переход в ПП MINUS_4.
            incf        TimM,F      ; Если перенос был, то инкремент содержимого регистра TimM.
;-------------------------------------------------
; RegM + TimerM с последующим анализом результата.
;-------------------------------------------------
MINUS_4     movf        RegM,W      ; Суммирование содержимого регистров RegM и TimM
            addwf       TimM,F      ; с сохранением результата суммирования в TimM.
            btfsc       Status,C    ; Проверка состояния флага переноса-заема.
            goto        zero2up
;---------------------------------------------------------------------------------------------
; Эта группа команд выполняется в случае отрицательного результата вычитания.
;---------------------------------------------------------------------------------------------
            call        vkl2        ; измеряемый уровень меньше заданому то переод в vkl2 (включение 2 уровня)
            goto        diapazon_3  ; если нет переход в diapazon_3 
;---------------------------------------------------------------------------------------------
zero2up     btfss       Status,Z    ; --------------------------------------------------- 
            goto        diapazon_3  ; проверка если измеряемый уровень равен заданому то
            bcf         Status,Z    ; переход в vkl2 (включение 2 уровня) 
            movf        TimL,W      ;
            btfss       Status,Z    ; проверка флага Z
            goto        diapazon_3  ; если не равен переход в diapazon_3
            call        vkl2        ; равен 0 переход в vkl2
;---------------------------------------------------------------------------------------------          
diapazon_3  btfsc       setup,0     ; проверка дно-вода\датчик-вода
            goto        $+0Ah       ; переход на 10 строк вниз
            movf        TimerL,W    ; ------------------------------------------------
            movwf       RegL        ;
            movf        TimerM,W    ; запись из регистров Timer в регистры Reg
            movwf       RegM        ;
            movf        Udn2L,W     ; запись из регистров Udn2 в регистры Tim
            movwf       TimL        ;
            movf        Udn2M,W     ;
            movwf       TimM        ; ------------------------------------------------
            goto        $+9         ; переход на 9 строк вниз

            movf        TimerL,W    ; ------------------------------------------------
            movwf       TimL        ;
            movf        TimerM,W    ; запись из регистров Timer в регистры Tim
            movwf       TimM        ;
            movf        Udn2L,W     ;
            movwf       RegL        ; запись из регистров Udn2 в регистры Reg
            movf        Udn2M,W     ;
            movwf       RegM        ; ------------------------------------------------

            comf        RegL,F      ; Инверсия всех битов в регистре RegL с последующим
            incf        RegL,F      ; инкрементом результата инвертирования.
            btfsc       Status,Z    ; Проверка состояния флага нулевого результата.
            decf        RegM,F      ; Если флаг поднят, то декремент содержимого регистра RegM
                                    ; с последующей инверсией всех битов регистра RegM.
            comf        RegM,F      ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра RegM.
;==============================================================================================
; Промежуточное суммирование.
;==============================================================================================
; RegL + TimL с последующим анализом результата.
;-------------------------------------------------
            movf        RegL,W      ; Суммирование содержимого регистров RegL и TimL
            addwf       TimL,F      ; с сохранением результата суммирования в TimL.
   
            btfss       Status,C    ; Проверка состояния флага переноса-заема.
            goto        MINUS_5     ; Если переноса не было, то переход в ПП MINUS_5.
            incf        TimM,F      ; Если перенос был, то инкремент содержимого регистра TimM.
;-------------------------------------------------
; RegM + TimerM с последующим анализом результата.
;-------------------------------------------------
MINUS_5     movf        RegM,W      ; Суммирование содержимого регистров RegM и TimM
            addwf       TimM,F      ; с сохранением результата суммирования в TimerM.
            btfsc       Status,C    ; Проверка состояния флага переноса-заема.
            goto        zero2dn     ; ПП проверки на нулевой результат пример 238-238=0 
;---------------------------------------------------------------------------------------------
; Эта группа команд выполняется в случае отрицательного результата вычитания.
;---------------------------------------------------------------------------------------------
            call        otkl2       ; измеряемый уровень меньше заданому то переод в otkl2 (откл 2 уровня)
            goto        zxc         ; если нет переход в zxc
;---------------------------------------------------------------------------------------------
zero2dn     btfss       Status,Z    ; ---------------------------------------------------
            goto        zxc         ; проверка если измеряемый уровень равен заданому то
            bcf         Status,Z    ; переход в otkl2 (отключение 2 уровня)
            movf        TimL,W      ;
            btfss       Status,Z    ; проверка флага Z
            goto        zxc         ; если не равен переход в zxc
            call        otkl2       ; равен 0 переход в otkl2
;---------------------------------------------------------------------------------------------
; ПП Записи хранения содержимого Timer в TT для проверки "+" "-" и последующей записи в Timer
;---------------------------------------------------------------------------------------------
zxc         movf        TimerL,W    ; При входе TimerL,М в заданный диапазон они копируются в
            movwf       TTL         ; TTL, TTM для того чтоб в следующем цикле замере при не
            movf        TimerM,W    ; вхождении в замеряемый диапазон TTL, TTM копируются в   
            movwf       TTM         ; TimerL,М и выводятся на индикацию

;====================================================================================================
; Восстановление содержимого регистров STATUS и W с последующим выходом
; из прерывания.
;--------------------------------------------------------------------------------
EndInt      bsf	Flag1,0     ; Записать в W .1
            bsf	Memory,0    ; Переписать 1 в Memory
            movlw       .45         ; количество проходов до загорания 
            movwf       Sensor      ; светодиода потери эхо сигнала
            bcf         PortB,6     ; гашение светодиода потери эхо сигнала
	bcf	IntCon,7
            clrf        TMR1H       ; очистка TMR1L
            clrf        TMR1L       ; очистка TMR1Н
	movlw	.7
	movwf	T1CON
            movf        Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp
                                    ; в регистр W.
            movwf       Status      ; Скопировать содержимое регистра W
                                    ; в регистр Status.
            swapf       W_Temp,F    ; Поменять местами старший и младший полубайты
                                    ; регистра W_Temp с сохранением результата
                                    ; операции в нем же.
            swapf       W_Temp,W    ; Поменять местами старший и младший полубайты
            clrf        Tmr0        ; регистра W_Temp с сохранением результата
                                                                                                                                  
            retfie                  ; Возврат из прерывания по стеку
EndInt1     bsf         Flag,1      ; Поднятие в 1цу бита 1  
            goto        EndInt      ; переход в EndInt 
;*************************************************************************************
glubina     movf        TimerL,W    ; ----------------------------------------- 
            movwf       Temp1       ; перезапись регистров Timer в
            movf        TimerM,W    ; регистры Temp1 и Temp2
            movwf       Temp2       ;
            movf        rezervuarL,W; перезапись регистров rezervuar в
            movwf       TimerL      ; регистры TimerL и TimerM
            movf        rezervuarM,W; 
            movwf       TimerM      ; -----------------------------------------
;***********************************************************************************************
; Подпрограмма вычитания двух двухбайтных двоичных чисел.
;***********************************************************************************************
; Последовательная инверсия всех битов байтов регистров Temp1,M
;===============================================================================================
            comf       Temp1,F      ; Инверсия всех битов в регистре Temp1 с последующим
            incf       Temp1,F      ; инкрементом результата инвертирования.
            btfsc      Status,Z     ; Проверка состояния флага нулевого результата.
            decf       Temp2,F      ; Если флаг поднят, то декремент содержимого регистра Temp2
                                    ; с последующей инверсией всех битов регистра Temp2.
            comf       Temp2,F      ; Если флаг не поднят, то производится только инверсия всех
                                    ; битов регистра Temp2.
;==============================================================================================
; Промежуточное суммирование.
;==============================================================================================
; Temp1 + TimerL с последующим анализом результата.
;-------------------------------------------------
            movf       Temp1,W      ; Суммирование содержимого регистров Temp1 и TimerL
            addwf      TimerL,F     ; с сохранением результата суммирования в TimerL.
            btfss      Status,C     ; Проверка состояния флага переноса-заема.
            goto       MINUS_1ob    ; Если переноса не было, то переход в ПП MINUS_1ob.
            incf       TimerM,F     ; Если перенос был, то инкремент содержимого регистра TimerM.
;--------------------------------------------------------------------------------------
; Temp2 + TimerM с последующим анализом результата.
; Результат вычисления объема жидкости в резервуаре
;---------------------------------------------------------------------------------------------
MINUS_1ob   movf       Temp2,W      ; Суммирование содержимого регистров Temp2 и TimerM
            addwf      TimerM,F     ; с сохранением результата суммирования в TimerM.
;-----------------------------------------------------------------------------
; Переход с размера от датчика до воды до уровня воды в резервуаре
; если сначала был размер от датчика до воды то надо задать первоначальные уставки TTM(L,M) TTP(L,M)
;----------------------------------------------------------------------------- 
            btfsc      Flag,2       ; Проверка бита 2
            goto       diapazon     ; если 1 дальнейшая измерение от дна до воды    
            bsf        Flag,2       ; если 0 бит 2 в единицу
            bcf        Flag,3       ; бит 3 в ноль и переход ПП povtor
            goto       povtor       ; нужно для того чтобы после перехода из датчика-вода в
                                    ; датчик-вода был возможен в ход в диапазон от 32-750             
;-------------------------------------------------------------------------------------------------
;***********************************************************************************************
; Подготовка счетчика количества малых колец индикации Index к началу полного цикла 
; динамической индикации.
;-----------------------------------------------------------------------------------------------
NEW1        clrf        Index       ; Сброс в 0 содержимого счетчика малых колец индикации Index.
;-----------------------------------------------------------------------------------------------
CYCLER	movlw       high RTY    ; Установка (через W), в PCH (посредством PCLATH), числового 
            movwf       PCLATH      ; значения старшего байта адреса той команды, которая помечена
RTY	movlw       LED0        ; Запись в регистр W адреса регистра LED0.
            addwf       Index,W     ; Увеличение адреса регистра LED0 на величину числа,
                                    ; записанного в регистре счетчика количества малых колец
                                    ; индикации Index, c сохранением результата в регистре W.                                   
            movwf       FSR         ; Копирование содержимого регистра W в регистр FSR.
            movf        Indf,W      ; Копирование содержимого регистра с адресом, записанным
                                    ; в регистре FSR, в регистр W.
            call        TABLE1      ; Условный переход (адрес следующей команды закладывается
                                    ; в стек) в ПП TABLE.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Группа команд вывода индикации порта А и порта В.
;-----------------------------------------------------------------------------------------------
            movwf       Temp        ; *******************************************************
            movf        Index,W     ;  
            addwf       PCL,f        ;  
            goto        $+3         ;  
            goto        $+5         ; Вычисляемый переход для определения последовательности 
            goto        $+7         ;
            movf        Temp,W      ;
            movwf       d8          ; вывода на индикацию разрядности чисел уровня обьема
            goto        opar        ;
            movf        Temp,W      ;
            movwf       d7          ; жидкости в резервуаре а так же уровней включения и отключения
            goto        opar        ;
            movf        Temp,W      ;
            movwf       d6          ;
            goto        opar        ; *********************************************************

;-----------------------------------------------------------------------------------------------
; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с последующей
; проверкой результата инкремента на равенство (или нет) числу .08.
;-----------------------------------------------------------------------------------------------
opar        incf        Index,F     ; Увеличение на 1 содержимого регистра Index с сохранением
                                    ; результата в нем же.
            movlw       .03         ; Запись в регистр W константы .03.
            bcf         Status,Z    ; Сброс флага нулевого результата Z.
            subwf       Index,W     ; Вычесть из содержимого регистра Index содержимое регистра
                                    ; W с сохранением результата в регистре W.
            btfss       Status,Z    ; Результат операции вычитания равен или нет нулю? 
            goto        CYCLER      ; Если не =0 (в регистре Index - число не равное 3), то
                                    ; переход к циклу активизации следующего по старшинству
                                    ; 7-сегментного индикатора (переход на новое малое
                                    ; кольцо индикации, то есть, в ПП CYCLER).
                                    ; Если =0 (в регистре Index - число равное 3), то программа
                                    ; исполняется далее.
;-----------------------------------------------------------------------------------------------
; Начало перехода на новое большое кольцо индикации после того, как последовательно активизиру- 
; ются все 8 7-сегментных индикатора линейки (после прохождения 8-ми малых колец индикации).
;-----------------------------------------------------------------------------------------------
            clrf        Index       ; Сброс в 0 содержимого регистра Index.
            return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TABLE1      bsf         PCLATH,1
            addwf       PCL,F        ; Содержимое счетчика команд PC увеличивается
                                    ; на величину содержимого аккумулятора W.
            retlw       0EEh        ; ..FEDCBA = 0               
            retlw       060h        ; .....CB. = 1               
            retlw       02Fh        ; .G.ED.BA = 2               
            retlw       06Dh        ; .G..DCBA = 3               
            retlw       0E1h        ; .GF..CB. = 4       
            retlw       0CDh        ; .GF.DC.A = 5      
            retlw       0CFh        ; .GFEDC.A = 6        
            retlw       068h        ; .....CBA = 7                                     
            retlw       0EFh        ; .GFEDCBA = 8                                     
            retlw       0EDh        ; .GF.DCBA = 9
;***************************************************************************************************
;==================================================================================================
START    ;   bsf         Status,5    ; "Двойная" "штатная"  команда установки 
;            bcf         Status,6    ; 1-го банка.
;            clrf        VRCON       ; Отключение источника опорного напряжения.
;            bcf         Status,5    ; Установка 0-го банка (далее, при переключениях между
;            movlw       .07         ; Отключение компараторов.
;            movwf       CMCON       ; --------"--------
;            clrf        RCSTA       ; Отключение USART.
;            clrf        T1CON       ; ----"----  TMR1.
;            clrf        T2CON       ; ----"----  TMR2.
;            clrf        CCP1CON     ; ----"------CCP1CON
;||||||||||||||||||||||||||||||||||||||||||||||||
Reset	    bcf	STATUS,RP0		;Обращение к банку 0
		bcf	STATUS,RP1
		goto    Begin			;Обходим обработчик прерываний и подпрограммы
;                -------------- ПОДПРОГРАММЫ ---
;Подпрограмма паузы (используется ячейка TEMP1)
Pause            clrwdt
		 movwf     TEMP11    ;Длительность паузы задается числом в W (примерно в мс)
		 movf      TEMP11,F          ;Проверка на 0
		 btfsc     STATUS,Z  ;Если длительность не равна 0, то Z=0 и пропускаем return
		 return            ;Если же длительность равна 0, то сразу возврат
		 clrw                       ;Очищаем W
P_label          addlw     01h              ;Внутренний цикл по W
		 jnz       P_label
          decfsz    TEMP11,F          ;Внешний цикл по TEMP1
          goto      P_label          ;
		 clrwdt  
		 return                     ;Конец подпрограммы паузы
;--------------------------------------------------------------------------------------------------
;Подпрограмма проверки подключения DS18B20 (Используется ячейка TEMP1)
TestDS		 movlw     038h			 ;
		 btfss     PORTA,4               ;Термометр в состоянии ожидания?
		 goto      Test4_label		 ;Нет, активен - переход, выходим
     clrf      OUTA
		 bcf       OUTA,4                ;Сброс 1-Wire
		 movf      OUTA,W
		 movwf     PORTA                 ;Импульс сброса (не менее 480 мкс)
		 movlw     050h
Test1_label      addlw     01h
            btfss     STATUS,Z              ;(за время этой паузы 3 раза происходит
            goto      Test1_label           ; прерывание от TMR0)
		 bsf       OUTA,4
		 movf      OUTA,W
		 movwf     PORTA                 ;Сброс 1-Wire выполнен
		 movlw     D'239'
Test2_label      addlw     01h    ;Ждем ответа от DS18B20 (пауза ~70 мкс)
           btfss     STATUS,Z
           goto      Test2_label
		 clrf      TEMP11
		 movlw     D'252'
Test3_label      btfss     PORTA,4               ;Есть отклик (0) ?
		 incf      TEMP11,F		 ;Да - инкремент TEMP1
		 addlw     01h                   ;
          btfss     STATUS,Z
          goto      Test3_label
		 goto      Testend_label         ;
Test4_label      addlw     01h        ;Пауза для выравнивания путей
          jnz       Test4_label
		 movlw     0
Testend_label	 movlw     075h
		 addlw     01h                   ;Ожидание окончания отклика DS18B20
        jnz       Testend_label+1
		 movlw     04h			 ;Если отклик DS18B20 правильный, то TEMP1 = 4
		 xorwf     TEMP11,W
		 btfsc     STATUS,Z              ;TEMP1 = 4 ? 
		 movlw     0FFh       ;Да  - установить признак присутствия (W=0FFh)
Stop_label	 return                   ;Конец подпрограммы проверки
;--------------------------------------------------------------------------------------------------
;Подпрограмма ввода/вывода по шине 1-Wire (для приема задаем W=0FFh). Используется TEMP1
RW_1Wire	 movwf     TEMP11		 ;Исходные данные в W
		 movlw     08h                   ;8 бит
		 movwf     COUNTER
RWLoop		bcf       OUTA,4                ;0 --> 1-Wire
		 mov       PORTA,OUTA
		 btfsc     TEMP11,0
		 bsf       OUTA,4          ;Установить,если младший бит TEMP1 = 1
		 mov       PORTA,OUTA
		 rrf       TEMP11,F               ;Подготовить следующий бит
		 movlw     0FDh			 ;Пауза ~12 мкс
RW_1label        addlw     01h
		 jnz       RW_1label
		 bcf       TEMP11,7               ;Принимаем в тот же TEMP1
		 btfsc     PORTA,4
		 bsf       TEMP11,7
		 movlw     D'220'                ;Время на освобождение линии ведомым
RW_2label        addlw     01h
		 jnz       RW_2label
		 bsf       OUTA,4                ;Отпускаем шину
		 mov       PORTA,OUTA
		 bsf       INTCON,GIE            ;Разрешить прерывания
		 decfsz    COUNTER,F		 ;8 бит обработаны?
		 goto      RWLoop                ;Еще нет - переход
		 movf      TEMP11,W               ;Принятый байт в W
		 return				 ;Конец подпрограммы ввода/вывода по шине 1-Wire
;--------------------------------------------------------------------------------------------------
;Подпрограмма обновления CRC. Параметр в W. Используются ячейки TEMP1, TEMP2
NewCRC		 clrwdt
		 movwf     TEMP21                 ;Сохранить W
		 movlw     08h
		 movwf     COUNTER               ;8 --> COUNTER
		 movf      TEMP21,W               ;Восстановить значение W
CRC_label	 xorwf     CRCPIC,W    ;Исключ.ИЛИ CRCPIC и W, результат в W
		 movwf     TEMP11                 ;Скопировать результат в TEMP1
		 rrf       TEMP11,W               ;Сдвиг TEMP1 вправо на 1, результат в W, младший бит в С
		 movf      CRCPIC,W              ;CRCPIC --> W (бит С не изменился)
		 btfsc     STATUS,0
		 xorlw     018h           ;Если С=0, то эту инструкцию не выполнять
		 movwf     TEMP11                 ;Результат в TEMP1
		 rrf       TEMP11,W               ;Снова сдвиг, результат в W
		 movwf     CRCPIC                ;Сохранить результат в CRCPIC
		 bcf       STATUS,0              ;0 --> C
		 rrf       TEMP21,F               ;Сдвиг TEMP2 вправо на 1
		 movf      TEMP21,W           ;И скопировать полученное значение в W
		 clrwdt
		 decfsz    COUNTER,F
		 goto      CRC_label
 		 return				 ;Конец подпрограммы обновления CRC
;          --------------- НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ ---
Begin
		movlw 6;7
		movwf ADCON1				;
		movf	PORTA,F			;Приводим в соответствие
		movf	PORTB,F			;защелки портов
		clrf	INTCON
		clrwdt
		clrf	TMR0
    clrf   Cora
		bsf	STATUS,RP0	;Обращение к банку 1 для доступа к TRIS и OPTION_REG
    movlw B'00000000'
		movwf	TRISA			;Устанавливаем выводы порта А как 'OOOOOOOO' (I-in, O-out)
    movlw B'00000000'
		movwf	TRISB			;Устанавливаем выводы порта B как 'OOOOOOOO'
    movlw B'00000011';B"00111111"
    movwf  TRISC
		mvi	OPTIONR,B'00000111';Подключаем сначала TMR0 через делитель=256 к OSC
		clrwdt
		mvi	OPTIONR,B'00001101';Переключаем предделитель 32 к WDT, TMR0 - таймер
		bcf	STATUS,RP0		;Обращение к банку 0


Online_label     clrwdt		                 ;Работа с термометром DS18B20
		 clrf      TMR0
		 call      TestDS		 ;Сброс и проверка термометра
		 xorlw     0FFh
		 jnz       Begin		 ;Ошибка - переход на начало программы
		 movlw     0CCh			 ;Команда "Skip ROM"
		 call      RW_1Wire
		 movlw     044h			 ;Команда "Convert T"
		 call      RW_1Wire
		 movlw     0FFh 		 ;Идет процесс преобразования
		 call      Pause
		 movlw     0FFh
		 call      Pause
		 movlw     0FFh
		 call      Pause
		 mvi       TRY,08h               ;8 попыток чтения
Newtry_label	 clrwdt                ;Начинаем чтение данных из DS18B20
		 clrf      TMR0
		 call      TestDS		 ;Сброс и проверка термометра
		 xorlw     0FFh
		 jnz       Begin		 ;Ошибка - переход на начало программы
		 movlw     0CCh			 ;Команда "Skip ROM"
		 call      RW_1Wire
		 movlw     0BEh			 ;Команда "Read Scratchpad"
		 call      RW_1Wire
		 clrf      CRCPIC
		 movlw     0FFh
		 call      RW_1Wire
		 movwf     TL                    ;Младший байт температуры
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 movwf     TH                    ;Старший байт температуры
		 call      NewCRC
		 movlw     0FFh                  ;Шесть ненужных байт
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 call      NewCRC
		 movlw     0FFh
		 call      RW_1Wire
		 xorwf     CRCPIC,W              ;Проверка совпадения CRC
		 jz        OKCRC_label           ;Совпадение - переход
		 decfsz    TRY,F
		 goto	   Newtry_label          ;Несовпадение - следующая попытка
		 goto      Begin                 ;Попытки исчерпаны
OKCRC_label	 clrwdt
		 rrf	   TH,F
		 rrf	   TL,F
		 rrf	   TH,F
		 rrf	   TL,F
		 rrf	   TH,F
		 rrf	   TL,F			; 64 | 32 | 16 | 8 || 4 | 2 | 1 | 0.5
Tshow_label	 bcf	  STATUS,C
		 rrf	  TL,W		 ;W = <0> | 64 | 32 | 16 || 8 | 4 | 2 | 1
		 movwf	  TEMP21
		 movwf	  TEMP21; na indikator T    
     rrf      TEMP21,F
      rrf      TEMP21,F    
     rrf      TEMP21,F  ;po 8 !   !256! 128 ! 64 ! 32 ! 16 ! 8 !    
Finish_label
;	 		 goto      Online_label
;----------------------
    bsf         Status,5    ; "Двойная" "штатная"  команда установки 
            bcf         Status,6    ; 1-го банка.

            movlw        .128
            movwf       OPTIONR
            bcf         Status,5    ; Установка 0-го банка (далее, при переключениях между
;            movlw       .06;.07         ; Отключение компараторов.
;            movwf       ADCON1;CMCON       ; --------"--------
            clrf        RCSTA       ; Отключение USART.
            clrf        T1CON       ; ----"----  TMR1.
            clrf        T2CON       ; ----"----  TMR2.
            clrf        CCP1CON     ; ----"------CCP1CON
;||||||||||||||||||||||||||||||||||||||||||||||||
	goto	METKA_1
;-----------------------------------------------------------------------------------------------------
; ПП чтения из ЕЕРROM 
;-----------------------------------------------------------------------------------------------------

asdf
;            bcf         Status,RP0
        bsf         Status,RP1    ; Переход в 0 банк
            movwf       EEAdr       ; Скопировать 00h, из регистра W, в регистр EEAdr
;            bsf         Status,RP1
            bsf         Status,RP0
            bcf         EECon1,EEPGD;0    ; Инициализировать чтение
            bsf         EECon1,RD
            bcf         Status,RP0
            movf        EEData,W    ; Скопировать число из EEPROM, с адресом 00h, в регистр W
            bcf         Status,RP1    ; Переход в 0 банк
	        return
;-----------------------------------------------------------------------
METKA_1     movlw       0           ;
            call        asdf        ; 
            movwf       Udn1M       ; в регистр Udn1M
;------------------------------------------------------------------------
METKA_2     movlw       1           ;
            call        asdf        ; Udn1L
            movwf       Uup1L       ; в регистр Uup1L
;------------------------------------------------------------------------
METKA_3     movlw       2           ;
            call        asdf        ; Udn1L  
            movwf       Udn1L       ; в регистр 
;------------------------------------------------------------------------
METKA_4     movlw       3           ;
            call        asdf        ; Udn2M  
            movwf       Udn2M       ; в регистр
;------------------------------------------------------------------------
METKA_5     movlw       4           ;
            call        asdf        ; Udn1L 
            movwf       Uup2L       ; в регистр Uup1L
 ;-----------------------------------------------------------------------
METKA_6     movlw       5           ;
            call        asdf        ; 
            movwf       Udn2L       ; в регистр Udn1M
;------------------------------------------------------------------------
METKA_7     movlw       6           ;
            call        asdf        ; 
            movwf       setup       ; в регистр Udn1M 
;------------------------------------------------------------------------
METKA_8     movlw       7           ;
            call        asdf        ; 
            movwf       Uup1M       ; в регистр Udn1M 
;-----------------------------------------------------------------------
METKA_9     movlw       8           ;
            call        asdf        ; 
            movwf       Uup2M       ; в регистр Udn1M 
;-----------------------------------------------------------------------
METKA_10    movlw       9           ;
            call        asdf        ; 
            movwf       rezervuarL  ; в регистр Udn1M
;-----------------------------------------------------------------------
METKA_11    movlw       .10         ;
            call        asdf        ; 
            movwf       rezervuarM  ; в регистр Udn1M
;----------------------------------------------------------------------------------------------------------
            clrwdt                  ; сброс wdt
            bsf         Status,5    ; Установка банка 1.
            bcf         Status,6    ; Установка банка 1
            movlw    B'00000000'
            movwf        TrisA       ; (00000000) все на выход порта А 
            clrf        TrisB       ; (00000000) все на выход порта В
            bcf         Status,5    ; Установка банка 0.
            clrf        PortA       ; На всех выводах порта А нули
            clrf        PortB       ; На всех выводах порта В нули
            movlw       .45         ; количество проходов до загорание светод. потеря эхо сигнала
            movwf       Sensor      ; *********************************************
            movlw       .5          ; количество проходов до входа в ПП OPRO_obhod
            movwf       ABD         ; *********************************************
            movlw       .6          ; количество проходов до высвечивании надписи "no SEnSor"
            movwf       Sensor1     ; *********************************************
            movlw       .10         ; количество полных циклов программы после
                                    ; которых в случаи нажатия кнопки СБРОС программа 
            movwf       ABC         ; попадет на самое начало исполнения программы
povtor      bcf         Flag,1      ; ----------------------------------------------------
            bcf         Flag,4      ;
            bcf         Flag,5      ; подготовка новых 3 замеров 
            bcf         Flag,6      ;
            bcf         Flag,7      ;
            clrf        nakopitL    ;
            clrf        nakopitM    ; -----------------------------------------------------
	clrf	Flag1
            clrwdt                  ; сброс wdt
;****************************** РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ ****************************************
;***********************************************************************************************
;                      ПП опроса клавиатуры
;-----------------------------------------------------------------------------------------------
OPROS

            btfss       PortC,0;C,2;B,1     ; Проверка нажатия кнопки КН1(RB1)
            goto        OPROS_K     ; кнопка нажата Переход в ПП OPROS_K
START11     movlw       .5          ; кнопка не нажата загрузка константы 5 в
            movwf       ABD         ; регистр ABD (количество проходов до входа в ПП OPRO_obhod)
START12     clrf        IntCon      ; Глобальный запрет
            bsf         Status,5    ; Установить банк 1.
            movlw       .175        ; (10101111) wdt128,передний фронт TMR0, внешний тактовый
            movwf       OptionR     ; сигнал TMR0, прерыван. зад. фронт INT,подтяг. резист. выключ.  
            movlw       b'01000001';!!!;'01000001' ; RB0,6 работает на вход,
On_TMRO     movwf       TrisB       ; остальные - на выход.
            bcf         Status,5    ; Перейти в 0-й банк (установить в 0 5-й бит)
            clrwdt                  ; очистить wdt
;---------------------------------------------------------------------------------------------
; Запись константы времени работы таймера.
;---------------------------------------------------------------------------------------------
            movlw       .4          ; Запись в регистр SecM
            movwf       SecM        ; константы .16 
;---------------------------------------------------------------------------------------------
            clrf        TimerM      ; Сброс в 0 содержимого регистра TimerM.
            clrf        TimerH      ; Сброс в 0 содержимого регистра TimerH.
            clrf        TMR1L       ; очистить TMR1L
            clrf        TMR1H       ; очистить TMR1H начало отсчета TMR1 с нуля
            movlw       .1          ; (00001101)TMR1-включен, внутр. источ. Fosc/4,
            movwf       T1CON       ;  (пошел счет TMR1)
;---------------------------------------------------------------------------------------------
; Формирование времени отрицательного полупериода для PortB,3 .
;---------------------------------------------------------------------------------------------
PERIUD_1    bcf         PortB,3     ; Начало формирования отрицательного полупериода.
            nop                     ; Пустые машинные циклы точной калибровки
            movlw       .3          ; Запись в регистр Sec 
            movwf       SecL        ; константы .3
PAUSE_1     decfsz      SecL,F      ; отсчет интервала времени
            goto        PAUSE_1     ; отрицательного полупериода.
;--------------------------------------------------------------------------------------------
; Формирование времени положительного полупериода для PortB,3.
;--------------------------------------------------------------------------------------------                      
            bsf         PortB,3     ; Начало формирования положительного полупериода.
            nop                     ; Пустые машинные циклы точной калибровки
            nop                     ; Пустые машинные циклы точной калибровки
            movlw       .2          ; Запись в регистр Sec 
            movwf       SecL        ; константы .2
PAUSE_2     decfsz      SecL,F      ; отсчет интервала
            goto        PAUSE_2     ; положительного полупериода.
;--------------------------------------------------------------------------------------------
;                      Работа таймера 
;--------------------------------------------------------------------------------------------  
            decfsz      SecM,F      ; отсчет интервала времени
            goto        PERIUD_1    ; Перейти в PERIUD_1 
;--------------------------------------------------------------------------------------------
;  ПП Время ожидания разрешения прерывания
;--------------------------------------------------------------------------------------------
            movlw       .246        ; 146-------------------------------------------------------
            movwf       SecL        ;
            movlw       .3          ; Время ожидания до момента разрешения входа в прерывания 
            movwf       SecM        ;                  от 40 см
            movlw       .1          ;
            movwf       SecH        ; -------------------------------------------------------
            call        Vremy       ; Перейти в Vremy (ПП задержки)
;--------------------------------------------------------------------------------------------
;  ПП Период разрешения прерывания
;--------------------------------------------------------------------------------------------
            movlw       .208        ; (11010000) Прерыван.INT разрешены,от периферийн. модулей  
            movwf       IntCon      ; прерыв. разреш., Глобально разрешены
;--------------------------------------------------------------------------------------------
            movlw       .84         ; 34 -------------------------------------------------------
            movwf       SecL        ;
            movlw       .55         ; 25 Время разрешения прерывания от 40-750см
            movwf       SecM        ; 
            movlw       .1          ;
            movwf       SecH        ; -------------------------------------------------------
            call        Vremy       ; Перейти в Vremy (ПП задержки)
;--------------------------------------------------------------------------------------------
;  ПП Запрет всех прерываний
;--------------------------------------------------------------------------------------------
            nop		;
            clrf        IntCon      ; запрет всех прерываний
	btfss	Flag1,0	; проверка был заход в прерывания или нет
	goto	lllp	; захода не было
	bcf	T1CON,0	; заход был, остановка счета TMR1 (количество отраженных эхо сигналов
            movf        TMR1L,W     ; запись содержимого регистра TMR1L в W
	bsf	Status,0	; флаг С в единицу
	sublw	.15	; 15 - содержимое W
	btfss	Status,0	; проверка флага С
	goto	limit 	; флаг опустился переход в limit
lllp
           movf        Memory,W    ; запись содержимого регистра Memory в W 
            bcf         Status,2    ; Сброс флага Z
            sublw       .1          ; 1-Memory=(если програм. попадала в прерывания то результ.=0)
            btfss       Status,2    ; Результат операции вычитания равен или нет нулю?
            goto        NO_SENSOR   ; не была в прерывании Переход в NO_SENSOR
            movlw       .6          ; была, запись 6 в Sensor1(количество проход при непоподании в 
            movwf       Sensor1     ; прерывания до написания надписи NO_SENSOR)
            btfss       Flag,1      ; проверка бита 1 
            goto        BBin2_10    ; если =0 переход BBin2_10
            movf        TTL,W       ; -----------------------------------------------------
            movwf       TimerL      ; перезапись из TTL,TTМ в Timer
            movf        TTM,W       ;
            movwf       TimerM      ; ----------------------------------------------------
BBin2_10    call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            clrf        d4          ; символ "пусто"
Pamyat
          call        screen      ; ПП вывод на индикацию;!!!!!!!!!!!!!!!!
Zadergka
              call     GoIn
          call      GoA;Ind;A
LEM            clrf        Memory      ; очистка Memory
	bcf	Flag1,0	; опустить флаг входа в прерывания
;----------------------------------------------------------------------------------------------
;  ПП Сброса 
;----------------------------------------------------------------------------------------------
Pamyat1       btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2(RB2)
            goto        sbros       ; кнопка нажата Переход в ПП sbros 
            movlw       .10         ; запись 10 в ABC(количество полных циклов программы после
            movwf       ABC         ; которых в случаи нажатия кнопки СБРОС программа попадет
                                    ; на самое начало исполнения программы
            goto        OPROS       ; переход на следующий виток программы       
;-------------------------------------------------------------------------------------------
; ПП обрыва земляного вывода датчика 
; при этом вкл светодиод PortB,4 и выкл каналов 1 и 2 (PortB,5 PortB,7), высвечивается 
; надпись "оbriv"
;------------------------------------------------------------------------------------------- 
limit
	bsf	PortB,6	; вкл светодиод "Авария"
	bcf	PortB,5	; откл 1 канал
;;;;;;	bcf	PortB,7	; откл 2 канал
	clrf	d0	; -----------------------------
	clrf	d1	;
	clrf	d7	; очистить d0,1,7-9
	clrf	d8	;
	clrf	d9	; -----------------------------
	movlw	.71	;
	movwf	d2	;
	movlw	.199	;
	movwf	d3	; Вывод надписи  на индикацию "  obriu   "
	movlw	.3	;
	movwf	d4	;
	movlw	.64	;
	movwf	d5	;
	movlw	.70	;
	movwf	d6	;
	    call	indic	;
   call        GoIn
      call  GoInd
            btfsc       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2(RB2)
            goto        $-1         ; кнопка нажата Переход в ПП sbros 
	call	Vremya	; 
            btfsc       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2(RB2)
            goto        $-4         ; кнопка нажата Переход в ПП sbros 
	goto	START	; переход на начало программы
;-------------------------------------------------------------------------------------------
screen      clrf        d0          ; символ "пусто"
            clrf        d5          ; символ "пусто"
            clrf        d9          ; символ "пусто"
;-------------------------------------------------------------------------------------------
;   ПП вывод на экран
;------------------------------------------------------------------------------------------
indic       movlw       0           ; загрузка 0 в W
            call        lcd_cw      ; инициализация дисплея
            movf        d0,W        ; ----------------------------------------------------
            call        lcd_dw      ; 
            movf        d1,W        ;
            call        lcd_dw      ; 
            movf        d2,W        ;
            call        lcd_dw      ;
            movf        d3,W        ;             регистры загрузки
            call        lcd_dw      ;
            movf        d4,W        ;
            call        lcd_dw      ;
            movf        d5,W        ;
            call        lcd_dw      ;         вывода данных на экран дисплея
            movf        d6,W        ;
            call        lcd_dw      ;
            movf        d7,W        ;
            call        lcd_dw      ;
            movf        d8,W        ;
            call        lcd_dw      ;
            movf        d9,W        ;
            call        lcd_dw      ; -----------------------------------------------------
            return                  ; выход из подпрограммы
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 4-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В 8-РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Подготовка к преобразованию.
;===============================================================================================
Bin2_10     bcf        Status,C     ; Сброс флага переноса-заема.
            movlw      .16          ; Зпись в регистр Count числа проходов преобразования,
            movwf      Count        ; равного суммарному количеству битов многоразрядного
                                    ; регистра TimerL/TimerM (8*2=16).
            clrf       LED0         ; Сброс в 0 содержимого регистра LED0.
            clrf       LED1         ; -------"------ LED1.
            clrf       LED2         ; -------"------ LED2.
;===============================================================================================
; Циклический сдвиг влево.
;===============================================================================================         
Loop16      rlf        TimerL,F     ; Циклический сдвиг влево 4-байтного двоичного числа,
            rlf        TimerM,F     ; записанного в группе регистров TimerL/TimerM/TimerH/TimerHH,
            rlf        LED0,F       ; Циклический сдвиг влево 4-байтного двоичного числа,
            rlf        LED1,F       ; записанного в группе регистров LED0/LED1/LED2/LED3,
            rlf        LED2,F       ; на одну позицию через бит С регистра STATUS.
            decfsz     Count,F      ; Декремент (-1) содержимого регистра Count с сохранением
                                    ; результата в нем же.
            goto       adjDEC       ; Если результат не=0, то переход в ПП adjDEC
                                    ; Если  результат =0, то программа исполняется далее.
;===============================================================================================
; Поразрядное распределение содержимого регистров LED0...3 (обоих
; полубайтов) по младшим полубайтам регистров LED0...7.
;===============================================================================================
            swapf      LED1,W       ; Запись старшего полубайта LED1
            andlw      0Fh          ; в младший полубайт LED3.
            movwf      LED2         ; --------------------------------
            movfw      LED1         ; Запись младшего полубайта LED1
            andlw      0Fh          ; в младший полубайт LED2.
            movwf      LED2         ; --------------------------------

            swapf      LED0,W       ; Запись старшего полубайта LED0
            andlw      0Fh          ; в младший полубайт LED1.
            movwf      LED1         ; --------------------------------

            movfw      LED0         ; Запись младшего полубайта LED0
            andlw      0Fh          ; в младший полубайт LED0.
            movwf      LED0         ; --------------------------------
;--------------------------------------------------------------------
; Конец распределения. В младших полубайтах регистров LED0...7 установлены
; двоично-десятичные числа в порядке возрастания разрядности. Старшие полубайты = 0.
;--------------------------------------------------------------------
           return                   ; Переход по стеку в группу подпрограмм
;===============================================================================================
; Запись в регистр FSR адресов регистров LED0...3 для дальнейшей косвенной адресации
; к ним в ПП adjBCD.
; Переход к обработке следующего LED - после возврата по стеку.                      
;===============================================================================================
adjDEC      movlw      LED0         ; Запись в регистр FSR, через регистр W, адреса регистра LED0
            movwf      FSR          ; с дальнейшим переходом в ПП adjBCD
            call       adjBCD       ; (адрес следующей команды закладывается в стек).
;---> Возврат по стеку из ПП adjBCD.                                  
            movlw      LED1         ; -----------------------------
            movwf      FSR          ; То же самое для регистра LED1.
            call       adjBCD       ; -----------------------------
;---> Возврат по стеку из ПП adjBCD.
            goto       Loop16
;===============================================================================================
; Основные операции преобразования двоичных чисел в двоично-десятичные:
; операции сложения LED0...3 и констант 03h,30h с условиями по 3-му и 7-му битам.
;===============================================================================================
adjBCD      movlw      3            ; Сложить содержимое текущего LED (LED0...3) с числом 03h,  
            addwf      0,W          ; c записью результата операции, через регистр W,
            movwf      Mem          ; в регистр Mem.
            btfsc      Mem,3        ; Анализ состояния 3-го бита регистра Mem.
            movwf      0            ; Если бит № 3 =1, то содержимое регистра Mem 
                                    ; копируется в текущий LED.
            movlw      30           ; Если бит №3 =0, то содержимое текущего LED складывается
            addwf      0,W          ; с константой 30h, с последующей записью результата операции,  
            movwf      Mem          ; через регистр W, в регистр Mem.
            btfsc      Mem,7        ; Анализ состояния 7-го бита регистра Mem.
            movwf      0            ; Если бит №7 =1, то содержимое регистра Mem 
                                    ; копируется в текущий LED.
            retlw      0            ; Если бит №7 =0, то регистр W очищается и происходит
                                    ; возврат по стеку в ПП adjDEC.
;--------------------------------------------------------------------------------
;  ПП Время задержки
;--------------------------------------------------------------------------------
Vremya      movlw       .205        ; Запись константы .205 в регистр W
            movwf       SecL        ; Скопировать содержимое регистра W в регистор SecL
            movlw       .195        ; Запись константы .195 в регистр W
            movwf       SecM        ; Скопировать содержимое регистра W в регистор SecM
            movlw       .1          ; Запись константы .1 в регистр W
            movwf       SecH        ; Скопировать содержимое регистра W в регистор SecH
Vremy       clrf        Tmr0        ; Очистка счетчика Tmr0
            decfsz      SecL,F      ; Уменьшить содержимое регистра SecL на 1
            goto        $-1         ; 
            decfsz      SecM,F      ; Уменьшить содержимое регистра SecM на 1
            goto        $-3         ; 
            decfsz      SecH,F      ; Уменьшить содержимое регистра SecH на 1
            goto        $-5         ; 
            clrwdt
            return                  ; Выход по стеку
;--------------------------------------------------------------------------------
;  ПП записи в EEPROM
;--------------------------------------------------------------------------------
zapis 
            bsf         Status,RP1
            movwf       EEData      ; Скопировать число, из регистра W, в ячейку с адресом 01h.
            bsf         Status,RP0    ; Установить банк 1.
;            bsf         Status,RP1
            btfsc       EECon1,WR
            goto        $-1
            bsf         EECon1,2    ; Разрешить запись.
            bcf         Status,RP0    ; Установить банк 0.
            bcf         Status,RP1
            bcf         PIR2,4;1,7      ; Опустить флаг записи в eeprom
            bsf         Status,RP0    ; Установить банк 1.
            bsf         Status,RP1
            bcf        EECon1,EEPGD
            bsf        EECon1,WREN
            bcf        INTCON,GIE

            movlw       055h        ; Обязательная
            movwf       EECon2      ; процедура
            movlw       0AAh        ; при записи.
            movwf       EECon2      ; ----"----
            bsf        EECon1,WR
            bsf        INTCON,GIE
            bcf        EECon1,WREN
            bcf         Status,RP0    ; Установить банк 0.
            bcf         Status,RP1
wr1         btfss       PIR2,4      ; Проверить флаг записи в eeprom
            goto        wr1         ; Переход в wr1
            return                  ; Выход по стеку
;---------------------------------------------------------------
;  ПП управления ЖКИ   запись данных ЖКИ
;---------------------------------------------------------------
lcd_dw      movwf       Temp        ; Загрузка данных для последующего вывода на дисплей 
            movf        Temp,W      ; Так как передача ведется полубайтно (4 бита), то сначало
            andlw       0x0F        ; передается 4 младших бита RA0-3 
            movwf       PortA       ; Data
            bsf         PortB,2;tC,1;6     ; (AO) Формирования тактовых импульсов
            bsf         PortB,1;C,0;7     ; (WR1)
            bcf         PortB,1;C,0;7     ;-----------------------------------------------------
            swapf       Temp,W      ; Загрузка старшего полубайта на выводах RA0-3
            andlw       0x0F        ;
            movwf       PortA       ;-----------------------------------------------------
            bsf         PortB,2;C,1;6     ;  Формирования тактовых импульсов
            bsf         PortB,1;C,0;7     ;
            bcf         PortB,1;C,0;7     ;-----------------------------------------------------
            return
;---------------------------------------------------------------
; ПП управления ЖКИ   запись адреса ЖКИ
;---------------------------------------------------------------
lcd_cw      movwf       Temp        ; Загрузка адреса для последующего вывода на дисплей 
            movf        Temp,W      ; Так как передача ведется полубайтно (4 бита), то сначало
            andlw       0x0F        ; передается 4 младших бита RA0-3
            movwf       PortA       ; Data 
            bcf         PortB,2;C,1;6     ; (A0) Формирования тактовых импульсов
            bsf         PortB,1;C,0;7     ; (WR1)
            bcf         PortB,1;C,0;7     ;-----------------------------------------------------
            swapf       Temp,W      ; Загрузка старшего полубайта на выводах RA0-3
            andlw       0x0F        ;
            movwf       PortA       ;-----------------------------------------------------
            bcf         PortB,2;C,1;6     ; 
            bsf         PortB,1;C,0;7     ; Формирования тактовых импульсов
            bcf         PortB,1;C,0;7     ;
            bsf         PortB,2;C,1;6     ;-----------------------------------------------------
            return
;--------------------------------------------------------------------------------
;  ПП Поднятие уровня на PortB,5
;--------------------------------------------------------------------------------
vkl1        btfsc	setup,1     ; работа на закачку или откачку
	goto	zzz0	; режим закачка
zzz1	bsf         PortB,5     ; Поднятие в 1 уровень на порте B бит 5
            movlw       60h         ; вывод на индикацию в d1 символa 1
            movwf       d1          ; ----------------------------------------
            return   
;--------------------------------------------------------------------------------
;  ПП Отключение уровня на PortB,5
;--------------------------------------------------------------------------------
otkl1	btfsc	setup,1	; работа на закачку или откачку
	goto	zzz1	; режим закачка
zzz0	bcf         PortB,5     ;  в 0 уровень на порте B бит 5
            clrf        d1          ; ----------------------------------------
            return 
;--------------------------------------------------------------------------------
;  ПП Поднятие 2 уровня на PortB,7
;--------------------------------------------------------------------------------
vkl2        btfsc	setup,1	; работа на закачку или откачку
	goto	zzz2	; режим закачка	
zzz3
     	bsf         PortB,4     ; ***************************************
            clrf        d2          ; вывод на индикацию пустых символов в d2 
            movlw       2Fh         ; появления 2 на индикаторе (d3)
            movwf       d3          ; ***************************************
            return   
;--------------------------------------------------------------------------------
;  ПП Отключение 2 уровня на PortB,7
;--------------------------------------------------------------------------------
otkl2       btfsc	setup,1	; работа на закачку или откачку
	goto	zzz3	; режим закачка
zzz2
    	bcf         PortB,4     ;  в 0 уровень на порте B бит 7
            clrf        d2          ; вывод на индикацию пустых символов в
            clrf        d3          ; регистры d2-d3
            return
;--------------------------------------------------------------------------------
;  ПП Записи на индикаторе надписи "no SEnSor'
;--------------------------------------------------------------------------------
NO_SENSOR   movf        d1,W        ; ***************************************
            movwf       temd1       ;
            movf        d2,W        ;
            movwf       temd2       ;
            movf        d3,W        ; Сохранение регистров d1-d8 в регистрах 
            movwf       temd3       ;              temd1-temd8
            movf        d4,W        ; это нужно для того чтобы в случае вывода 
            movwf       temd4       ; на индикатор надписи " no SEnSor "
            movf        d5,W        ; содержимое регистров d1-d8 небыло утерено
            movwf       temd5       ;
            movf        d6,W        ;
            movwf       temd6       ;
            movf        d7,W        ;
            movwf       temd7       ;
            movf        d8,W        ;
            movwf       temd8       ; ****************************************
            bcf         Status,Z    ;  Надпись "no SEnSor" будет отабражена 
            decf        Sensor1,F   ; после обнуления регистра Sensor1 в противном
            btfss       Status,Z    ; случае переход в Pamyat
            goto        Pamyat      ;
            movlw       43h         ; ****************************************
            movwf       d1          ;
            movwf       d6          ; 
            movlw       47h         ;   Вывод на индикация надписи
            movwf       d2          ;
            movwf       d8          ;       " no SEnSor "
            movlw       .0          ;
            movwf       d3          ;
            movlw       0CDh        ;
            movwf       d4          ;
            movwf       d7          ;
            movlw       8Fh         ;
            movwf       d5          ;
            movlw       03h         ;
            movwf       d9          ;*****************************************
            decfsz      Sensor,F    ; Загорание светодиода (потеря эхо сигнала)
            goto        $+2         ; после обнуления регистра Sensor1, в противном
            bsf         PortB,6     ; случае переход в indic с последующим 
            call        indic       ;     востоновлением d1-d8
   call        GoIn
            call        GoInd
obh_svetdio movf        temd1,W     ;*******************************************
            movwf       d1          ;
            movf        temd2,W     ; 
            movwf       d2          ; Востановление регистров d1-d8 после 
            movf        temd3,W     ;     вывода на индикацию надписи 
            movwf       d3          ;           " no SEnSor "
            movf        temd6,W     ;
            movwf       d6          ;
            movf        temd4,W     ; 
            movwf       d4          ;
            movf        temd5,W     ;
            movwf       d5          ;
            movf        temd7,W     ;
            movwf       d7          ;
            movf        temd8,W     ;
            movwf       d8          ;********************************************
            movlw       .6          ; Запись 6-ки в регистр Sensor1 (количество 
            movwf       Sensor1     ; проходов до написания надписи " no SEnSor "
            goto        Zadergka    ;
;--------------------------------------------------------------------------------
; ПП сброса показаний и переход в начало " START "
;---------------------------------------------------------------------------------
sbros       movlw       .221        ; ***************************************
            movwf       SecL        ; 
            movlw       .130        ; Противодребезговая защита для устранения
            movwf       SecM        ;
            movlw       .1          ; ложных срабатывания после нажатия "Сброса"
            movwf       SecH        ; 
            call        Vremy       ; *****************************************
            btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки сброса  
            decfsz      ABC,F       ; сброс осуществлялся после 5-секундного нажатия
            goto        OPROS       ; на кнопку " Сброс "
            goto        START
;*********************************************************************************
;******************** ПП управления клавиатурой **********************************
;*********************************************************************************
OPROS_K     swapf       d1,W        ; --------------------------------------------
            movwf       TempD1      ;
            swapf       d3,W        ; Сохранение регистров d1,3 в регистрах
            movwf       TempD3      ;             TempD1,3
			; ------------------------------------------
            movlw       .85         ; Записать в W .85
            movwf       SecL        ; Запись в регистр W содержимое регистра OprL
            movlw       .138        ; Записать в W .138
            movwf       SecM        ; Запись в регистр W содержимое регистра OprM
            movlw       .3          ; Записать в W .3
            movwf       SecH        ; Запись в регистр W содержимое регистра OprH
            call        Vremy       ; Переход в ПП Vremya с записью в стек
            clrwdt                  ; очистить wdt
            movf        PortB,W     ; загрузка содержимого порта В в W
            andlw       .2          ; Проверка состояния порта RB1
            movwf       EEE         ; C записью в регистр ЕЕЕ
            incf        EEE,F       ; увеличение на один регистра ЕЕЕ
            decf        EEE,F       ; уменшения на один регистра ЕЕЕ
            btfss       Status,Z    ; проверка состояния флага Z
            goto        START11     ; если не поднялся то переход START11
            decfsz      ABD,F       ; если поднялся то уменьшение ABD с проверкой нуля
            goto        START12     ; если не 0 переход в START12
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
kol_imp     bsf         Status,5    ; Установить банк 1.
            clrf        PIE1	; очистка PIE1
            movlw       .237        ; 227  длительность импульса
            movwf       PR2	;
            movlw       .128        ; (10000000) 
            movwf       OptionR     ; подтяг. резист. выключ. 
          movlw       b'01000001';!!!'01000111';.71     ; RB0-2,6 работают на вход,
            movwf       TrisB       ; остальные - на выход. 
            bcf         Status,5    ; Перейти в 0-й банк (установить в 0 5-й бит)
            movlw       .64	;
            movwf       IntCon	;
;---------------------------------------------------------------------------------------------
; Запись константы времени работы таймера.
;---------------------------------------------------------------------------------------------
            movlw       .4          ; Запись в регистр SecM
            movwf       SecM        ; константы .16 
;---------------------------------------------------------------------------------------------
; Формирование времени отрицательного полупериода для PortB,3 .
;---------------------------------------------------------------------------------------------
            bcf         PortB,3     ; Начало формирования отрицательного полупериода.
            nop                     ; Пустые машинные циклы точной калибровки
            movlw       .3          ; Запись в регистр Sec 
            movwf       SecL        ; константы .3
	decfsz      SecL,F      ; отсчет интервала времени
            goto        $-1         ; отрицательного полупериода.
;--------------------------------------------------------------------------------------------
; Формирование времени положительного полупериода для PortB,3.
;--------------------------------------------------------------------------------------------                      
            bsf         PortB,3     ; Начало формирования положительного полупериода.
            nop                     ; Пустые машинные циклы точной калибровки
            nop                     ; Пустые машинные циклы точной калибровки
            movlw       .2          ; Запись в регистр Sec 
            movwf       SecL        ; константы .2
            decfsz      SecL,F      ; отсчет интервала
            goto        $-1         ; положительного полупериода.
;--------------------------------------------------------------------------------------------
;                      Работа таймера 
;--------------------------------------------------------------------------------------------  
            decfsz      SecM,F      ; отсчет интервала времени
            goto        $-.14       ; Перейти в PERIUD_1 
;--------------------------------------------------------------------------------------------
;  ПП Время ожидания разрешения прерывания
;--------------------------------------------------------------------------------------------
            movlw       .246        ; 146-------------------------------------------------------
            movwf       SecL        ;
            movlw       .3          ; Время ожидания до момента разрешения входа в прерывания 
            movwf       SecM        ;                  от 40 см
            movlw       .1          ;
            movwf       SecH        ; -------------------------------------------------------
            call        Vremy       ; Перейти в Vremy1 (ПП задержки)
;--------------------------------------------------------------------------------------------
            movlw       .86         ; (1<<TMR2ON)
            movwf       T2CON	; Запуск TMR2
;--------------------------------------------------------------------------------------------
            clrf        TMR2	; очистка TMR2
	clrf	TMR1H	; очистка TMR1H
	clrf	TMR1L	; очистка TMR1L
	clrf	TimerL	; очистка TimerL
	clrf	TimerM	; очистка TimerM
	movlw	.7          ; 7 в W 
	movwf	T1CON 	; запуск TMR1, внешний счет
            clrwdt		;
	btfss	PIR1,1	; проверка флага прерывания по переполнения TMR2
 	goto	$-2	;
	movf	TMR1L,W	; перезапись TMR1L в TimerL
	movwf	TimerL	;
	movf	TMR1H,W	; перезапись TMR1Н в TimerМ
	movwf	TimerM	; 
	bcf	PIR1,1	; опустить флаг прерывания по переполнения TMR2
	clrf	T1CON	; остановка счета TMR1
	clrf	T2CON	; остановка счета TMR2
	call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
	btfsc	PortC,1;3;B,2 	; Проверка нажатия кнопки "Сброс" КН2
	goto	kol	; нажатие не было 
            call        Vremya      ; Переход в ПП Vremya Противодребезговая задержка
	btfsc	PortC,1;3;B,2	; Проверка нажатия кнопки "Сброс" КН2
	goto	kol	; нажатие не было
 	goto	yyyy0	; выход в основной режим работы
kol	btfsc	PortC,0;2;B,1	; Проверка нажатия кнопки "Парамеры" КН1
	goto	kol_imp	; нажатие не было	
	call	Vremya	; Переход в ПП Vremya Противодребезговая задержка
	btfsc	PortC,0;2;B,1	; Проверка нажатия кнопки "Парамеры" КН1
	goto	kol_imp	; переход в kol_imp
;*********************************************************************************
;  ПП управления клавиатурой растояния датчик-вода\дно-вода
;*********************************************************************************
OPRO_obhod ; bsf         Status,5    ; установить 1 банк
  	movlw       .50         ; Загрузка константы 50 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 8с
            movlw       .205        ; -----------------------------------------------------
            movwf       d1          ;
            movlw       .143        ;
            movwf       d2          ;
            movlw       .135        ; Вывод надписи SEt
            movwf       d3          ;
            clrf        d4          ; -----------------------------------------------------
            clrf        d6          ; очистить d6
            clrf        d7          ; очистить d7
            btfss       setup,0     ; проверить бит №0
            goto        aaa3        ; если 0 Переход на aaa3
            movlw       60h         ; если 1 записать константу .96 в W
aaa4        movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call        GoInd8
KLAVA_obhod btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2
            goto        obhod_plus  ; Кнопка нажата. Переход в obhod_plus
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        obhod_minus ; Кнопка нажата. Переход в obhod_minus
            call        Vremya      ; Переход в ПП Vremya
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_obhod ; Переход в ПП KLAVA_obhod
            bcf         IntCon,7    ; Глобальный запрет прерываний.
            bsf         Status,RP1    ; Установить банк 1.
            movlw       6           ; Записать, в регистр W, константу 06h.
            movwf       EEAdr       ; Скопировать константу 06h, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        setup,W     ; Скопировать число, из регистра setup, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
            btfss       setup,0     ; Проверить бит № 0 в регистре setup
            goto        OPRO_NIZ1   ; если 0 переход ПП OPRO_NIZ1
            goto        OPRO_REZERV ; если 1 переход ПП OPRO_REZERV
;--------------------------------------------------------------------------------------------
aaa3        movlw       0EEh        ; записать константу .238 в W 
            goto        aaa4        ; Переход на aaa4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;=============================================
Pausbig
        movlw  .100;.255
        movwf   Counto
Pause15
        movlw   .255
        movwf   Tempo
Pause14
        movlw    .10
        movwf    Tempo1
Pause16
        decfsz   Tempo1,1
        goto    Pause16
        decfsz  Tempo,1
        goto    Pause14
        decfsz  Counto,1
        goto    Pause15
        return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoIn        call    Pausem
       movlw   b'00000010'    ;Инициализация ЖКИ
        call    LEDcom
;        call    Pausem
        movlw   b'00101000'
        call    LEDcom
        call    Pausem
        movlw   b'00001100'
        call    LEDcom
        call    Pausem
       movlw    .1
        call    LEDcom
        call    Pausem
;=======================================================
        movlw   b'10000000'     ;Вывод на экран надписи
        call    LEDcom          ;"oвruv-датчик"
        movlw   -10h;7Bh    ;1
        call    LEDdata
        call    LEDdata
        return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd5       movlw   25h;7Bh    ;UP2
        call    LEDdata
       movlw   20h;7Bh    ;1
        call    LEDdata
       movlw   .2;7Bh    ;1
        call    LEDdata
        movlw   -10h;7Bh    ;1
        call    LEDdata
;        movlw   -10h;7Bh    ;1
;        call    LEDdata
        goto    Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd4       movlw   14h;7Bh    ;DN2
        call    LEDdata
       movlw   1Eh;7Bh    ;1
        call    LEDdata
       movlw   .2;7Bh    ;1
        call    LEDdata
        movlw   -10h;7Bh    ;1
        call    LEDdata
        return;goto    Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd8       movlw   23h;7Bh    ;SET0
        call    LEDdata
       movlw   15h;7Bh    ;1
        call    LEDdata
       movlw   24h;7Bh    ;1
        call    LEDdata
        movlw   .0;7Bh    ;1
        call    LEDdata
        goto    Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd9       movlw   23h;7Bh    ;SET1
        call    LEDdata
       movlw   15h;7Bh    ;1
        call    LEDdata
       movlw   24h;7Bh    ;1
        call    LEDdata
        movlw   .1;7Bh    ;1
        call    LEDdata
        goto    Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd3       movlw   25h;7Bh    ;UP1
        call    LEDdata
       movlw   20h;7Bh    ;1
        call    LEDdata
       movlw   .1;7Bh    ;1
        call    LEDdata
        movlw   -10h;7Bh    ;1
        call    LEDdata
        return;goto    Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd2       movlw   14h;7Bh    ; DN1
        call    LEDdata
       movlw   1Eh;7Bh    ;1
        call    LEDdata
       movlw   .1;7Bh    ;1
        call    LEDdata
        movlw   -10h;7Bh    ;1
        call    LEDdata
        goto     Pam1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GoInd1       movlw   70h;7Bh    ;
        call    LEDdata
       movlw   11h;7Bh    ; BAK
        call    LEDdata
       movlw   1Bh;7Bh    ;
        call    LEDdata
;        call    LEDdata
        movlw   -10h;7Bh    ;
        call    LEDdata
          goto    Pam1
GoInd        movlw   1Fh;7Bh    ; OBRUV
        call    LEDdata
        movlw   70h;7Bh    ;1
        call    LEDdata
        movlw   20h;7Bh    ;1
        call    LEDdata
        movlw   7Eh;7Bh    ;1
        call    LEDdata
        movlw   12h;7Bh    ;1
        call    LEDdata
Pam1
        movlw   -10h;7Bh    ;1
        call    LEDdata
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
;        movlw   -10h;7Bh    ;9
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
;        movlw   -10h;7Bh    ;1
        call    LEDdata
        goto    GoIn1
GoA        movlw   79h;0B0h
        call    LEDdata
        movlw   20h;19h    ;15
       call    LEDdata
        movlw   1Fh;80h    ;76
        call    LEDdata
        movlw   12h;7Bh    ;13
        call    LEDdata
        movlw   15h;11h    ;24
        call    LEDdata
        movlw   18h;1Fh80h    ;76
        call    LEDdata
        movlw   7Dh;12h;7Bh    ;13
        call    LEDdata
        movlw   2Fh;-1Dh;15h;11h    ;24
        call    LEDdata
     btfsc    setup,0
       goto     dno
        movlw   0B0h
        call    LEDdata
        movlw   11h;18h             
        call    LEDdata
        movlw   24h;11h
        call    LEDdata
        movlw   7Bh;20h
        call    LEDdata
        movlw   75h
        call    LEDdata
        movlw   1Bh;20h
        call    LEDdata
        movlw   -10h
        call    LEDdata
GoIn1
dno1   movlw    b'11000011'
        call    LEDcom
ro        movlw   3Fh
        btfsc	setup,1
        movlw   87h
        call    LEDdata
       movlw   -10h        
        call    LEDdata 
        btfsc    PortB,5
        movlw    .1
        call    LEDdata
        movlw    -10h
        call    LEDdata
;         nop
        call    LEDdata
        btfsc    PortB,4
        movlw    .2
        call    LEDdata
        movlw    -10h
        call    LEDdata
;        nop
        call    LEDdata
;        nop
        call    LEDdata
        movf   LED2,w
        call   LEDdata
        movf   LED1,w
        call   LEDdata
        movf   LED0,w
        call    LEDdata
        movlw   -10h
        call    LEDdata
        call   Pausbig        
        return
dno
       movlw   2Fh  ;                   Вывод на экран надписи
        call    LEDdata        ;        __дно
       movlw   2Fh  ;
        call    LEDdata        ;
        movlw   0B0h
        call    LEDdata
        movlw   18h;19h    ;15
       call    LEDdata
        movlw   1Fh;80h    ;76
        call    LEDdata
        movlw   -10h;7Bh    ;13
        call    LEDdata
;        movlw   -10h;7Bh    ;13
        call    LEDdata
        goto   dno1
;=========================================
;;=============================================
;--------------------------------------------------------------------------------------------
;     Организация задержки и запись в EEPROM выбора глубина/растояния датчик-вода минус
;--------------------------------------------------------------------------------------------
obhod_minus call        Vremya      ; Переход в ПП Vremya с записью в стек   
            decf  setup,1;
            bcf  setup,0     ; Установить бит № 0 в 0 (установка растояния датчик-вода)
            movlw       0EEh        ; записать константу .238 в W 
            movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call        GoInd8
            goto        KLAVA_obhod ; Переход в ПП KLAVA_obhod
;--------------------------------------------------------------------------------------------
;     Организация задержки и запись в EEPROM выбора глубина/растояния датчик-вода плюс
;--------------------------------------------------------------------------------------------
obhod_plus  call        Vremya      ; Переход в ПП Vremya с записью в стек   
            bsf   setup,0;bsf  setup,0     ; Установить бит № 0 в 1 (установка растояния дно-вода) 
            movlw       60h         ; записать константу .96 в W 
            movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call       GoInd9
            goto        KLAVA_obhod ; Переход в ПП KLAVA_obhod
;*********************************************************************************
;  ПП управления клавиатурой глубина(дно-вода)объем резервуара
;*********************************************************************************
OPRO_REZERV movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 10с
            movlw       .134        ; -----------------------------------------------------
            movwf       d1          ;
            movlw       .143        ; Вывод надписи LEU
            movwf       d2          ;
            movlw       .230        ;
            movwf       d3          ; -----------------------------------------------------
            movf        rezervuarL,W; Запись в регистр W содержимое регистра rezervuarL
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        rezervuarM,W; Запись в регистр W содержимое регистра rezervuarM
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию 
   call        GoIn
            call        GoInd1 
KLAVA_rezer btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2 
            goto        rezerv_plus ; Кнопка нажата. Переход в rezerv_plus 
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        rezerv_min  ; Кнопка нажата. Переход в rezerv_min 
            call        Vremya      ; Переход в ПП Vremya 
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_rezer ; Переход в ПП KLAVA_rezer
            bcf         IntCon,7    ; если 1 глобальный запрет прерываний.
            bsf         Status,RP1    ; Установить банк 1.
            movlw       .9          ; Записать, в регистр W, константу 9.
            movwf       EEAdr       ; Скопировать константу .9, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        rezervuarL,W; Скопировать число, из регистра rezervuarL, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
            bsf         Status,RP1    ; Установить банк 1.
            movlw       .10         ; Записать, в регистр W, константу .10
            movwf       EEAdr       ; Скопировать константу .10, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        rezervuarM,W; Скопировать число, из регистра rezervuarM, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
            goto        OPRO_NIZ1   ; Переход в ПП OPRO_VER 
;--------------------------------------------------------------------------------------------  
;       Организация задержки и запись в EEPROM объема резервуара минус
;--------------------------------------------------------------------------------------------
rezerv_min  call        Vremya      ; Переход в ПП Vremya с записью в стек
            movlw       .1          ; Записать 1 в W
            bsf         Status,C    ; Установить флаг С в 1
            subwf       rezervuarL,F; Уменьшить на 1 регистра rezervuarL с сохранением результата в нем же.
            btfss       Status,C    ; проверить флаг С
            goto        aaa5        ; если 0 переход на aaa5
aaa8        movf        rezervuarL,W; Запись в регистр W содержимое регистра rezervuarL
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        rezervuarM,W; Запись в регистр W содержимое регистра rezervuarM
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        aaa6        ; Переход на aaa6
aaa5        decf        rezervuarM,F; Уменшить на один регистр rezervuarM
            btfsc       rezervuarM,7; проверить бит № 7
            goto        aaa7        ; если 1 переход aaa7
            goto        aaa8        ; Переход на aaa8
aaa6        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call        GoInd1
            goto        KLAVA_rezer ; Переход в ПП KLAVA_rezer
aaa7        movlw       .2          ; -------------------------------------------------------  
            movwf       rezervuarM  ; Запись числа 767 в общий регистр rezervuarM
            movlw       .255        ;
            movwf       rezervuarL  ; -------------------------------------------------------  
            goto        aaa8        ; Переход на aaa8
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM объема резервуара плюс
;--------------------------------------------------------------------------------------------
rezerv_plus call        Vremya      ; Переход в ПП Vremya с записью в стек
            bcf         Status,Z    ; Опустить флаг Z 
            incf        rezervuarL,F; Увеличить на 1 регистра rezervuarL с сохранением результата в нем же.
            btfsc       Status,Z    ; Проверка поднятия флага Z
            goto        bbb1        ; если 0 переход bbb1
bbb3        movf        rezervuarL,W; Запись в регистр W содержимое регистра rezervuarL
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        rezervuarM,W; Запись в регистр W содержимое регистра rezervuarM
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        bbb2        ; Переход на bbb2
bbb1        incf        rezervuarM,F; Увеличить на один регистр rezervuarM
            btfss       rezervuarM,1; проверить бит № 1
            goto        bbb3        ; если 0 переход bbb3
            btfsc       rezervuarM,0; если 1 проверить бит № 0
            clrf        rezervuarM  ; если 1 очистка rezervuarM
            goto        bbb3        ; Переход на bbb3
bbb2        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call       GoInd1
            goto        KLAVA_rezer ; Переход в ПП KLAVA_rezer
;***************************************************************************************
;  ПП управления клавиатурой установка нижнего 1 уровня
;***************************************************************************************
OPRO_NIZ1   movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 10с
            movlw       .103        ; ------------------------------------------------------
            movwf       d1          ;
            movlw       .67         ;
            movwf       d2          ; Вывод надписи dn1 
            clrf        d4          ;
            movlw       60h         ;
            movwf       d3          ; ------------------------------------------------------
            movf        Udn1L,W     ; Запись в регистр W содержимое регистра Udn1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn1M,W     ; Запись в регистр W содержимое регистра Udn1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            call        Bin2_10     ; Переход в ПП Bin2_10_1
            call        NEW1        ; Переход в ПП NEW 
            call        screen      ; ПП вывод на индикацию
    call        GoIn
            call        GoInd2
KLAVA_N1    btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2 
            goto        Niz_plus1   ; Кнопка нажата. Переход в Niz_plus1
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        Niz_minus1  ; Кнопка нажата. Переход в Niz_minus1
            call        Vremya      ; Переход в ПП Vremya
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_N1    ; Переход в ПП KLAVA_N
            bcf         IntCon,7    ; если 1 глобальный запрет прерываний и запись Udn1L в EEPROM
            bsf         Status,RP1    ; Установить банк 1.
            movlw       2           ; Записать, в регистр W, константу 02h.
            movwf       EEAdr       ; Скопировать константу 02h, из регистра W, в регистр EEAdr.
             bcf         Status,RP1
            movf        Udn1L,W     ; Скопировать число, из регистра Udn1L, в регистр W.
            call        zapis       ; Переход в ПП zapis
            bsf         Status,RP1    ; Установить банк 1.
            movlw       0           ; Записать, в регистр W, константу 0h.
            movwf       EEAdr       ; Скопировать константу 0h, из регистра W, в регистр EEAdr.
             bcf         Status,RP1
            movf        Udn1M,W     ; Скопировать число, из регистра Udn1M, в регистр W.
            call        zapis       ; Переход в ПП zapis
            goto        OPRO_VER1   ; Переход в ПП OPRO_VER 
;--------------------------------------------------------------------------------------------  
;     Организация задержки и запись в EEPROM нижнего 1 уровня минус
;--------------------------------------------------------------------------------------------
Niz_minus1  call        Vremya      ; Переход в ПП Vremya с записью в стек
            movlw       .1          ; Записать 1 в W
            bsf         Status,C    ; Установить флаг С в 1
            subwf       Udn1L,F     ; Уменшить на 1 регистра Udn1L с сохранением результата в нем же.
            btfss       Status,C    ; проверить флаг С
            goto        bbb4        ; если 0 переход bbb4
bbb7        movf        Udn1L,W     ; Запись в регистр W содержимое регистра Udn1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn1M,W     ; Запись в регистр W содержимое регистра Udn1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        bbb5        ; Переход на bbb5
bbb4        decf        Udn1M,F     ; Уменшить на один регистр Udn1M
            btfsc       Udn1M,7     ; проверить бит № 7
            goto        bbb6        ; если 1 переход на bbb6
            goto        bbb7        ; Переход на bbb7
bbb5        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call        GoInd2
            goto        KLAVA_N1    ; Переход в ПП KLAVA_N1
bbb6        movlw       .2          ;--------------------------------------------------------
            movwf       Udn1M       ; Запись числа 767 в общий регистр Udn1
            movlw       .255        ;
            movwf       Udn1L       ;--------------------------------------------------------
            goto        bbb7        ; Переход на bbb7
;--------------------------------------------------------------------------------------------  
;       Организация задержки и запись в EEPROM нижнего 1 уровня плюс
;--------------------------------------------------------------------------------------------
Niz_plus1   call        Vremya      ; Переход в ПП Vremya с записью в стек
            bcf         Status,Z    ; Опустить флаг Z
            incf        Udn1L,F     ; Увеличить на 1 регистра Udn1L с сохранением результата в нем же.
            btfsc       Status,Z    ; Проверка поднятия флага Z
            goto        bbb8        ; если 0 переход на bbb8
bbb0        movf        Udn1L,W     ; Запись в регистр W содержимое регистра Udn1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn1M,W     ; Запись в регистр W содержимое регистра Udn1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        bbb9        ; Переход на bbb9
bbb8        incf        Udn1M,F     ; Увеличить на один регистр Udn1M
            btfss       Udn1M,1     ; проверить бит № 1
            goto        bbb0        ; если 0 переход на bbb0
            btfsc       Udn1M,0     ; если 1 проверить бит № 0
            clrf        Udn1M       ; если 1 очистка Udn1M
            goto        bbb0        ; Переход на bbb0
bbb9        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call        GoInd2
            goto        KLAVA_N1    ; Переход в ПП KLAVA_N1
;====================================
;;=============================================
LEDdata
        bsf     PortA,5;C,4;A,5;C,2;RS
        movwf   LEDtemp         ;Перевод из цифрового формата 
        addlw   30h             ;в табличный код для ЖКИ
        movwf   PortC           ;Посылка старшей тетрады в ЖКИ
        call    Enbl
        movf    LEDtemp,w
        addlw   30h
        movwf   Tempo
        swapf   Tempo,w
        movwf   PortC           ;Посылка младшей тетрады в ЖКИ
        call    Enbl
        movf    LEDtemp,w
        return
;=============================================
LEDcom
        bcf     PortA,5;C,4;A,5;C,2;RS
        movwf   LEDtemp
        movwf   PortC           ;Посылка старшей тетрады в ЖКИ
        call    Enbl
        movf    LEDtemp,w
        movwf   Tempo
        swapf   Tempo,w          ;Обмен тетрадами
        movwf   PortC           ;Посылка младшей тетрады в ЖКИ
        call    Enbl
        return
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++
;=============================================
;Посылка строб-импульса
;=============================================
Enbl 
        bsf     PortB,7;C,5;B,7;C,3;E         ;1 на вывод E ЖКИ
        nop                     ;Џ г§ 
        bcf     PortB,7;C,5;B,7;C,3;E         ;0 на вывод E ЖКИ
        movlw   .25             ;Џ г§ 
        movwf   Tempo
Paus2
        decfsz  Tempo,f
        goto    Paus2
        return
;=============================================
Pausem
        movlw   .255
        movwf   Tempo
Pausm2
        nop
        nop
        nop
        nop
        decfsz  Tempo,f
        goto    Pausm2
        return
;--------------------------------------------------------------------------------
;  ПП управления клавиатурой установка верхнего 1 уровня
;--------------------------------------------------------------------------------
OPRO_VER1   movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 10с
            movlw       .70         ;------------------------------------------------------------
            movwf       d1          ;
            movlw       .171        ;
            movwf       d2          ; Вывод надписи up1
            clrf        d4          ;
            movlw       60h         ;
            movwf       d3          ; -----------------------------------------------------------
            movf        Uup1L,W     ; Запись в регистр W содержимое регистра Uup1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup1M,W     ; Запись в регистр W содержимое регистра Uup1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1 
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call        GoInd3
            call        Pam1
KLAVA_V1    btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2
            goto        Ver_plus1   ; Кнопка нажата. Переход в Ver_plus1
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        Ver_minus1  ; Кнопка нажата. Переход в Ver_minus1
            call        Vremya      ; Переход в ПП Vremya с записью в стек      
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_V1    ; Переход в ПП KLAVA_V1
            bsf         Status,RP1    ; Установить банк 1.
            movlw       1           ; Записать, в регистр W, константу 01h.
            movwf       EEAdr       ; Скопировать константу 01h, из регистра W, в регистр EEAdr.
              bcf         Status,RP1
            movf        Uup1L,W     ; Скопировать число, из регистра Uup1L, в регистр W.
            call        zapis       ; Переход в ПП zapis
            bsf         Status,RP1    ; Установить банк 1.
            movlw       7           ; Записать, в регистр W, константу 07h.
            movwf       EEAdr       ; Скопировать константу 07h, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        Uup1M,W     ; Скопировать число, из регистра Udn1M, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
            goto        OPRO_NIZ2   ; Переход в ПП OPRO_NIZ2
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM верхнего уровня минус
;--------------------------------------------------------------------------------------------
Ver_minus1  call        Vremya      ; Переход в ПП Vremya с записью в стек 
            movlw       .1          ; Записать 1 в W
            bsf         Status,C    ; Установить флаг С в 1
            subwf       Uup1L,F     ; Уменшить на 1 регистра Uup1L с сохранением результата в нем же.
            btfss       Status,C    ; проверить флаг С
            goto        ccc0        ; если 0 переход на ccc0
ccc3        movf        Uup1L,W     ; Запись в регистр W содержимое регистра Uup1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup1M,W     ; Запись в регистр W содержимое регистра Uup1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ccc1        ; Переход на ccc1
ccc0        decf        Uup1M,F     ; Уменшить на один регистр Uup1M
            btfsc       Uup1M,7     ; проверить бит № 7
            goto        ccc2        ; если 1 переход на ccc2
            goto        ccc3        ; Переход на ccc3
ccc1        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
   call        GoIn
            call        GoInd3
            call        Pam1
            goto        KLAVA_V1    ; Переход в ПП KLAVA_V1
ccc2        movlw       .2          ;------------------------------------------------
            movwf       Uup1M       ; Запись числа 767 в общий регистр Uup1
            movlw       .255        ;
            movwf       Uup1L       ;------------------------------------------------
            goto        ccc3       ; Переход на ccc3
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM верхнего уровня плюс
;--------------------------------------------------------------------------------------------
Ver_plus1   call        Vremya      ; Переход в ПП Vremya с записью в стек
            bcf         Status,Z    ; Опустить флаг Z
            incf        Uup1L,F     ; Увеличить на 1 регистра Uup1L с сохранением результата в нем же.
            btfsc       Status,Z    ; Проверка поднятия флага Z
            goto        ccc4        ; если 0 переход на ccc4 
ccc6        movf        Uup1L,W     ; Запись в регистр W содержимое регистра Uup1L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup1M,W     ; Запись в регистр W содержимое регистра Uup1M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ccc5        ; Переход на ccc5
ccc4        incf        Uup1M,F     ; Увеличить на один регистр Uup1M
            btfss       Uup1M,1     ; проверить бит № 1
            goto        ccc6        ; если 0 переход на ccc6
            btfsc       Uup1M,0     ; если 1 проверить бит № 0
            clrf        Uup1M       ; если 1 очистка Uup1M
            goto        ccc6        ; Переход на ccc6
ccc5        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
          call        GoIn
            call        GoInd3
            call        Pam1
            goto        KLAVA_V1    ; Переход в ПП KLAVA_V1
;*********************************************************************************
;  ПП управления клавиатурой NIZ2
;*********************************************************************************
OPRO_NIZ2   movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 10с
            movlw       .103        ; -----------------------------------------------
            movwf       d1          ;
            movlw       .67         ;
            movwf       d2          ; Вывод надписи dn2
            clrf        d4          ;
            movlw       02Fh        ;
            movwf       d3          ; -----------------------------------------------
            movf        Udn2L,W     ; Запись в регистр W содержимое регистра Udn2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn2M,W     ; Запись в регистр W содержимое регистра Udn2M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
       call        GoIn
            call        GoInd4
            call         Pam1
KLAVA_N2    btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2
            goto        Niz_plus2   ; Кнопка нажата. Переход в Niz_plus2
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        Niz_minus2  ; Кнопка нажата. Переход в Niz_minus2
            call        Vremya      ; Переход в ПП Vremya
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_N2    ; Переход в ПП KLAVA_N2
            bsf         Status,RP1    ; Установить банк 1.
            movlw       5           ; Записать, в регистр W, константу 05h.
            movwf       EEAdr       ; Скопировать константу 05h, из регистра W, в регистр EEAdr.
             bcf         Status,RP1
            movf        Udn2L,W     ; Скопировать число, из регистра Udn2L, в регистр W.
            call        zapis       ; Переход в ПП zapis
            bsf         Status,RP1    ; Установить банк 1.
            movlw       3           ; Записать, в регистр W, константу 03h.
            movwf       EEAdr       ; Скопировать константу 03h, из регистра W, в регистр EEAdr.
             bcf         Status,RP1
            movf        Udn2M,W     ; Скопировать число, из регистра Udn2M, в регистр W.
            call        zapis       ; Переход в ПП zapis
            goto        OPRO_VER2   ; Переход в ПП OPRO_VER2
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM нижнего 2 уровня минус
;--------------------------------------------------------------------------------------------
Niz_minus2  call        Vremya      ; Переход в ПП Vremya с записью в стек
            movlw       .1          ; Записать 1 в W
            bsf         Status,C    ; Установить флаг С в 1 
            subwf       Udn2L,F     ; Уменшить на 1 регистра Udn2L с сохранением результата в нем же.
            btfss       Status,C    ; проверить флаг С
            goto        ccc7        ; если 0 переход на ccc7
ddd0        movf        Udn2L,W     ; Запись в регистр W содержимое регистра Udn2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn2M,W     ; Запись в регистр W содержимое регистра Udn2M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ccc8        ; Переход на ccc8
ccc7        decf        Udn2M,F     ; Уменшить на один регистр Udn2M
            btfsc       Udn2M,7     ; проверить бит № 7
            goto        ccc9        ; если 1 переход на ccc9
            goto        ddd0        ; Переход на 20 строк вверх
ccc8        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
          call        GoIn
            call        GoInd4
            call        Pam1
            goto        KLAVA_N2    ; Переход в ПП KLAVA_N
ccc9        movlw       .2          ;------------------------------------------------
            movwf       Udn2M       ; Запись числа 767 в общий регистр Uup2
            movlw       .255        ; 
            movwf       Udn2L       ; ------------------------------------------------
            goto        ddd0        ; Переход на ddd0
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM нижнего уровня плюс
;--------------------------------------------------------------------------------------------
Niz_plus2   call        Vremya      ; Переход в ПП Vremya с записью в стек
            bcf         Status,Z    ; Опустить флаг Z 
            incf        Udn2L,F     ; Увеличить на 1 регистра Udn с сохранением результата в нем же.
            btfsc       Status,Z    ; Проверка поднятия флага Z
            goto        ddd1        ; если 0 переход на ddd1
ddd3        movf        Udn2L,W     ; Запись в регистр W содержимое регистра Udn2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Udn2M,W     ; Запись в регистр W содержимое регистра Udn2M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ddd2        ; Переход на ddd2
ddd1        incf        Udn2M,F     ; Увеличить на один регистр Udn2M
            btfss       Udn2M,1     ; проверить бит № 1
            goto        ddd3        ; если 0 переход на ddd3
            btfsc       Udn2M,0     ; если 1 проверить бит № 0
            clrf        Udn2M       ; если 1 очистка Udn2M
            goto        ddd3        ; Переход на ddd3
ddd2        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call        GoInd4
            call        Pam1
            goto        KLAVA_N2    ; Переход в ПП KLAVA_N
;--------------------------------------------------------------------------------
;  ПП управления клавиатурой VER2
;--------------------------------------------------------------------------------
OPRO_VER2   movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 10с
            movlw       .70         ; ---------------------------------------------------
            movwf       d1          ;
            movlw       .171        ; 
            movwf       d2          ;  Вывод надписи up2
            clrf        d4          ;
            movlw       02Fh        ;
            movwf       d3          ; --------------------------------------------------- 
            movf        Uup2L,W     ; Запись в регистр W содержимое регистра Uup2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup2M,W     ; Запись в регистр W содержимое регистра Uup
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerМ
            call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
            call        GoIn         
            call        GoInd5
KLAVA_V2    btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2 
            goto        Ver_plus2   ; Кнопка нажата. Переход в Ver_plus2
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        Ver_minus2  ; Кнопка нажата. Переход в Ver_minus2
            call        Vremya      ; Переход в ПП Vremya с записью в стек 
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLAVA_V2    ; Переход в ПП KLAVA_V
            bsf         Status,RP1    ; Установить банк 1.
            movlw       4           ; Записать, в регистр W, константу 04h.
            movwf       EEAdr       ; Скопировать константу 04h, из регистра W, в регистр EEAdr.
             bcf         Status,RP1
            movf        Uup2L,W     ; Скопировать число, из регистра Uup2L, в регистр W.
            call        zapis       ; Переход в ПП zapis
            bsf         Status,RP1    ; Установить банк 1.
            movlw       8           ; Записать, в регистр W, константу 08h.
            movwf       EEAdr       ; Скопировать константу 08h, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        Uup2M,W     ; Скопировать число, из регистра Udn2М, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
    	goto	OPROS;OT_ZAK
;--------------------------------------------------------------------------------------------  
;                      Организация задержки и запись в EEPROM верхнего уровня минус
;--------------------------------------------------------------------------------------------
Ver_minus2  call        Vremya      ; Переход в ПП Vremya с записью в стек 
            movlw       .1          ; Записать 1 в W
            bsf         Status,C    ; Установить флаг С в 1
            subwf       Uup2L,F     ; Уменшить на 1 регистра Uup с сохранением результата в нем же.
            btfss       Status,C    ; проверить флаг С
            goto        ddd4        ; если 0 переход на ddd4
ddd7        movf        Uup2L,W     ; Запись в регистр W содержимое регистра Uup2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup2M,W     ; Запись в регистр W содержимое регистра Uup2M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ddd5        ; Переход на ddd5
ddd4        decf        Uup2M,F     ; Уменшить на один регистр Uup2M
            btfsc       Uup2M,7     ; проверить бит № 7
            goto        ddd6        ; если 1 переход на ddd6
            goto        ddd7        ; Переход на ddd7
ddd5        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW1
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call        GoInd5
            goto        KLAVA_V2    ; Переход в ПП KLAVA_V2
ddd6        movlw       .2          ;------------------------------------------------
            movwf       Uup2M       ; Запись числа 767 в общий регистр Uup2
            movlw       .255        ;
            movwf       Uup2L       ;-------------------------------------------------
            goto        ddd7        ; Переход на ddd7
;--------------------------------------------------------------------------------------------  
;   ПП Организация задержки и запись в EEPROM верхнего 2 уровня плюс
;--------------------------------------------------------------------------------------------
Ver_plus2   call        Vremya      ; Переход в ПП Vremya с записью в стек
            bcf         Status,Z    ; Опустить флаг Z            
            incf        Uup2L,F     ; Увеличить на 1 регистра Uup2L с сохранением результата в нем же.
            btfsc       Status,Z    ; Проверка поднятия флага Z
            goto        ddd8        ; Переход на ddd8     
eee0        movf        Uup2L,W     ; Запись в регистр W содержимое регистра Uup2L
            movwf       TimerL      ; Скопировать содержимое регистра W в регистор TimerL
            movf        Uup2M,W     ; Запись в регистр W содержимое регистра Uup2M
            movwf       TimerM      ; Скопировать содержимое регистра W в регистор TimerM
            goto        ddd9        ; Переход на ddd9
ddd8        incf        Uup2M,F     ; Увеличить на один регистр Uup2M
            btfss       Uup2M,1     ; проверить бит № 1 
            goto        eee0        ; если 0 переход на eee0
            btfsc       Uup2M,0     ; если 1 проверить бит № 0
            clrf        Uup2M       ; если 1 очистка Uup2M
            goto        eee0        ; Переход на eee0
ddd9        call        Bin2_10     ; Переход в ПП Bin2_10
            call        NEW1        ; Переход в ПП NEW
            call        screen      ; ПП вывод на индикацию
            call        GoIn
            call        GoInd5
            goto        KLAVA_V2    ; Переход в ПП KLAVA_V 
;*********************************************************************************
;  ПП управления клавиатурой определения откачка - закачка жидкости в резервуар
;*********************************************************************************
OT_ZAK      movlw       .80         ; Загрузка константы 80 в регистр Niz количес-
            movwf       Niz         ; тво проходов примерно 8с
            movlw       .238        ; -----------------------------------------------------
            movwf       d1          ;
            movlw       .1          ; Вывод надписи O-3
            movwf       d2          ;
            movlw       .109        ; 
            movwf       d3          ;
	clrf	d6	;
	clrf	d7	; ------------------------------------------------------
            btfss       setup,1     ; проверить бит №0
            goto        aaa1        ; если 0 Переход на 15 строк вниз
            movlw       60h         ; если 1 записать константу .96 в W
aaa2        movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            call        screen      ; ПП вывод на индикацию
       call        GoIn
            call        GoInd;O 
KLA_OTZAK   btfss       PortC,1;3;B,2     ; Проверка нажатия кнопки КН2
            goto        OTZAK_plus  ; Кнопка нажата. Переход в obhod_plus
            btfss       PortC,0;2;B,1     ; Кнопка не нажата. Проверка нажатия КН1
            goto        OTZAK_minus ; Кнопка нажата. Переход в obhod_minus
            call        Vremya      ; Переход в ПП Vremya
            clrwdt                  ; очистить wdt
            decfsz      Niz,F       ; Уменьшение на 1 регистра Niz
            goto        KLA_OTZAK   ; Переход в ПП KLAVA_obhod
            bsf         Status,RP1    ; Установить банк 1.
            movlw       6           ; Записать, в регистр W, константу 06h.
            movwf       EEAdr       ; Скопировать константу 06h, из регистра W, в регистр EEAdr.
            bcf         Status,RP1    ; Установить банк 0.
            movf        setup,W     ; Скопировать число, из регистра setup, в регистр W.
            bsf         Status,RP1    ; Установить банк 1.
            call        zapis       ; Переход в ПП zapis
yyyy0       swapf       TempD1,W    ; ---------------------------- 
            movwf       d1          ;
            swapf       TempD3,W    ; Востановление содержимого
            movwf       d3          ; регистров d1-d4 в которых были
	clrf	d2
	clrf	d6	;
	clrf	d7	;
	clrf	d8	; -----------------------------
            movlw       .10         ; запись 10 в регистр количества проходов до входа 
            movwf       ABD         ; в ПП выставления верхних и нижних уровней
            bcf         Flag,1      ; -----------------------------------------------
            bcf         Flag,4      ;
            bcf         Flag,5      ; новый цикл замера
            bcf         Flag,6      ;
            bcf         Flag,7      ;
            clrf        nakopitL    ; накопительные регистры RezultL+RezultL+RezultL=nakopitL
            clrf        nakopitM    ; накопительные регистры RezultM+RezultM+RezultM=nakopitM
            goto        OPROS       ; Переход в ПП OPROS
;--------------------------------------------------------------------------------------------
aaa1        movlw       0EEh        ; записать константу .238 в W 
            goto        aaa2        ; Переход на 41 строк вверх
;--------------------------------------------------------------------------------------------
;     Организация задержки и запись в EEPROM выбора откачка - закачка жидкости в резервуар
;--------------------------------------------------------------------------------------------
OTZAK_minus call        Vremya      ; Переход в ПП Vremya с записью в стек   
            bcf         setup,1     ; Установить бит № 0 в 0 (установка растояния датчик-вода)
            movlw       0EEh        ; записать константу .238 в W 
            movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            goto        KLA_OTZAK   ; Переход в ПП KLA_OTZAK
;--------------------------------------------------------------------------------------------
;     Организация задержки и запись в EEPROM выбора откачка - закачка жидкости в резервуарс
;--------------------------------------------------------------------------------------------
OTZAK_plus  call        Vremya      ; Переход в ПП Vremya с записью в стек   
            bsf         setup,1     ; Установить бит № 0 в 1 (установка растояния дно-вода) 
            movlw       .109        ; записать константу .96 в W 
            movwf       d8          ; Скопировать константу из регистра W, в регистр d8.
            goto        KLA_OTZAK   ; Переход в ПП KLA_OTZAK
;--------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
;=============================================
            end                     ; Конец программы.












