;***********************************************************************************************
; BORTCOMP.asm    Бортовой компьютер на pic16f876 с выводом показателей на LCD 16х2 WH1602D
; Для установки на любой ВАЗ 
; Контролируемые параметры:
; Ток заряда/разряда аккумулятора
; Напряжение бортовой сети
; Обороты двигателя 
; Температура двигателя (с включением прерывистого сигнала при нагреве двигателя выше +99,5С)
; Температура окружающей среды от -55 до +99С     
; Время часы-минуты
; Аварийный уровень тосола в расширителе системы охлаждения
; Аварийный уровень тормозной жикости в расширителе ТС      
; Включение стартера
; для отображения врЕменных циферных значений в первой и второй строке 
; используются с 4 по 15 знакоместо, 1,2,3,16 не используются для вывода цифр.
; сначала на LCD выводится постоянная надпись с погашеными циферными значениями,
; потом производится преобразование, конвертирование и вывод данных в определенные знакоместа.
;---------------------------------------------------------------------------------------------
; назначение выводов пика
; Функции выводов порта А:
; вывод -RA0/AN0 - модуль АЦП измеритель тока заряда/разряда аккумулятора
; вывод -RA1/AN1 - модуль АЦП измеритель напряжения бортовой сети
; вывод -RA2 - вывод DQ  датчика температуры на улице 
; вывод -RA3 -  не используется
; вывод -RA4/TOCKI - К тахометру _||_
; вывод -RA5 -  вывод DQ  датчика температуры двигателя 
; Функции выводов порта С:
; вывод -RC0 - контроль включения зажигания
; вывод -RC1 - Контроль включения стартера
; вывод -RC2 - контроль наличия тосола
; вывод -RC3 - контроль уровня тормозной жидкости 
; вывод -RC4 - Бипер 
; вывод -RC5 - светодиод сигнализатор ненормальности
; вывод -RC6 - не задействованы
; вывод -RC7 - контроль выключения фар, после выключения зажигания
; Функции выводов порта B:
; вывод -RВ0 - кнопка добавления 1 в разряд часы
; вывод -RВ1 - кнопка добавления 1 в разряд минуты
; вывод -RВ2 - Вывод стробирования Е для LCD.
; вывод -RВ3 - Вывод переключения активных строк RS для LCD
; вывод -RВ4 - Вывод данных 4-го бита
; вывод -RВ5 - Вывод данных 5-го бита
; вывод -RВ6 - Вывод данных 6-го бита
; вывод -RВ7 - Вывод данных 7-го бита
; интерфейс LCD последовательный 4-битный однонаправленный- RW соединен с землей, 
;*********************************************************************************************
; Разработал Маюнов Александр Сергеевич г.Мирный Респ.Саха (Якутия),e-mail:  maun_2005@mail.ru
; по материалам "Самоучителя" и "Практикума" - Корабельникова Е.А., а также "Обмена" КЕА
;*********************************************************************************************
;*********************************************************************************************
; Используется XT-генератор 4.000 Мгц (1 м.ц.= 1 мкс.).
; Используется PIC16F876.
; Объем в памяти программ 2645 слов.
;===============================================================================================
            INCLUDE   <P16F876.INC>; Задание типа микроконтроллера. 
            __CONFIG   3D71H       ; XT-генератор, PWRT вкл., защита выкл., сброс BOR
                                   ; вкл, LVP выкл., DEBUG выкл, 
            ERRORLEVEL  -306,-302
;===============================================================================================
; Регистры общего назачения.
;===============================================================================================
LED0        EQU        20H         ; регистр младшего разряда данных выводящихся на LCD 
LED1        EQU        21H         ; РЕГИСТР среднего разряда данных выводящихся на LCD
LED2        EQU        22H         ; РЕГИСТР старшего разряда данных выводящихся на LCD
LED3        EQU        23H         ; РЕГИСТР самого старшего разряда данных выводящихся на LCD
SIG         EQU        24H         ; РЕГИСТР ЗУМЕРА
SIG_H       EQU        25H         ; РЕГИСТР СТАРШЕГО СЧЕТЧИКА таймера
SIG_M       EQU        26H         ; РЕГИСТР Среднего СЧЕТЧИКА таймера
SIG_L       EQU        27H         ; РЕГИСТР МЛАДШЕГО СЧЕТЧИКА таймера
FLAG        EQU        28H         ; РЕГИСТР ФЛАГОВ
TEMP_MSB    EQU        2Ah         ; Байт знака температуры (старший байт).
TEMP_LSB    EQU        2Bh         ; Байт значения температуры (младший байт).
COUNT       EQU        2CH         ; Счетчик количества проходов.
COUNT1      EQU	       2DH         ;
COUNT2	    EQU	       2EH	   ;
TEMP        EQU        2FH         ; Регистр временного хранения данных.
TEMP1       EQU	       30H	   ;
TEMP2       EQU	       31H
MEM         EQU        32H         ; Регистр оперативной памяти.
TMR_L       EQU        33H         ; Регистр младшего СЧЕТЧИКА TIMER0
TMR_M       EQU        34H         ; Регистр среднего СЧЕТЧИКА TIMER0
TMR_H       EQU        35H         ; Регистр старшего СЧЕТЧИКА TIMER0
PROX        EQU        36H         ; Регистр колличества проходов числа замеров
TMR_PROX    equ        69h         ; Регистр колличества проходов для TMR0
TEMP_L      EQU        37H         ; Регистр младшего разряда  двоичного числа АЦП 
TEMP_H      EQU        38H         ; Регистр старшего разряда  двоичного числа АЦП
result_H    EQU	       39H	   ; Текущее значение выборки АЦП
result_M    EQU	       3AH         ;
result_L    EQU	       3BH	   ;

i1_sum_H    EQU	       3CH	   ; Суммы тока 
i1_sum_M    EQU	       3DH	   ;
i1_sum_L    EQU	       3EH	   ; 

SUMM_H      EQU	       3FH	   ; Текущие суммы выборок тока
SUMM_M	    EQU	       40H	   ;
SUMM_Mt	    EQU	       41H	   ;
SUMM_L	    EQU	       42H	   ;

divid_H     EQU	       43H	   ; Делимое
divid_M	    EQU	       44H	   ; Делимое
divid_L     EQU	       45H	   ; Делимое
divir       EQU	       46H	   ; Делитель
znak	    equ	       47h         ; текущий знак тока
R4          EQU        48H         ; Регистры знакомест LCD, 1-й СТРОКИ, 4-е знакоместо слева
R5          EQU        49H
R6          EQU        4AH
R7          EQU        4BH
R8          EQU        4CH
R9          EQU        4DH
R10         EQU        4EH
R11         EQU        4FH
R12         EQU        50H
R13         EQU        51H
R14         EQU        52H
R15         EQU        53H
R24         EQU        54H         ; Регистры знакомест LCD, 2-й СТРОКИ, 4-е знакоместо слева
R25         EQU        55H
R26         EQU        56H
R27         EQU        57H
R28         EQU        58H
R29         EQU        59H
R210        EQU        5AH
R211        EQU        5BH
R212        EQU        5CH
R213        EQU        5DH
R214        EQU        5EH
R215        EQU        5FH
MSEC        equ        62H         ; Регистр подсчета прерываний по переполнению TMR2
SEC         equ        63H         ; Регистр секунд 
MIN         equ        64h         ; Регистр минут
CHAS        equ        65h         ; Регистр Часов
N           equ        66h         ; Регистр Временного хранения данных.
STAT_TEMP   equ        77h         ; Регистр сохранения содержимого STATUS в прерываниях.
W_TEMP      EQU        79h         ; Регистр сохранения контекста для прерываний.
COR_SEC     equ        68h         ; регистр коррекции секунд
CORR        equ        69H         ; регистр корректировки секунд за прошедший час.
;===============================================================================================
; Определение места размещения результатов операций.
;===============================================================================================
W           EQU        0           ; Результат направить в аккумулятор.
F           EQU        1           ; Результат направить в регистр.
;===============================================================================================
; Присвоение битам названий.
;===============================================================================================
C           EQU        0           ; Флаг переноса-заема.
Z           EQU        2           ; Флаг нулевого результата. 
DQ1         EQU        2           ; Бит порта A для управления DS1820. 
DQ2         EQU        5           ; Бит порта A для управления DS1820.
RP0         EQU        5           ; Бит выбора банка 0,1. 
RP1         EQU        6           ; Бит выбора банка 2,3.
GO          EQU        2           ; Бит статуса модуля АЦП.
RS          EQU        3           ; бит переключения знакоместо/данные
E           EQU        2           ; бит строба для LCD
TMR2IE      equ        1           ; бит разрешения/запрета прерываний от TMR2
TMR2IF      equ        1           ; бит флага  прерывания по переполнению TMR2
;*******************************************************************************
;       КОНСТАНТЫ ПОЛЬЗОВАТЕЛЯ 
;*******************************************************************************
Viborki	    EQU	       .250	   ; Колличество выборок 250
T_Viborki   equ        .50         ; Задержка АЦП 50
KORR_I      equ        .5          ; коррекция 0 датчика тока, если есть падение напряжения
                                   ; в проводе к датчику тока или на него поступает менее 5.12В
AN0	    equ 	b'01000001'; AN0 Выбор входа
AN1	    equ 	b'01001001'; AN1 Выбор входа
;===============================================================================================
;===============================================================================================
            ORG        0           ; Начать выполнение программы с 0-го адреса PC. 
            GOTO       START       ; БЕЗУСЛОВНЫЙ ПЕРЕХОД НА ВЫПОЛНЕНИЕ ПП START
;***********************************************************************************************
            org        4           ; начать ПП прерываний с PC-адреса 0004h.
;***********************************************************************************************
;***********************************************************************************************
; НАЧАЛО ПРЕРЫВАНИЯ.
;===============================================================================================
;  Сохранение контекста в прерываниях
;***********************************************************************************************
;================================================================================================
            movwf      W_TEMP        ; W -> W_TEMP
            swapf      STATUS,W      ; Смена местами полубайтов регистра STATUS. Результат -> W.
            movwf      STAT_TEMP     ; W -> STAT_TEMP

;===============================================================================================
; Рабочая часть часов реального времени
;===============================================================================================
ISPOLNENIE  clrwdt
            bcf        STATUS,RP0   ; выбрать банк 0
            bcf        PIR1,TMR2IF  ; сбросить флаг переполненного таймера
            bsf        STATUS,RP0   ; выбрать банк 1 
            movlw      .249         ; записать костанту в W
            movwf      PR2          ; установить период прерываний TMR2 = 250
            bcf        STATUS,RP0   ; выбрать банк 0
           
           
            incf       TMR_PROX,F  ; Инкремент регистра TMR_PROX для подсчета 0,5 сек. для TMR0
            incf       MSEC,F      ; Инкремент регистра колличества переполнений таймера 2 
            bSf        STATUS,C    ; 
            movf       MSEC,W      ; Записать содержимое рег. MSEC в W
            sublw      .99         ; 99-MSEC=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в MSEC меньше или = 49 окончание прерываний
            clrf       MSEC        ; Если С=0,то число в MSEC больше 49, и обнуляем  MSEC
            
            
            incf       SEC,F       ; Инкремент регистра секунд  
            bSf        STATUS,C    ; 
            movf       SEC,W       ; Записать содержимое рег. SEC в W
            sublw      .59         ; 59-SEC=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в SEC меньше или =59 окончание прерываний
            clrf       SEC         ; Если С=0,то число в SEC больше 59, и обнуляем  SEC  

            incf       MIN,F       ; Инкремент регистра минут  
            bSf        STATUS,C    ; 
            movf       MIN,W       ; Записать содержимое рег. MIN в W
            sublw      .59         ; 59-MIN=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в MIN меньше или = 59 окончание прерываний
            clrf       MIN         ; Если С=0,то число в MIN больше 59, и обнуляем  MIN  
 
            incf       CHAS,F      ; Инкремент регистра минут  
            bSf        STATUS,C    ; 
            movf       CHAS,W      ; Записать содержимое рег. CHAS в W
            sublw      .23         ; 23-MIN=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в CHAS меньше или = 23 окончание прерываний
            clrf       CHAS        ; Если С=0,то число в CHAS больше 23, и обнуляем  CHAS  
;================================================================================================
; Восстановление “влётного” содержимого W и STATUS.
;================================================================================================
END_INT     swapf      STAT_TEMP,W   ; Смена местами полубайтов регистра Status_Temp. Результат -> W.
            movwf      STATUS        ; Восстановление “влётного” содержимого STATUS.
            swapf      W_TEMP,F      ; Смена местами полубайтов регистра W_Temp. Результат -> W_Temp.
            swapf      W_TEMP,W      ; Восстановление “влётного” содержимого W.

;-------------------------------------------------------------------------------
            retfie                 ; Возврат из прерывания с 0-м банком (с 0-м банком 
                                   ; вошли в прерывание, с 0-м банком и вышли).
;================================================================================================

;********************************************************************************
;    КОНЕЦ ПРЕРЫВАНИЯ
;********************************************************************************
;--------------------------------------------------------------------------------------------
;ПП  Проверки нажатия кнопок установки часов:минут
;--------------------------------------------------------------------------------------------
KNOPKI     
;--------------------------------------------------------------------------------------------
; Кнопка RB1 нажата? установка минут
;--------------------------------------------------------------------------------------------
RB1         btfsc      PORTB,1     ; Кнопка RB1 нажата? =0?
            goto       RB0         ; нет RB1 отжата, переход на проверку кнопки RB0
            clrf       MSEC        ; сбросить регистр MSEC
            clrf       SEC         ; обнуление регистра секунд 
            incf       MIN,F       ; Инкремент регистра минут  
            bSf        STATUS,C    ; поднять флаг С
            movf       MIN,W       ; Записать содержимое рег. MIN в W
            sublw      .59         ; 59-MIN=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       RB0         ; Если С=1,то число в MIN меньше или = 59 
            clrf       MIN         ; Если С=0,то число в MIN больше 59, и обнуляем  MIN 
;--------------------------------------------------------------------------------------------
; Кнопка RB0 нажата? установка часов
;--------------------------------------------------------------------------------------------            
RB0         btfsc      PORTB,0     ; Кнопка RB0 нажата? =0?
            goto       EXIT        ; нет RB0 отжата, возврат по стеку           
            incf       CHAS,F      ; Инкремент регистра часов  
            bSf        STATUS,C    ; поднять флаг С
            movf       CHAS,W       ; Записать содержимое рег.  CHAS в W
            sublw      .23         ; 23- CHAS=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       EXIT        ; Если С=1,то число в  CHAS меньше или = 23 
            clrf       CHAS        ; Если С=0,то число в  CHAS больше 23, и обнуляем CHAS    
EXIT        return                 ; возврат по стеку     
;--------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------- 
;****************************************************************************************  
;          Подпрограмма  p300ms  -  ПП задержки в 1000 мс
;****************************************************************************************
p1000ms    movlw        .1          ; Начальная установка регистров SIG_L, SIG_M, SIG_H             
           movwf        SIG_L              
           movlw        .20         ; ------''------            
           movwf        SIG_M              
           movlw        .6          ; ------''------          
           movwf        SIG_H  
           goto         $+7
;****************************************************************************************  
;          Подпрограмма  p300ms  -  ПП задержки в 300 мс
;****************************************************************************************
p300ms     movlw        .153        ; Начальная установка регистров SIG_L, SIG_M, SIG_H             
           movwf        SIG_L              
           movlw        .134        ; ------''------            
           movwf        SIG_M              
           movlw        .2          ; ------''------          
           movwf        SIG_H  
WR_0     
           decfsz       SIG_L,1     ; Организация циклов           
           goto         WR_0              
           decfsz       SIG_M,1     ; ------''------           
           goto         WR_0              
           decfsz       SIG_H,1     ; ------''------              
           goto         WR_0  
           return                   ; Возврат по стеку
;==========+============+===========+====================================================
;**********************************************************
;          Конец ПП  p300ms
;**********************************************************
;****************************************************************************************  
;          Подпрограмма  коррекции рег. MSEC времени часиков
;****************************************************************************************
TIME_CORECT
            addwf      MSEC,F      ;  W+MSEC, с сохранением в рег. MSEC
            bSf        STATUS,C    ; 
            movf       MSEC,W      ; Записать содержимое рег. MSEC в W
            sublw      .99         ; 99-MSEC=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в MSEC меньше или = 49 окончание прерываний
            clrf       MSEC        ; Если С=0,то число в MSEC больше 49, и обнуляем  MSEC

            incf       SEC,F       ; Инкремент регистра секунд 
            movfw      COR_SEC     ; записать COR_SEC в W
            addwf      SEC,F       ; Сложить W и SEC с сохран. в SEC
            clrf       COR_SEC     ; 
            bSf        STATUS,C    ; 
            movf       SEC,W       ; Записать содержимое рег. SEC в W
            sublw      .59         ; 59-SEC=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в SEC меньше или =59 окончание прерываний
            clrf       SEC         ; Если С=0,то число в SEC больше 59, и обнуляем  SEC  
         

            incf       MIN,F       ; Инкремент регистра минут  
            bSf        STATUS,C    ; 
            movf       MIN,W       ; Записать содержимое рег. MIN в W
            sublw      .59         ; 59-MIN=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в MIN меньше или = 59 окончание прерываний
            clrf       MIN         ; Если С=0,то число в MIN больше 59, и обнуляем  MIN  
            
            movfw      CORR        ; записать CORR в W
            addwf      SEC,F       ; Сложить W и SEC с сохран. в SEC     
            incf       CHAS,F      ; Инкремент регистра минут  
            bSf        STATUS,C    ; 
            movf       CHAS,W      ; Записать содержимое рег. CHAS в W
            sublw      .23         ; 23-MIN=?
            btfsc      STATUS,C    ; проверка заем был? С=0?
            goto       END_INT     ; Если С=1,то число в CHAS меньше или = 23 окончание прерываний
            clrf       CHAS        ; Если С=0,то число в CHAS больше 23, и обнуляем  CHAS 
            return                 ; возврат по стеку 
	
;****************************************************************************************
;--------------------------------------------------------------------------------------------
; Вывод данных на индикатор
;--------------------------------------------------------------------------------------------
ENTER       bcf        INTCON,7    ; запретить прерывания 
            MOVWF       TEMP        ; Копия в Temp
            MOVLW       b'00001111' ; Очищаем старший п/байт регистра "PortB"
            ANDWF       PORTB,F     ; для дальнейшей работы
            MOVLW       b'11110000' ; Стираем младший п/байт регистра "Temp"
            ANDWF       TEMP,W      ; результат в w
            ADDWF       PORTB,F     ; Складываем оба полубайта с сохранением в "PortB".
            BSF         PORTB,E     ; Установка на линии E "1".
            nop
            BCF         PORTB,E     ; Установка на линии Е "0" (активный перепад).
            nop
            MOVLW       b'00001111' ; Очищаем старший п/байт регистра "PortB"
            ANDWF       PORTB,F     ; для дальнейшей работы
            SWAPF       TEMP,F      ; Смена п/байтов местами с сохранением в Temp
            MOVLW       b'11110000' ; Стираем младший п/байт
            ANDWF       TEMP,W      ; результат в w
one         ADDWF       PORTB,F     ; Складываем оба полубайта с сохранением в "PortB".
            BSF         PORTB,E
            nop
            BCF         PORTB,E
            nop
            MOVLW       .20
            CALL        PAUSE_Y     ; Задержка для вывода данных ЖКИ = 49мкс
            bsf         INTCON,7    ;разрешить прерывания 
            RETURN
;=============================================================================================
; "Рабочая" инициализация ЖКИ модуля.
;=============================================================================================
INIT_LCD    MOVLW       b'00100000' ; Запись только одного старшего п/байта "0010"
            CALL        one         ; вывод
            MOVLW       b'00101000' ; Команда установки 4x битного интерфейса, 2строки 5х7 точек
            CALL        ENTER       ; вывод
            MOVLW       b'00001100' ; Команда включения дисплея, курсора в виде подчерка
            CALL        ENTER       ; вывод
            MOVLW       b'00000001' ; Команда очистки дисплея со сбросом данных
            CALL        ENTER       ; вывод и "Составная" задержка
            CALL        PAUSE       ; перед выводом символов
            CALL        PAUSE       ; общим временем = 1.6ms
            RETURN                  ;
;*********************************************************************************************
;--------------------------------------------------------------------------------------------
; ПП задержки.
;--------------------------------------------------------------------------------------------
PAUSE       MOVLW       .255        ; "Одинарная"
PAUSE_Y     MOVWF       COUNT       ; регулируемая
WR_111      DECFSZ      COUNT,F     ; Стандартная
            GOTO        WR_111      ; ПП задержки.
            RETURN                  ; Если Count1 декрементирован до 0,то возврат по стеку.
;*********************************************************************************************
; Переход в начало 1-й строки.
;---------------------------------------------------------------------------------------------
INIT_LIN1   MOVLW       b'10000000' ; Выбор ячейки DD RAM с адресом 00h (установка
                                    ; курсора в крайнее левое знакоместо 1-й строки).
            BCF         PORTB,RS    ; Установка на линии "RS" "0".
            CALL        ENTER       ; вывод
            BSF         PORTB,RS    ; Установка на линии "RS" "1".
            RETURN                  ; Возврат по стеку.
;==========+============+===========+====================================================
;          Переход в начало 2-й строки.
;==========+============+===========+====================================================
INIT_LIN2  MOVLW        b'11000000' ; Выбор ячейки DD RAM с адресом 40h (установка
                                    ; курсора в крайнее левое знакоместо 2-й строки).
           BCF          PORTB,RS    ; Установка на линии "RS" "0".
           CALL         ENTER       ; вывод команды
           BSF          PORTB,RS    ; Установка на линии "RS" "1".
           RETURN                   ; Возврат по стеку.
;==========+============+===========+====================================================
;=============================================================================================
;=============================================================================================
;Надпись №1                           для 1-й строки надписи <ПРИВЕТ**ХОЗЯИН>
;                                     для 2-й строки надписи ЗАЖИГАНИЕ*ВКЛЮЧ.
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №1
;==========+============+===========+====================================================
NADPIS1     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки <ПРИВЕТ**ХОЗЯИН>
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR1_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT1_1; записать ст. байт счетчика команд метки TEXT1_1  в w
            movwf        PCLATH 
            call         TEXT1_1     ; Переход в ПП TEXT1_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR1_1       ; Если результат декремента не=0, то переход в ПП WR1_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №1           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки ЗАЖИГАНИЕ*ВКЛЮЧ.
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR1_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT1_2; записать ст. байт счетчика команд метки TEXT1_2  в w
            movwf        PCLATH 
            call         TEXT1_2     ; Переход в ПП TEXT1_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR1_2       ; Если результат декремента не=0, то переход в ПП WR1_2
         
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №2  Вычисляемый табличный переход для 1-й строки надписи ***tул=±**0С****
;                                          для 2-й строки надписи ***tдв=±**0С****
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №2
;==========+============+===========+====================================================
NADPIS2     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки ***tул=±**0С****
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR2_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT2_1; записать ст. байт счетчика команд метки TEXT2_1  в w
            movwf        PCLATH 
            call         TEXT2_1     ; Переход в ПП TEXT2_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR2_1       ; Если результат декремента не=0, то переход в ПП WR2_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №2           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки ***tдв=±**0С****
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR2_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT2_2; записать ст. байт счетчика команд метки TEXT2_2  в w
            movwf        PCLATH 
            call         TEXT2_2     ; Переход в ПП TEXT2_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR2_2       ; Если результат декремента не=0, то переход в ПП WR2_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №3  Вычисляемый табличный переход для 1-й строки надписи Uакк=**,*В*НОРМА
;                                          для 2-й строки надписи ГОТОВ К ЗАПУСКУ!
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №3
;==========+============+===========+====================================================
NADPIS3     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки Uакк=**,*В*НОРМА
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR3_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT3_1; записать ст. байт счетчика команд метки TEXT3_1  в w
            movwf        PCLATH 
            call         TEXT3_1     ; Переход в ПП TEXT3_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR3_1       ; Если результат декремента не=0, то переход в ПП WR3_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №3           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки ГОТОВ К ЗАПУСКУ!
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR3_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT3_2; записать ст. байт счетчика команд метки TEXT3_2  в w
            movwf        PCLATH 
            call         TEXT3_2     ; Переход в ПП TEXT3_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR3_2       ; Если результат декремента не=0, то переход в ПП WR3_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.

;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №4  Вычисляемый табличный переход для 1-й строки надписи Uак=**,*В*НИЗКОЕ
;                                          для 2-й строки надписи Надо подзарядить
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №4
;==========+============+===========+====================================================
NADPIS4     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки Uак=**,*В*НИЗКОЕ
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR4_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT4_1; записать ст. байт счетчика команд метки TEXT4_1  в w
            movwf        PCLATH 
            call         TEXT4_1     ; Переход в ПП TEXT4_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR4_1       ; Если результат декремента не=0, то переход в ПП WR4_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №4           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки Надо подзарядить
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR4_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT4_2; записать ст. байт счетчика команд метки TEXT4_2  в w
            movwf        PCLATH 
            call         TEXT4_2     ; Переход в ПП TEXT4_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR4_2       ; Если результат декремента не=0, то переход в ПП WR4_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.
;=============================================================================================
;=============================================================================================
;=============================================================================================
;                   ВЫВОД на ЖКИ надписи при ВКЛЮЧЕНИИ СТАРТЕРА
;=============================================================================================
;=============================================================================================
;==========+============+===========+=========================================================
;Надпись №5  Вычисляемый табличный переход для 1-й строки надписи **<<<ЗАПУСК>>>**
;                                          для 2-й строки надписи Стартер  включен 
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №5
;==========+============+===========+====================================================
NADPIS5     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки **<<<ЗАПУСК>>>**
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR5_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT5_1; записать ст. байт счетчика команд метки TEXT5_1  в w
            movwf        PCLATH 
            call         TEXT5_1     ; Переход в ПП TEXT5_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR5_1       ; Если результат декремента не=0, то переход в ПП WR5_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №5           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки Стартер  включен 
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR5_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT5_2; записать ст. байт счетчика команд метки TEXT5_2  в w
            movwf        PCLATH 
            call         TEXT5_2     ; Переход в ПП TEXT5_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR5_2       ; Если результат декремента не=0, то переход в ПП WR5_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.
;=============================================================================================
;=============================================================================================
;=============================================================================================
;                   ВЫВОД на ЖКИ надписей  6,7,8 во время работы двигателя
;=============================================================================================
;=============================================================================================
;==========+============+===========+=========================================================
;Надпись №6  Вычисляемый табличный переход для 1-й строки надписи tдв=±**0С*00:00*
;                                          для 2-й строки надписи Iз=**А**Uс=**,*В 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №6
;==========+============+===========+====================================================
NADPIS6     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки tдв=±**0С*00:00*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR6_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT6_1; записать ст. байт счетчика команд метки TEXT6_1  в w
            movwf        PCLATH 
            call         TEXT6_1     ; Переход в ПП TEXT6_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR6_1       ; Если результат декремента не=0, то переход в ПП WR6_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №6           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки Iз=**А**Uс=**,*В 
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR6_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT6_2; записать ст. байт счетчика команд метки TEXT6_2  в w
            movwf        PCLATH 
            call         TEXT6_2     ; Переход в ПП TEXT6_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR6_2       ; Если результат декремента не=0, то переход в ПП WR6_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №7  Вычисляемый табличный переход для 1-й строки надписи Iз=**А**Uс=**,*В
;                                          для 2-й строки надписи *Fдв=****об/мин* 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №7
;==========+============+===========+====================================================
NADPIS7     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки Iз=**А**Uс=**,*В
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR7_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT7_1; записать ст. байт счетчика команд метки TEXT7_1  в w
            movwf        PCLATH 
            call         TEXT7_1     ; Переход в ПП TEXT7_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR7_1       ; Если результат декремента не=0, то переход в ПП WR7_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №7           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки *Fдв=****об/мин* 
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR7_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT7_2; записать ст. байт счетчика команд метки TEXT7_2  в w
            movwf        PCLATH 
            call         TEXT7_2     ; Переход в ПП TEXT7_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR7_2       ; Если результат декремента не=0, то переход в ПП WR7_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку. 
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №8  Вычисляемый табличный переход для 1-й строки надписи *Fдв=****об/мин*
;                                          для 2-й строки надписи tул=±**0С*00:00* 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №8
;==========+============+===========+====================================================
NADPIS8     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки *Fдв=****об/мин*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR8_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT8_1; записать ст. байт счетчика команд метки TEXT8_1  в w
            movwf        PCLATH 
            call         TEXT8_1     ; Переход в ПП TEXT8_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR8_1       ; Если результат декремента не=0, то переход в ПП WR8_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №8           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки tул=±**0С*00:00*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR8_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT8_2; записать ст. байт счетчика команд метки TEXT8_2  в w
            movwf        PCLATH 
            call         TEXT8_2     ; Переход в ПП TEXT8_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR8_2       ; Если результат декремента не=0, то переход в ПП WR8_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0". 
            RETURN                   ; возврат по стеку.   
          
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;                   ВЫВОД на ЖКИ надписи в момент выключения двигателя
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №9  Вычисляемый табличный переход для 1-й строки надписи <<ПОКА  ХОЗЯИН>>
;                                          для 2-й строки надписи Зажигание выключ 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №9
;==========+============+===========+====================================================
NADPIS9     call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки <<ПОКА  ХОЗЯИН>>
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR9_1       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT9_1; записать ст. байт счетчика команд метки TEXT9_1  в w
            movwf        PCLATH 
            call         TEXT9_1     ; Переход в ПП TEXT9_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR9_1       ; Если результат декремента не=0, то переход в ПП WR9_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №9           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки Зажигание выключ
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR9_2       movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT9_2; записать ст. байт счетчика команд метки TEXT9_2  в w
            movwf        PCLATH 
            call         TEXT9_2     ; Переход в ПП TEXT9_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR9_2       ; Если результат декремента не=0, то переход в ПП WR9_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.   
             
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;                   ВЫВОД на ЖКИ надписи в Режиме ожидания (дежурный режим)
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №10  Вычисляемый табличный переход для 1-й строки надписи *****00:00******
;                                           для 2-й строки надписи ***tул=±**0С**** 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №10
;==========+============+===========+====================================================
NADPIS10    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки *****00:00******
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR10_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT10_1; записать ст. байт счетчика команд метки TEXT10_1  в w
            movwf        PCLATH 
            call         TEXT10_1    ; Переход в ПП TEXT10_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR10_1      ; Если результат декремента не=0, то переход в ПП WR10_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №10           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки ***tул=±**0С****
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR10_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT10_2; записать ст. байт счетчика команд метки TEXT10_2  в w
            movwf        PCLATH 
            call         TEXT10_2    ; Переход в ПП TEXT10_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR10_2      ; Если результат декремента не=0, то переход в ПП WR10_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".          
            RETURN                   ; возврат по стеку.    
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;                  НИЖЕ ВЫВОД НА ЖКИ НАДПИСЕЙ АВАРИЙНЫХ СОБЫТИЙ
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №11  Вычисляемый табличный переход для 1-й строки надписи ВНИМАНИЕ**АВАРИЯ
;                                           для 2-й строки надписи **<ГЕНЕРАТОРА>** 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №11
;==========+============+===========+====================================================
NADPIS11    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки ВНИМАНИЕ**АВАРИЯ
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR11_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT11_1; записать ст. байт счетчика команд метки TEXT11_1  в w
            movwf        PCLATH 
            call         TEXT11_1    ; Переход в ПП TEXT11_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR11_1      ; Если результат декремента не=0, то переход в ПП WR11_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №11           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки **<ГЕНЕРАТОРА>**
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR11_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT11_2; записать ст. байт счетчика команд метки TEXT11_2  в w
            movwf        PCLATH 
            call         TEXT11_2    ; Переход в ПП TEXT11_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR11_2      ; Если результат декремента не=0, то переход в ПП WR11_2
            call         SIGNAL      ; условный переход на SIGNAL
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            RETURN                   ; возврат по стеку.       

;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №12  Вычисляемый табличный переход для 1-й строки надписи ****АВАРИЙНЫЙ***
;                                           для 2-й строки надписи **УРОВЕНЬ В ТС**   
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №12
;==========+============+===========+====================================================
NADPIS12    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки ****АВАРИЙНЫЙ***
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR12_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT12_1; записать ст. байт счетчика команд метки TEXT12_1  в w
            movwf        PCLATH 
            call         TEXT12_1    ; Переход в ПП TEXT12_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR12_1      ; Если результат декремента не=0, то переход в ПП WR12_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №12           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки **УРОВЕНЬ В ТС**
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR12_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT12_2; записать ст. байт счетчика команд метки TEXT12_2  в w
            movwf        PCLATH 
            call         TEXT12_2    ; Переход в ПП TEXT12_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR12_2      ; Если результат декремента не=0, то переход в ПП WR12_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            call         SIGNAL      ; условный переход на SIGNAL
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №13  Вычисляемый табличный переход для 1-й строки надписи  *АВАРИЯ*СИСТЕМЫ* 
;                                           для 2-й строки надписи  *ОХЛАЖДЕНИЯ*ДВ.* 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №13
;==========+============+===========+====================================================
NADPIS13    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки *АВАРИЯ*СИСТЕМЫ*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR13_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT13_1; записать ст. байт счетчика команд метки TEXT13_1  в w
            movwf        PCLATH 
            call         TEXT13_1    ; Переход в ПП TEXT13_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR13_1      ; Если результат декремента не=0, то переход в ПП WR13_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №13           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки *ОХЛАЖДЕНИЯ*ДВ.*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR13_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT13_2; записать ст. байт счетчика команд метки TEXT13_2  в w
            movwf        PCLATH 
            call         TEXT13_2    ; Переход в ПП TEXT13_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR13_2      ; Если результат декремента не=0, то переход в ПП WR13_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
             
            call         SIGNAL      ; условный переход на SIGNAL
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №14  Вычисляемый табличный переход для 1-й строки надписи   ***tдв=±***0С***  
;                                           для 2-й строки надписи   ПЕРЕГРЕВ*МОТОРА! 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №14
;==========+============+===========+====================================================
NADPIS14    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки ***tдв=±***0С*** 
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR14_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT14_1; записать ст. байт счетчика команд метки TEXT14_1  в w
            movwf        PCLATH 
            call         TEXT14_1    ; Переход в ПП TEXT14_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR14_1      ; Если результат декремента не=0, то переход в ПП WR14_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №14           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки ПЕРЕГРЕВ*МОТОРА!
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR14_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT14_2; записать ст. байт счетчика команд метки TEXT14_2  в w
            movwf        PCLATH 
            call         TEXT14_2    ; Переход в ПП TEXT14_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR14_2      ; Если результат декремента не=0, то переход в ПП WR14_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
             
            call         SIGNAL      ; условный переход на SIGNAL
           
;===============================================================================================
PEREGREV    call         DS2         ; измерить температуру двигателя  
;===============================================================================================
; вывод на индикацию знака температуры +.
;===============================================================================================
            movlw        2Bh         ;  символ знака + записать в W
            movwf        R8          ;  переписать W в R8 
            call         D_R8        ;  вывести + на индикацию   
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
            rrf          TEMP_LSB,F  ; Деление на 2.
;===============================================================================================
; Установка (или нет) признака добавления (к показаниям) символа "1" 
; (признак устанавливается при температуре от 100 градусов и выше).
;===============================================================================================
            movlw        .100        ; 
            CLRF         FLAG        ; сбросить  регистр флагов        
            subwf        TEMP_LSB,W  ; Temp_LSB - .100 = ? Результат - в W.
            btfss        STATUS,C    ; Результат положительный или отрицательный?
            goto         $+2         ; Если отрицательный, то признак добавления символа "1" 
                                     ; не устанавливается (бит №7 регистра FLAG=0).          
            bsf          FLAG,7      ; Если положительный, то устанавливается 
                                     ; (бит №7 регистра FLAG=1).
;===============================================================================================
; Зажигание включено?
;===============================================================================================
            btfsc       PORTC,0      ; Если  зажигание выключено
            goto        $+2          ; переход на две команды вниз и выход из пп.
;===============================================================================================
; Вывод (или нет) на индикацию символа "1" (выводится при Т=100 градусов и выше).
;===============================================================================================
            btfss        FLAG,7      ; Бит №7 регистра Flag =0 или =1 ?
;===============================================================================================
            RETURN                   ; Если =0, то норма, возврат  по стеку
;===============================================================================================
            movlw        31h         ; Если =1, то символ "1" (31h) 
            movwf        R9          ; переписать из W в регистр R9
;===============================================================================================
; Если t-ра выше 100 гр. то продолжаем вывод на индикацию
;===============================================================================================
            movfw        TEMP_LSB    ; регистр TEMP_LSB в W
            movwf        TEMP        ; W----> в TEMP
            call         BIN2_10_2   ; пп BIN2_10_2 условный переход
            movf         LED1,W      ; значение из LED1 в W
            movwf        R10         ; W----> в R10
            movf         LED0,W      ; значение из LED0 в W
            movwf        R11         ; W----> в R11
            call         D_R9        ; вывести всё на индикацию R9, R10, R11
            call         D_R10       ; 
            call         D_R11       ;
            goto         PEREGREV    ; Снова замеряем температуру двигателя
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;Надпись №15  Вычисляемый табличный переход для 1-й строки надписи   ****Внимание****  
;                                           для 2-й строки надписи   *Фары*включены!* 
;==========+============+===========+====================================================
;          Вывод символов в 1-ю строку. Надпись №15
;==========+============+===========+====================================================
NADPIS15    call         INIT_LIN1   ; условный переход на пп INIT_LIN1 
                                     ; побуквенный вывод 1 строки ****Внимание****
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR15_1      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).           
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT15_1; записать ст. байт счетчика команд метки TEXT15_1  в w
            movwf        PCLATH 
            call         TEXT15_1    ; Переход в ПП TEXT15_1.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR15_1      ; Если результат декремента не=0, то переход в ПП WR15_1
;==========+============+===========+====================================================
;          Вывод символов во 2-ю строку. Надпись №15           
;==========+============+===========+====================================================
            call         INIT_LIN2   ; условный переход на пп INIT_LIN2 
                                     ; побуквенный вывод 2 строки *Фары*включены!*
            movlw        .16         ; 
            movwf        SIG         ; записать во временный регистр число проходов 
WR15_2      movf         SIG,W       ; Копирование содержимого регистра COUNT в W.
            sublw        .16         ; 16 - COUNT = ... (результат записывается в W).
            movwf        MEM         ; MEM сохраняем число для прыжка в  переходе
            bcf          STATUS,C    ; Опустить флаг С
            movlw        high TEXT15_2; записать ст. байт счетчика команд метки TEXT15_2  в w
            movwf        PCLATH 
            call         TEXT15_2    ; Переход в ПП TEXT15_2.    ПРЫГАЕМ!!!!!!
            bcf          PCLATH,3    ; Выбираем страницу 0
            CALL         ENTER       ; вывод данных
            decfsz       SIG,F       ; Подготовка к выводу на индикацию следующего перехода
            goto         WR15_2      ; Если результат декремента не=0, то переход в ПП WR15_2
        
            bcf          PORTB,RS    ; Установка на линии "RS" "0".  
            call         SIGNAL      ; Включить  сигнал.
            btfsc        PORTC,7     ; фары выключены?
            goto         $-2         ; нет фары включены
                                     ; да фары выключены далее
            RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;==========+============+===========+====================================================

;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 4-е знакоместо. 
;==========+============+===========+====================================================
D_R4       MOVLW       b'10000011'  ; Выбор ячейки DD RAM с адресом 03h (установка
                                    ; курсора в 4-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R4          ; скопировать R4 в W
           CALL        ENTER        ; вывод данных в первую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 5-е знакоместо. 
;==========+============+===========+====================================================
D_R5       MOVLW       b'10000100'  ; Выбор ячейки DD RAM с адресом 04h (установка
                                    ; курсора в 5-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R5          ; скопировать R5 в W
           CALL        ENTER        ; вывод данных в первую строку      
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 6-е знакоместо. 
;==========+============+===========+====================================================
D_R6       MOVLW       b'10000101'  ; Выбор ячейки DD RAM с адресом 05h (установка
                                    ; курсора в 6-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFw        R6          ; скопировать R6 в W
           CALL        ENTER        ; вывод данных в первую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 7-е знакоместо. 
;==========+============+===========+====================================================
D_R7       MOVLW       b'10000110'  ; Выбор ячейки DD RAM с адресом 06h (установка
                                    ; курсора в 7-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R7          ; скопировать R7 в W
           CALL        ENTER        ; вывод данных в первую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 8-е знакоместо. 
;==========+============+===========+====================================================
D_R8       MOVLW       b'10000111'  ; Выбор ячейки DD RAM с адресом 07h (установка
                                    ; курсора в 8-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R8          ; скопировать R8 в W
           CALL        ENTER        ; вывод данных в первую строку          
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 9-е знакоместо. 
;==========+============+===========+====================================================
D_R9       MOVLW       b'10001000'  ; Выбор ячейки DD RAM с адресом 08h (установка
                                    ; курсора в 9-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R9          ; скопировать R9 в W
           CALL        ENTER        ; вывод данных в первую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 10-е знакоместо. 
;==========+============+===========+====================================================
D_R10      MOVLW       b'10001001'  ; Выбор ячейки DD RAM с адресом 09h (установка
                                    ; курсора в 10-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R10         ; скопировать R10 в W
           CALL        ENTER        ; вывод данных в первую строку         
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 11-е знакоместо. 
;==========+============+===========+====================================================
D_R11      MOVLW       b'10001010'  ; Выбор ячейки DD RAM с адресом 0Ah (установка
                                    ; курсора в 11-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R11         ; скопировать R11 в W
           CALL        ENTER        ; вывод данных в первую строку          
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 12-е знакоместо. 
;==========+============+===========+====================================================
D_R12      MOVLW       b'10001011'  ; Выбор ячейки DD RAM с адресом 0Bh (установка
                                    ; курсора в 12-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R12         ; скопировать R12 в W
           CALL        ENTER        ; вывод данных в первую строку       
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 13-е знакоместо. 
;==========+============+===========+====================================================
D_R13      MOVLW       b'10001100'  ; Выбор ячейки DD RAM с адресом 0Ch (установка
                                    ; курсора в 13-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R13         ; скопировать R13 в W
           CALL        ENTER        ; вывод данных в первую строку
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 14-е знакоместо. 
;==========+============+===========+====================================================
D_R14      MOVLW       b'10001101'  ; Выбор ячейки DD RAM с адресом 0Dh (установка
                                    ; курсора в 14-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R14         ; скопировать R14 в W
           CALL        ENTER        ; вывод данных в первую строку    
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 1-ю строку 15-е знакоместо. 
;==========+============+===========+====================================================
D_R15      MOVLW       b'10001110'  ; Выбор ячейки DD RAM с адресом 0Eh (установка
                                    ; курсора в 15-е левое знакоместо 1-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R15         ; скопировать R15 в W
           CALL        ENTER        ; вывод данных в первую строку         
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 


;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 4-е знакоместо. 
;==========+============+===========+====================================================
D_R24      MOVLW       b'11000011'  ; Выбор ячейки DD RAM с адресом 43h (установка
                                    ; курсора в 4-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R24         ; скопировать R24 в W
           CALL        ENTER        ; вывод данных во вторую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 5-е знакоместо. 
;==========+============+===========+====================================================
D_R25      MOVLW       b'11000100'  ; Выбор ячейки DD RAM с адресом 44h (установка
                                    ; курсора в 5-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R25         ; скопировать R25 в W
           CALL        ENTER        ; вывод данных во вторую строку     
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 6-е знакоместо. 
;==========+============+===========+====================================================
D_R26      MOVLW       b'11000101'  ; Выбор ячейки DD RAM с адресом 45h (установка
                                    ; курсора в 6-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R26         ; скопировать R26 в W
           CALL        ENTER        ; вывод данных во вторую строку           
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 7-е знакоместо. 
;==========+============+===========+====================================================
D_R27      MOVLW       b'11000110'  ; Выбор ячейки DD RAM с адресом 46h (установка
                                    ; курсора в 7-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R27         ; скопировать R27 в W
           CALL        ENTER        ; вывод данных во вторую строку          
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 8-е знакоместо. 
;==========+============+===========+====================================================
D_R28      MOVLW       b'11000111'  ; Выбор ячейки DD RAM с адресом 47h (установка
                                    ; курсора в 8-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R28         ; скопировать R28 в W
           CALL        ENTER        ; вывод данных во вторую строку         
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 9-е знакоместо. 
;==========+============+===========+====================================================
D_R29      MOVLW       b'11001000'  ; Выбор ячейки DD RAM с адресом 48h (установка
                                    ; курсора в 9-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R29         ; скопировать R29 в W
           CALL        ENTER        ; вывод данных во вторую строку          
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 10-е знакоместо. 
;==========+============+===========+====================================================
D_R210     MOVLW       b'11001001'  ; Выбор ячейки DD RAM с адресом 49h (установка
                                    ; курсора в 10-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R210        ; скопировать R210 в W
           CALL        ENTER        ; вывод данных во вторую строку  
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 11-е знакоместо. 
;==========+============+===========+====================================================
D_R211     MOVLW       b'11001010'  ; Выбор ячейки DD RAM с адресом 4Ah (установка
                                    ; курсора в 11-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R211        ; скопировать R211 в W
           CALL        ENTER        ; вывод данных во вторую строку
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 12-е знакоместо. 
;==========+============+===========+====================================================
D_R212     MOVLW       b'11001011'  ; Выбор ячейки DD RAM с адресом 4Bh (установка
                                    ; курсора в 12-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R212        ; скопировать R212 в W
           CALL        ENTER        ;вывод данных во вторую строку     
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 13-е знакоместо. 
;==========+============+===========+====================================================
D_R213     MOVLW       b'11001100'  ; Выбор ячейки DD RAM с адресом 4Ch (установка
                                    ; курсора в 13-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R213        ; скопировать R213 в W
           CALL        ENTER        ; вывод данных во вторую строку
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 14-е знакоместо. 
;==========+============+===========+====================================================
D_R214     MOVLW       b'11001101'  ; Выбор ячейки DD RAM с адресом 4Dh (установка
                                    ; курсора в 14-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R214        ; скопировать R214 в W
           CALL        ENTER        ; вывод данных во вторую строку
           RETURN                   ; возврат по стеку.
;==========+============+===========+==================================================== 
;==========+============+===========+====================================================
;          Вывод цифры  в 2-ю строку 15-е знакоместо. 
;==========+============+===========+====================================================
D_R215     MOVLW       b'11001110'  ; Выбор ячейки DD RAM с адресом 4Eh (установка
                                    ; курсора в 15-е левое знакоместо 2-й строки).
           BCF         PORTB,RS     ; Установка на линии "RS" "0".
           CALL        ENTER        ; вывод
           BSF         PORTB,RS     ; Установка на линии "RS" "1". 
           MOVFW        R215        ; скопировать R215 в W
           CALL        ENTER        ; вывод данных во вторую строку      
           RETURN                   ; возврат по стеку.
;==========+============+===========+====================================================
;==========+============+===========+====================================================
;          Сброс  регистров  общего назначения.
;==========+============+===========+====================================================
SBROS       clrf        znak
            clrf        TEMP_L
            CLRF        TEMP_H
            clrf        COUNT
	    clrf        COUNT1
	    clrf        COUNT2
            clrf        TEMP1

	    clrf        i1_sum_H     ; Суммы тока 1,2,3
	    clrf        i1_sum_M     ;
	    clrf        i1_sum_L     ; 

	    clrf	SUMM_H
	    clrf	SUMM_M
   	    clrf	SUMM_L 

            clrf        result_L
            clrf        result_M
            clrf        result_H
            RETURN
;==========+============+===========+====================================================
;===============================================================================================
; Устанавливаем колличество выборок в данном случае 250
;===============================================================================================      
ACPTOKA     movlw	Viborki	     ; Колличество выборок
	    movwf	TEMP 
            call        SBROS        ; производим сброс Рег. для замеров.
         
;===============================================================================================
; ПП обработки данных для датчика тока 
;===============================================================================================
ACPI 	    	 
            movlw	AN0                     ; Выбор 0 канала тока
	    movwf	ADCON0
	    call	DELAY_Viborki		; Задержка между выборками
	    movf	i1_sum_L,w		; Перезапись суммы тока 1 в текущие регистры
	    movwf	SUMM_L			;
	    movf	i1_sum_M,w		;
	    movwf	SUMM_M			;
	    movf	i1_sum_H,w		;
	    movwf	SUMM_H			;
	    btfsc	znak,1			; Проверить знак суммы тока 1
	    goto	$+3
	    bcf	        znak,0			; Если 0, то +
	    goto	$+2
	    bsf	        znak,0			; Если 1, то -
	    call	ADC_Data_i		; Получение данных и суммы 1 канала тока
	    movf	SUMM_L,w		; Перезапись из текущих регистров в суммы тока 1
	    movwf	i1_sum_L		;
	    movf	SUMM_M,w		;
	    movwf	i1_sum_M		;
	    movf	SUMM_H,w		;
	    movwf	i1_sum_H		;
	    btfsc	znak,0			; Проверить текущий знак суммы тока
	    goto	$+3
	    bcf	        znak,1			; Если 0, то +
     	    goto	$+2
	    bsf	        znak,1			; Если 1, то -
;===============================================================================================
; Проверяем колличество выборок
;===============================================================================================
	    decfsz	TEMP,f                  ; Если 0 то переход на Сред. арифм. знач.
	    goto	ACPI                    ; Если не 0 то goto  ACPI 
;===============================================================================================
; Находим среднее арифметическое значение
;===============================================================================================
SAZ_i1
	    movf	i1_sum_L,w		; Находим САЗ i1 (результат делим на выборки)
    	    movwf	divid_L
	    movf	i1_sum_M,w		
	    movwf	divid_M
	    movf	i1_sum_H,w		
	    movwf	divid_H
	    movlw	Viborki		
	    movwf	divir
	    call	DEL_3B1B		; Деление
	    call	KORREKC			; Умножаем на коэф коррекции датчика тока
	        
            movf	divid_L,w
	    movwf	TEMP_L
            movf	divid_M,w
	    movwf	TEMP_H

            btfsc       znak,1                  ; Проверка знака протекания тока
            goto        $+4                     ; Если 1 то "-", 
            movlw       2Bh                     ; записить знак "+" в W
            movwf       znak                    ; Сохранить в znak
            goto        $+3                     ; Знак записан переходим на BIN2_10
            movlw       2Dh                     ; записить знак "-" в W
            movwf       znak                    ; Сохранить в znak
            RETURN                              ; Возврат по стеку.
;===============================================================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;       Деление 24 на 8 бит (Взял готовую, работает!)
;==========+============+===========+===========================================================
DEL_3B1B
	movf	divir,f
	BTFSS   STATUS,Z
	GOTO    FXD248U
	MOVLW	b'00000001'
        movwf	divir
FXD248U
	CLRF    TEMP1			;remainder
	MOVLW   d'24'
	MOVWF   TEMP
LOOPU248
	RLF     divid_L,W		;shift dividend left to move next bit to remainder
	RLF     divid_M,F		;
	RLF     divid_H,F		;
	RLF     TEMP1,F			;shift carry (next dividend bit) into remainder
	RLF     divid_L,F		;finish shifting the dividend and save carry in x.0,
					;since remainder can be 9 bit long in some cases
					;This bit will also serve as the next result bit.
         
	MOVF    divir,W			;substract divisor from 8-bit remainder
	SUBWF   TEMP1,F        
	BTFSC   STATUS,0		;if no borrow after 8 bit subtraction
	BSF     divid_L,0		;then there is no borrow in result. Overwrite
 
	BTFSS   divid_L,0		;if no borrow after 9-bit subtraction
	ADDWF   TEMP1,F			;restore remainder. (w contains the value 
					;subtracted from it previously)
	DECFSZ  TEMP,F    
	GOTO    LOOPU248 

	return

;==========+============+===========+===========================================================
;   Коррекция датчика тока (умножаем на соотношение множителя к делителю)1.2
;==========+============+===========+===========================================================

KORREKC

	movlw	.121			; Множитель
	movwf	TEMP2			; 

	movf	divid_L,w		;запись в регистр мл. 
	movwf	TEMP
	movf	divid_M,w		;запись в регистр мл. 
	movwf	TEMP1
top
	movf	divid_L,w
	addwf	TEMP,f
	btfsc	STATUS,C
	incf	TEMP1,f
	movf	divid_M,w
	addwf	TEMP1,f
	decfsz	TEMP2,f
	goto	top

	movf	TEMP,w			;запись в регистр мл. 
	movwf	divid_L
	movf	TEMP1,w			;запись в регистр мл. 
	movwf	divid_M

;DEL_3B1B				; Делим 

	CLRF    TEMP1			;remainder
	CLRF    divid_H
	MOVLW   d'24'
	MOVWF   TEMP
LOOP_DEL
	RLF     divid_L,W		;shift dividend left to move next bit to remainder
	RLF     divid_M,F		;
	RLF     divid_H,F		;
	RLF     TEMP1,F			;shift carry (next dividend bit) into remainder
	RLF     divid_L,F		;finish shifting the dividend and save carry in x.0,
					;since remainder can be 9 bit long in some cases
					;This bit will also serve as the next result bit.
         
	movlw	.100      		; Делитель
	SUBWF   TEMP1,F        
	BTFSC   STATUS,0		;if no borrow after 8 bit subtraction
	BSF     divid_L,0		;then there is no borrow in result. Overwrite
 
	BTFSS   divid_L,0		;if no borrow after 9-bit subtraction
	ADDWF   TEMP1,F			;restore remainder. (w contains the value 
					;subtracted from it previously)
	DECFSZ  TEMP,F    
	GOTO    LOOP_DEL

	return

;==========+============+===========+===========================================================
;       Задержки 
;==========+============+===========+===========================================================
DELAY_Viborki				; Между выборками

	movlw	T_Viborki
	movwf	COUNT
	decfsz	COUNT,f
	goto	$-1
	return
;==========+============+===========+===========================================================
;###############################################################################################
; Подпрограмма измерения уровня аналогового сигнала, присутствующего на выводе , RA1
;###############################################################################################
; Готовую заготовку взял с программы Корабельникова А.А. обмена 4_111
;===============================================================================================
; Циклическая подпрограмма измерения уровня аналогового сигнала, присутствующего
; на выводе RA0, или АЦП Тока
;===============================================================================================
ADC_Data_i				; АЦП ТОКА
       	bsf	ADCON0,GO		; Старт АЦП
	btfsc	ADCON0,GO
	goto	$-1
      	movf	ADRESH,w		
	movwf	result_M
	bsf	STATUS,RP0
	movf	ADRESL,w
	bcf	STATUS,RP0
	movwf	result_L


        movlw   KORR_I                  ; Корректировка нуля 
        bcf     STATUS,C                ; поднять флаг С
        addwf   result_L,f              ; result_L- W= 
        btfsc   STATUS,C                ; проверка заем был? С=0?
        incf    result_M,f              ; да заем был вычитаем 1 из старшего бита
                                        ; нет заема не было С=1 и програма пошла далее 

 	btfsc	result_M,1		; Проверка на + тока, второй разряд старшего байта
	goto	TOK_Plus		; Если 1 PWR>511 ток в +
	comf	result_L,f		; Если ток минус, инверсия значений
	comf	result_M,f		;
	movlw	b'00000001'		; Очищаем старший байт, оставляя только младший разряд
	andwf	result_M,f		;
	btfss   znak,0			; Проверяем знак предыдущей суммы. Если 0 то SUMM +
	goto	TOK_Minus		; Иначе SUMM -
	goto	TOK_Plus_Neg		; Сумма отрицательных величин

TOK_Plus
	bcf	result_M,1		; Вычитаем 512, так как ток в плюсе
	bcf	STATUS,C
	btfsc	znak,0			; Проверяем знак предыдущей суммы. Если 1, сумма тока -
	goto	TOK_Minus		; Если предыдущая сумма -, а текущее +

TOK_Plus_Neg				; Суммируем отрицательные значения, оставляя знак общей суммы минус
	bcf	result_M,1
	bcf	STATUS,C
	movf    result_L,w
	addwf   SUMM_L,f
	btfsc   STATUS,C
	incf    SUMM_Mt,f
	bcf	STATUS,C
	movf    result_M,w
	addwf   SUMM_M,f
	btfsc   STATUS,C
	incf    SUMM_H,f
	bcf	STATUS,C
	movf    SUMM_Mt,w
	addwf   SUMM_M,f
	btfsc   STATUS,C
	incf    SUMM_H,f
	clrf	SUMM_Mt
	return

TOK_Minus				; Вычитаем из предыдущей суммы текущее значение тока
	movf	result_L,w		; 
	subwf	SUMM_L,f		; STATUS,C: =0 - отрицательный, =1 - нулевой или положительный
	movf	result_M,w		; STATUS,Z: =0 - результат ненулевой, =1 - результат нулевой
	btfss	STATUS,C
	incfsz	result_M,w
	subwf	SUMM_M,f
	movf	result_H,w
	btfss	STATUS,C
	incfsz	result_H,w 
	subwf	SUMM_H,f
	btfss   STATUS,C
	goto	TOK_Minus_Neg
	return				; Результат положительный, выходим
TOK_Minus_Neg				; Результат отрицательный
	comf    SUMM_L,f		; Переводим из дополнительного кода в прямой
	comf    SUMM_M,f		;
	comf    SUMM_H,f		;
	incfsz  SUMM_L,f		;
	goto	TOK_Minus_Vih
	incfsz  SUMM_M,f		;
	goto	TOK_Minus_Vih
	incf    SUMM_H,f		;
TOK_Minus_Vih
	btfsc	znak,0			; Проверить знак предыдущей суммы тока
	goto	$+3			; Если был - 
	bsf	znak,0			; Если был +, то устанавливаем -
	goto	$+2
	bcf	znak,0			; Устанавливаем +
	return                  

;=============================================================================================
;#############################################################################################
; Начало работы с датчиком DS1820. DS1
;#############################################################################################
; Инициализация DS1820.
;---------------------------------------------------------------------------------------------
DS1          
            bcf        INTCON,7    ; запретить прерывания    
            
            CALL       DQ_INIT1    ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT1.
;---------------------------------------------------------------------------------------------
; Команда Skip_ROM (CCh).
; Команда пропуска процедуры сравнения серийного номера. Применяется в случае
; использования одного датчика (как в данном случае).
;---------------------------------------------------------------------------------------------
            MOVLW      0CCH        ; Запись команды CCH
            MOVWF      TEMP        ; в регистр TEMP.
            CALL       OUT_BYTE1   ; Переход в ПП передачи байта OUT_BYTE1.
;----> Возврат по стеку из ПП OUT_BYTE1.
;---------------------------------------------------------------------------------------------
; Команда Start_Conv (44H). 
; Эта команда запускает процесс преобразования температуры. В течение времени ее 
; исполнения, DS1820 не реагирует на команды "мастера". Это время нужно просто переждать.
;---------------------------------------------------------------------------------------------
            MOVLW      44H         ; Запись команды 44H
            MOVWF      TEMP        ; в регистр Temp.
            CALL       OUT_BYTE1   ; Переход в ПП передачи байта OUT_BYTE1.
;----> Возврат по стеку из ПП OUT_BYTE1.
;---------------------------------------------------------------------------------------------
; Ожидание завершения процесса преобразования температуры. 
; То что Вы видите ниже, есть один из способов реализации "плавающей" (следящей)
; задержки (можно применить фиксированную задержку).
;---------------------------------------------------------------------------------------------
WAIT1        CALL       IN_BYTE1   ; Переход в ПП приема байта IN_BYTE1.
;----> Возврат по стеку из ПП IN_BYTE1.
            MOVLW      b'11111111' ; Запись в W числа FFH.
            SUBWF      TEMP,W      ; TEMP - FFH = ...
            BTFSS      STATUS,Z    ; Z=0 или Z=1 (нулевой результат)?
            GOTO       WAIT1        ; Если Z=0, то ждем дальше.
                                   ; Если Z=1 (Temp заполнен единицами, то есть,
                                   ; на линии появился и надежно зафиксировался уровень 1),
                                   ; то программа исполняется далее.
;---------------------------------------------------------------------------------------------
; Инициализация DS1820.
;---------------------------------------------------------------------------------------------
            CALL       DQ_INIT1     ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT1.
;---------------------------------------------------------------------------------------------
; Еще одна команда Skip_ROM (CCh). 
;---------------------------------------------------------------------------------------------
            MOVLW      0CCH        ; Запись команды CCH
            MOVWF      TEMP        ; в регистр TEMP.
            CALL       OUT_BYTE1   ; Переход в ПП передачи байта OUT_BYTE1.
;----> Возврат по стеку из ПП OUT_BYTE1.
;---------------------------------------------------------------------------------------------
; Команда Read Scratchpad (BEh).
; Чтение содержимого блокнотной памяти в части касающейся байтов температуры.
;---------------------------------------------------------------------------------------------
            MOVLW      0BEH        ; Запись команды BEH 
            MOVWF      TEMP        ; в регистр TEMP. 
            CALL       OUT_BYTE1   ; Переход в ПП передачи байта OUT_BYTE1.
;----> Возврат по стеку из ПП OUT_BYTE1.

            CALL       IN_BYTE1    ; Чтение младшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE1.
            MOVWF      TEMP_LSB    ; Запись принятого байта в регистр TEMP_LSB.

            CALL       IN_BYTE1    ; Чтение старшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE1.
            MOVWF      TEMP_MSB    ; Запись принятого байта в регистр TEMP_MSB.
;---------------------------------------------------
; Итог; в TEMP_MSB записан старший байт температуры,
; а в TEMP_LSB записан младший байт температуры.
;---------------------------------------------------
            bsf        STATUS,RP0  ; установить 1 банк
            bcf        TRISA,2     ; вывод RA2 на выход
            bcf        STATUS,RP0  ; установить 0 банк
;=============================================================================================
;=============================================================================================
;=============================================================================================
; записать константу для коррекции часов т.к. прерывания были запрещены и часы отстали.
;============================================================================================= 
            movlw        .250         ; Вводим дополнительную задержку для тонкой доводки
            movwf        SIG_L        ; времени до "целых" чисел не расчитано, подобрано в ручную
            movlw        .66          ; 'долгими и нудными часами ожидания результатов          
            movwf        SIG_M       
            decfsz       SIG_L,F      ; Организация циклов           
            goto         $-1          ; если декремент калибровки =0 то пропустить   
            decfsz       SIG_M,F      ; Организация циклов           
            goto         $-3          ; если декремент калибровки =0 то пропустить 
            movlw        .1           ; записать ежесекундную корекцию счетчика секунд
            movwf        COR_SEC      ; в регистр COR_SEC         
            movlw        .45          ; записать константу для корекции рег. MSEC  45         
            call         TIME_CORECT  ; переход на пп коррекции времени часов

;=============================================================================================
; Разрешение прерываний и возврат по стеку
;=============================================================================================                    
            bsf        INTCON,7    ; разрешить прерывания 
;=============================================================================================
;=============================================================================================
;=============================================================================================
            RETURN                 ; Возврат по стеку.
;*********************************************************************************************
;=============================================================================================
; Подпрограмма инициализации 1-Wire устройства (DS1820).
;=============================================================================================
DQ_INIT1     CALL       PIN_HI1    ; Установка вывода в высокоимпедансное состояние: за счет
                                   ; подтягивающего резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI1.
            CALL       PIN_LO1     ; Установка на линии нуля.
;----> Возврат по стеку из ПП PIN_LO.
            MOVLW      .60         ; Установка количества проходов по 10мкс.
            CALL       PAUSE_X1    ; Переход в ПП задержки (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
            CALL       PIN_HI1     ; Установка вывода в высокоимпедансное состояние: за счет
                                   ; подтягивающего резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI1.
            MOVLW      .60         ; Установка количества проходов по 10мкс.
            CALL       PAUSE_X1    ; Переход в ПП задержки (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.

            RETURN                 ; Возврат по стеку.
;*********************************************************************************************
; Подпрограмма задержки.
;=============================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X1     MOVWF      COUNT         ; Копирование количества проходов из W в Count.
;----------------------------------------
; Пауза в 10 мкс.
;----------------------------------------
PAUSE_101    NOP                      ; 
            GOTO       $+1            ; Одноразрядный,
            GOTO       $+1            ; вычитающий
            GOTO       $+1            ; счетчик
            DECFSZ     COUNT,F        ; с "врезкой".
            GOTO       PAUSE_101      ; 

            RETURN                    ; Возврат по стеку.
;=============================================================================================
;*********************************************************************************************
; Базовые процедуры чтения/записи по 1-Wire протоколу.
;*********************************************************************************************
; Подпрограмма передачи "мастером" байта: цикл передачи бита начинается импульсом  
; низкого уровня длительностью 1...15 мкс, далее следует передаваемый бит. 
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;=============================================================================================
OUT_BYTE1   MOVLW      .8           ; Запись количества бит передаваемого
            MOVWF      N            ; байта в регистр N.

METKA_11    RRF        TEMP,F       ; Сдвиг вправо содержимого передаваемого байта.
            BTFSS      STATUS,C     ; В бите С "лежит" 0 или 1 ?
            GOTO       OUT_01       ; Если С=0, то переход в ПП передачи нуля.
            GOTO       OUT_11       ; Если С=1, то переход в ПП передачи единицы.

METKA_21    DECFSZ     N,F          ; Уменьшение на 1 содержимого счетчика битов.
            GOTO       METKA_11     ; Если результат не =0, то переход на метку METKA_1.
            RETURN                  ; Если результат =0, то возврат по стеку.
;=============================================================================================
; Подпрограмма приема "мастером" байта: цикл приема бита начинается импульсом  
; низкого уровня длительностью 1...15 мкс, после чего DS1820 выставляет на линии бит. 
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;=============================================================================================
IN_BYTE1    MOVLW      .8           ; Запись количества бит принимаемого
            MOVWF      N            ; байта в регистр N.
            CLRF       TEMP         ; Очистка регистра принимаемого байта.

IN_BYTE_11   CALL       PIN_LO1     ; Формирование на линии уровня 0.
;----> Возврат по стеку из ПП PIN_LO1.

            CALL       PIN_HI1      ; Формирование на линии уровня 1.
;----> Возврат по стеку из ПП PIN_HI1. 
            NOP                     ; Калибровочный NOP.
;-------------------------------------------------------------------
; Запись, в бит С, уровня текущего бита, выдаваемого DS1820 в линию.
;-------------------------------------------------------------------
            BTFSS     PORTC,DQ1     ; На линии 0 или 1 ? 
            BCF       STATUS,C      ; Если на линии 0, то в бите С выставляется 0.
            BTFSC     PORTA,DQ1     ; Если на линии 1 (а также после исполнения предыдущей
                                    ; команды), то еще одна проверка состояния линии.
            BSF       STATUS,C      ; Если на линии 1, то в бите С выставляется 1.
                                    ; Если на линии 0 (а также после исполнения предыдущей
                                    ; команды), то программа исполняется далее.
;-------------------------------------------------------------------
; Последовательное заполнение битами регистра TEMP.
;-------------------------------------------------------------------
            RRF       TEMP,F        ; Сдвиг содержимого регистра TEMP вправо (через C).
            MOVLW     .4            ; Установка количества проходов по 10мкс.
            CALL      PAUSE_X1      ; Переход в ПП задержки (задержка=4х10=40мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
            DECFSZ    N,F           ; Уменьшение на 1 содержимого счетчика битов.
            GOTO      IN_BYTE_11    ; Если результат не=0, то переход 
                                    ; на прием следующего бита.
            MOVF      TEMP,W        ; Если =0, то копирование принятого байта в регистр W.
            RETURN                  ; Возврат по стеку.
;=============================================================================================
; Подпрограмма передачи бита с уровнем "0".
;=============================================================================================
OUT_01       CALL       PIN_LO1      ; Переход в ПП установки уровня 0. Начало передачи.
;----> Возврат по стеку из ПП PIN_LO1.
            MOVLW      .6            ; Установка количества проходов по 10мкс.                   
            CALL       PAUSE_X1      ; Переход в ПП задержки (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
            CALL       PIN_HI1       ; Переход в ПП установки уровня 1. Конец передачи.
;----> Возврат по стеку из ПП PIN_HI1.
            GOTO       METKA_21      ; Переход на исполнение процедуры декремента 
                                     ; и анализа содержимого счетчика битов.
;=============================================================================================
; Подпрограмма передачи бита с уровнем "1".
;=============================================================================================
OUT_11       CALL       PIN_LO1      ; Переход в ПП установки уровня 0. Начало передачи.
;----> Возврат по стеку из ПП PIN_LO1.
            CALL       PIN_HI1       ; Переход в ПП установки уровня 1. (передача 1).
;----> Возврат по стеку из ПП PIN_HI1.
            MOVLW      .6            ; Установка количества проходов по 10мкс.                  
            CALL       PAUSE_X1      ; Переход в ПП задержки (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
            GOTO       METKA_21      ; Переход на новый цикл передачи бита.
;---------------------------------------------------------------------------------------------
; Формирование на линии уровня "1" за счет подтягивающего резистора
;---------------------------------------------------------------------------------------------
PIN_HI1     BSF        STATUS,RP0   ; Переход в банк 1.
            BSF        TRISA,DQ1    ; Настройка вывода RA1 на работу "на вход".
            BCF        STATUS,RP0   ; Переход в банк 0.
            RETURN                  ; Возврат по стеку.
;---------------------------------------------------------------------------------------------
; Формирование на линии уровня "0" средствами микроконтроллера
;---------------------------------------------------------------------------------------------
PIN_LO1     BCF        PORTA,DQ1    ; Установка 0 на выходе защелки вывода RA2.
            BSF        STATUS,RP0   ; Переход в банк 1.
            BCF        TRISA,DQ1    ; Настройка вывода RA2 на работу "на выход".
            BCF        STATUS,RP0   ; Переход в банк 0.
            RETURN                  ; Возврат по стеку.

;#############################################################################################
;_____________________________________________________________________________________________


;#############################################################################################
; Начало работы с датчиком DS1820. DS2
;#############################################################################################
; Инициализация DS1820.
;---------------------------------------------------------------------------------------------
DS2         bcf        INTCON,7    ; запретить прерывания 
            CALL       DQ_INIT2    ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT2.
;---------------------------------------------------------------------------------------------
; Команда Skip_ROM (CCh).
; Команда пропуска процедуры сравнения серийного номера. Применяется в случае
; использования одного датчика (как в данном случае).
;---------------------------------------------------------------------------------------------
            MOVLW      0CCH        ; Запись команды CCH
            MOVWF      TEMP        ; в регистр TEMP.
            CALL       OUT_BYTE2   ; Переход в ПП передачи байта OUT_BYTE2.
;----> Возврат по стеку из ПП OUT_BYTE2.
;---------------------------------------------------------------------------------------------
; Команда Start_Conv (44H). 
; Эта команда запускает процесс преобразования температуры. В течение времени ее 
; исполнения, DS1820 не реагирует на команды "мастера". Это время нужно просто переждать.
;---------------------------------------------------------------------------------------------
            MOVLW      44H         ; Запись команды 44H
            MOVWF      TEMP        ; в регистр Temp.
            CALL       OUT_BYTE2   ; Переход в ПП передачи байта OUT_BYTE2.
;----> Возврат по стеку из ПП OUT_BYTE2.
;---------------------------------------------------------------------------------------------
; Ожидание завершения процесса преобразования температуры. 
; То что Вы видите ниже, есть один из способов реализации "плавающей" (следящей)
; задержки (можно применить фиксированную задержку).
;---------------------------------------------------------------------------------------------
WAIT2        CALL       IN_BYTE2   ; Переход в ПП приема байта IN_BYTE2.
;----> Возврат по стеку из ПП IN_BYTE1.
            MOVLW      b'11111111' ; Запись в W числа FFH.
            SUBWF      TEMP,W      ; TEMP - FFH = ...
            BTFSS      STATUS,Z    ; Z=0 или Z=1 (нулевой результат)?
            GOTO       WAIT2       ; Если Z=0, то ждем дальше.
                                   ; Если Z=1 (Temp заполнен единицами, то есть,
                                   ; на линии появился и надежно зафиксировался уровень 1),
                                   ; то программа исполняется далее.
;---------------------------------------------------------------------------------------------
; Инициализация DS1820.
;---------------------------------------------------------------------------------------------
            CALL       DQ_INIT2     ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT2.
;---------------------------------------------------------------------------------------------
; Еще одна команда Skip_ROM (CCh). 
;---------------------------------------------------------------------------------------------
            MOVLW      0CCH        ; Запись команды CCH
            MOVWF      TEMP        ; в регистр TEMP.
            CALL       OUT_BYTE2   ; Переход в ПП передачи байта OUT_BYTE2.
;----> Возврат по стеку из ПП OUT_BYTE2.
;---------------------------------------------------------------------------------------------
; Команда Read Scratchpad (BEh).
; Чтение содержимого блокнотной памяти в части касающейся байтов температуры.
;---------------------------------------------------------------------------------------------
            MOVLW      0BEH        ; Запись команды BEH 
            MOVWF      TEMP        ; в регистр TEMP. 
            CALL       OUT_BYTE2   ; Переход в ПП передачи байта OUT_BYTE2.
;----> Возврат по стеку из ПП OUT_BYTE2.

            CALL       IN_BYTE2    ; Чтение младшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE2
            MOVWF      TEMP_LSB    ; Запись принятого байта в регистр TEMP_LSB.

            CALL       IN_BYTE2    ; Чтение старшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE2.
            MOVWF      TEMP_MSB    ; Запись принятого байта в регистр TEMP_MSB.

;---------------------------------------------------
; Итог; в TEMP_MSB записан старший байт температуры,
; а в TEMP_LSB записан младший байт температуры.
;---------------------------------------------------
            bsf        STATUS,RP0  ; установить 1 банк
            bcf        TRISA,5     ; вывод RA5 на выход         
            bcf        STATUS,RP0  ; установить 0 банк
;=============================================================================================
;=============================================================================================
;=============================================================================================
; записать константу для коррекции часов т.к. прерывания были запрещены и часы отстали.
;============================================================================================= 
            movlw        .250         ; Вводим дополнительную задержку для тонкой доводки
            movwf        SIG_L        ; времени до "целых" чисел не расчитано, подобрано в ручную
            movlw        .66          ; 'долгими и нудными часами ожидания результатов          
            movwf        SIG_M       
            decfsz       SIG_L,F      ; Организация циклов           
            goto         $-1          ; если декремент калибровки =0 то пропустить   
            decfsz       SIG_M,F      ; Организация циклов           
            goto         $-3          ; если декремент калибровки =0 то пропустить 
            movlw        .1           ; записать ежесекундную корекцию счетчика секунд
            movwf        COR_SEC      ; в регистр COR_SEC         
            movlw        .45          ; записать константу для корекции рег. MSEC  45         
            call         TIME_CORECT  ; переход на пп коррекции времени часов

;=============================================================================================
;=============================================================================================
; Разрешение прерываний и возврат по стеку
;=============================================================================================                    
            bsf        INTCON,7    ; разрешить прерывания 
            
;=============================================================================================
;=============================================================================================
;=============================================================================================
 
            RETURN                  ; Возврат по стеку.
;*********************************************************************************************
;=============================================================================================
; Подпрограмма инициализации 1-Wire устройства (DS1820).
;=============================================================================================
DQ_INIT2     CALL       PIN_HI2    ; Установка вывода в высокоимпедансное состояние: за счет
                                   ; подтягивающего резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI2.
            CALL       PIN_LO2     ; Установка на линии нуля.
;----> Возврат по стеку из ПП PIN_LO.
            MOVLW      .60         ; Установка количества проходов по 10мкс.
            CALL       PAUSE_X2    ; Переход в ПП задержки (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X2.
            CALL       PIN_HI2     ; Установка вывода в высокоимпедансное состояние: за счет
                                   ; подтягивающего резистора, на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI2.
            MOVLW      .60         ; Установка количества проходов по 10мкс.
            CALL       PAUSE_X2    ; Переход в ПП задержки (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X2.

            RETURN                 ; Возврат по стеку.
;*********************************************************************************************
; Подпрограмма задержки.
;=============================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X2     MOVWF      COUNT         ; Копирование количества проходов из W в Count.
;----------------------------------------
; Пауза в 10 мкс.
;----------------------------------------
PAUSE_102    NOP                      ; 
            GOTO       $+1            ; Одноразрядный,
            GOTO       $+1            ; вычитающий
            GOTO       $+1            ; счетчик
            DECFSZ     COUNT,F        ; с "врезкой".
            GOTO       PAUSE_102      ; 

            RETURN                    ; Возврат по стеку.
;=============================================================================================
;*********************************************************************************************
; Базовые процедуры чтения/записи по 1-Wire протоколу.
;*********************************************************************************************
; Подпрограмма передачи "мастером" байта: цикл передачи бита начинается импульсом  
; низкого уровня длительностью 1...15 мкс, далее следует передаваемый бит. 
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;=============================================================================================
OUT_BYTE2   MOVLW      .8           ; Запись количества бит передаваемого
            MOVWF      N            ; байта в регистр N.

METKA_12    RRF        TEMP,F       ; Сдвиг вправо содержимого передаваемого байта.
            BTFSS      STATUS,C     ; В бите С "лежит" 0 или 1 ?
            GOTO       OUT_02       ; Если С=0, то переход в ПП передачи нуля.
            GOTO       OUT_12       ; Если С=1, то переход в ПП передачи единицы.

METKA_22    DECFSZ     N,F          ; Уменьшение на 1 содержимого счетчика битов.
            GOTO       METKA_12     ; Если результат не =0, то переход на метку METKA_2.
            RETURN                  ; Если результат =0, то возврат по стеку.
;=============================================================================================
; Подпрограмма приема "мастером" байта: цикл приема бита начинается импульсом  
; низкого уровня длительностью 1...15 мкс, после чего DS1820 выставляет на линии бит. 
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;=============================================================================================
IN_BYTE2    MOVLW      .8           ; Запись количества бит принимаемого
            MOVWF      N            ; байта в регистр N.
            CLRF       TEMP         ; Очистка регистра принимаемого байта.

IN_BYTE_12   CALL       PIN_LO2     ; Формирование на линии уровня 0.
;----> Возврат по стеку из ПП PIN_LO2.

            CALL       PIN_HI2      ; Формирование на линии уровня 1.
;----> Возврат по стеку из ПП PIN_HI2. 
            NOP                     ; Калибровочный NOP.
;-------------------------------------------------------------------
; Запись, в бит С, уровня текущего бита, выдаваемого DS1820 в линию.
;-------------------------------------------------------------------
            BTFSS     PORTC,DQ2     ; На линии 0 или 1 ? 
            BCF       STATUS,C      ; Если на линии 0, то в бите С выставляется 0.
            BTFSC     PORTA,DQ2     ; Если на линии 1 (а также после исполнения предыдущей
                                    ; команды), то еще одна проверка состояния линии.
            BSF       STATUS,C      ; Если на линии 1, то в бите С выставляется 1.
                                    ; Если на линии 0 (а также после исполнения предыдущей
                                    ; команды), то программа исполняется далее.
;-------------------------------------------------------------------
; Последовательное заполнение битами регистра TEMP.
;-------------------------------------------------------------------
            RRF       TEMP,F        ; Сдвиг содержимого регистра TEMP вправо (через C).
            MOVLW     .4            ; Установка количества проходов по 10мкс.
            CALL      PAUSE_X2      ; Переход в ПП задержки (задержка=4х10=40мкс.).
;----> Возврат по стеку из ПП PAUSE_X2.
            DECFSZ    N,F           ; Уменьшение на 1 содержимого счетчика битов.
            GOTO      IN_BYTE_12    ; Если результат не=0, то переход 
                                    ; на прием следующего бита.
            MOVF      TEMP,W        ; Если =0, то копирование принятого байта в регистр W.
            RETURN                  ; Возврат по стеку.
;=============================================================================================
; Подпрограмма передачи бита с уровнем "0".
;=============================================================================================
OUT_02       CALL       PIN_LO2     ; Переход в ПП установки уровня 0. Начало передачи.
;----> Возврат по стеку из ПП PIN_LO2.
            MOVLW      .6           ; Установка количества проходов по 10мкс.                   
            CALL       PAUSE_X2     ; Переход в ПП задержки (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X2.
            CALL       PIN_HI2      ; Переход в ПП установки уровня 1. Конец передачи.
;----> Возврат по стеку из ПП PIN_HI2.
            GOTO       METKA_22     ; Переход на исполнение процедуры декремента 
                                    ; и анализа содержимого счетчика битов.
;=============================================================================================
; Подпрограмма передачи бита с уровнем "1".
;=============================================================================================
OUT_12       CALL       PIN_LO2      ; Переход в ПП установки уровня 0. Начало передачи.
;----> Возврат по стеку из ПП PIN_LO2.
            CALL       PIN_HI2       ; Переход в ПП установки уровня 1. (передача 1).
;----> Возврат по стеку из ПП PIN_HI2.
            MOVLW      .6            ; Установка количества проходов по 10мкс.                  
            CALL       PAUSE_X2      ; Переход в ПП задержки (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X2.
            GOTO       METKA_22      ; Переход на новый цикл передачи бита.
;---------------------------------------------------------------------------------------------
; Формирование на линии уровня "1" за счет подтягивающего резистора
;---------------------------------------------------------------------------------------------
PIN_HI2     BSF        STATUS,RP0   ; Переход в банк 1.
            BSF        TRISA,DQ2    ; Настройка вывода RA1 на работу "на вход".
            BCF        STATUS,RP0   ; Переход в банк 0.
            RETURN                  ; Возврат по стеку.
;---------------------------------------------------------------------------------------------
; Формирование на линии уровня "0" средствами микроконтроллера
;---------------------------------------------------------------------------------------------
PIN_LO2     BCF        PORTA,DQ2    ; Установка 0 на выходе защелки вывода RA5.
            BSF        STATUS,RP0   ; Переход в банк 1.
            BCF        TRISA,DQ2    ; Настройка вывода RA5 на работу "на выход".
            BCF        STATUS,RP0   ; Переход в банк 0.
            RETURN                  ; Возврат по стеку.

;#############################################################################################
;_____________________________________________________________________________________________



;###############################################################################################
; Подпрограмма измерения уровней аналоговых сигналов, присутствующих на выводах RA0, RA1
;###############################################################################################
;===============================================================================================
; Циклическая подпрограмма измерения уровня аналогового сигнала, присутствующего
; на выводе RA0
;===============================================================================================
; Работа с регистром Adcon0.
;===============================================================================================
ACPU        bsf        STATUS,RP0   ; уст. 1 банк 
            movlw      b'10000100'  ; Диапазон квантования напряжения от -Vss до + Vdd,   
            movwf      ADCON1       ; AN0,AN1,AN3-аналоговые входы, AN2,AN4-цифровые каналы 
                                    ; ввода/вывода, правое выравнивание.
            bcf        STATUS,RP0   ; уст. 0 банк
             
	    movlw	AN1        ; Выбор 1 канала напряжения
	    movwf	ADCON0
;===============================================================================================
; Задержка для перезаряда конденсатора.
;===============================================================================================
            movlw      .6          ; Стандартный,
            movwf      COUNT       ; вычитающий,
            decfsz     COUNT,F     ; однобайтный
            goto       $-1         ; счетчик.
          
;===============================================================================================
; Начало аналого-цифрового преобразования.
;===============================================================================================
            bsf        ADCON0,GO   ; Включение преобразования. Конденсатор отключается 
                                   ; от аналогового входа на время преобразования. 
;===============================================================================================
; Ожидание окончания АЦП ("плавающая" задержка).
;===============================================================================================
            btfsc      ADCON0,GO   ; Ожидание окончания аналого-цифрового 
            goto       $-1         ; преобразования. 
;===============================================================================================
; АЦП закончено. Результат - в AdresH/AdresL.
; Копирование результата в Temp_H/Temp_L.
;===============================================================================================
            bsf        STATUS,RP0  ; Переход в 1-й банк.
            movf       ADRESL,W    ; AdresL --> W.
            bcf        STATUS,RP0  ; Переход в 0-й банк.
            movwf      TEMP_L      ; W --> Temp_L.

            movf       ADRESH,W    ; AdresH --> W.
            movwf      TEMP_H      ; W --> Temp_H.
;===============================================================================================
; В Temp_H/Temp_L "лежит" результат АЦП.
;===============================================================================================
; Теперь модуль АЦП можно выключить.
;===============================================================================================
            clrf       ADCON0      ; Для снижения потребляемого устройством тока, модуль
                                   ; АЦП выключается до конца отработки текущего полного
                                   ; цикла программы. 
            return                 ; возврат по стеку.
;===============================================================================================


;*********************************************************************************************
; Подпрограмма двоично-десятичного преобразования (для двух десятичных чисел).
;*********************************************************************************************
BIN2_10_2   bcf        STATUS,C    ; Сброс флага переноса-заема.
            movlw      .8          ; Запись в регистр Count числа 
            movwf      COUNT       ; проходов преобразования.
            clrf       LED0        ; Сброс регистра LED0.
            clrf       LED1        ; -------"------ LED1.
;===============================================================================================
; Циклический сдвиг влево через бит С регистра Status.
;===============================================================================================
LOOP_16_2   rlf        TEMP,F      ; Циклический сдвиг влево содержимого регистра TEMP.
            rlf        LED0,F      ; Циклический сдвиг влево содержимого регистра LED0.
            decfsz     COUNT,F     ; Декремент содержимого регистра COUNT, 
                                   ; с сохранением результата в нем же.
            goto       adjDEC_2    ; Если результат не = 0, то переход в ПП adjDEC,
                                   ; а если = 0, то программа исполняется далее.
;===============================================================================================
; Порязрядное распределение полубайтов.
;===============================================================================================
            swapf      LED0,W      ; Запись старшего полубайта LED0
            andlw      0Fh         ; в младший полубайт LED1
            movwf      LED1        ; 

            movfw      LED0        ; Запись младшего полубайта LED0
            andlw      0Fh         ; в младший полубайт LED0
            movwf      LED0        ; 

            goto       ASC2        ; Переход в ПП ASC.
;===============================================================================================
; Запись в регистр FSR адреса регистра LED0 для дальнейшей косвенной адресации
; к нему в ПП adjBCD_2.
;===============================================================================================
adjDEC_2    movlw      LED0        ; Запись в регистр FSR адреса регистра LED0
            movwf      FSR         ; с дальнейшим переходом в ПП adjBCD.
            call       adjBCD_2    ;
;---> Возврат по стеку из ПП adjBCD_2.
            goto       LOOP_16_2   ; Переход на следующее кольцо числовых преобразований.
;===============================================================================================
; Основные операции преобразования двоичных чисел в двоично-десятичные.
;===============================================================================================
adjBCD_2    clrwdt                 ; Сброс сторожевого таймера WDT.
            movlw      3           ; Суммирование содержимого текущего LED (LED0...3) с числом
            addwf      0,W         ; 03h, с записью результата операции, через регистр 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, то содержимое регистра TEMP
                                   ; копируется в текущий LED.

            retlw      0           ; Если бит №7 = 0, то регистр W очищается и происходит
                                   ; возврат по стеку в ПП adjDEC.
;*********************************************************************************************
; Процедура преобразования кода.
;=============================================================================================
ASC2        movlw      30h         ; Запись в регистр W числа 30h.
            iorwf      LED0,F      ; Логическое "ИЛИ" содержимого регистра W и регистра LED0
                                   ; с сохранением результата в LED0.
            iorwf      LED1,F      ; То же самое для LED1.

;=============================================================================================
; Теперь можно выводить на LCD
;=============================================================================================

            return                 ; возврат по стеку.            
;*********************************************************************************************
;=============================================================================================
;=============================================================================================
;=============================================================================================
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 2-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В 3-РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА
; (разрядность двоичного числа - 10).
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Подготовка к преобразованию.
;===============================================================================================
BIN2_10_3   bcf        STATUS,C    ; Сброс флага переноса-заема.
            movlw      .16         ; "Закладка" в регистр Count числа
            movwf      COUNT       ; проходов преобразования.

            clrf       LED0        ; Сброс регистра LED0.
            clrf       LED1        ; -------"------ LED1.
            clrf       LED2        ; -------"------ LED2.
;===============================================================================================
; Циклический сдвиг влево.
;===============================================================================================         
Loop16_3    rlf        TEMP_L,F    ; Побитная 
            rlf        TEMP_H,F    ; "переправка"
            rlf        LED0,F      ; содержимого
            rlf        LED1,F      ; Temp_H/Temp_L
                                   ; в LED1/LED0.
            decfsz     COUNT,F     ; Анализ числа проходов
            goto       adjDEC_3    ; преобразования.
;===============================================================================================
; Поразрядное распределение полубайтов регистров LED1 и LED0
; по младшим полубайтам регистров LED2, LED1, LED0.
;===============================================================================================
            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        ; --------------------------------

            
            goto       ASC3        ; Переход в ПП ASC3.

;===============================================================================================
; Запись в регистр FSR адресов регистров LED0...1 для дальнейшей косвенной адресации
; к ним в ПП adjBCD.
; Переход к обработке следующего LED - после возврата по стеку.                      
;===============================================================================================
adjDEC_3    movlw      LED0        ; Запись в регистр FSR, через регистр W, адреса регистра LED0
            movwf      FSR         ; с дальнейшим переходом в ПП adjBCD_3
            call       adjBCD_3      ; (адрес следующей команды закладывается в стек).
;---> Возврат по стеку из ПП adjBCD_3.                                  
            movlw      LED1        ; -----------------------------
            movwf      FSR         ; То же самое для регистра LED1.
            call       adjBCD_3      ; -----------------------------
;---> Возврат по стеку из ПП adjBCD_3.

            goto       Loop16_3    ; Переход в ПП Loop16_3, то есть, на 
                                   ; следующее кольцо числовых преобразований.
;===============================================================================================
; Основные операции преобразования двоичных чисел в двоично-десятичные.
;===============================================================================================
adjBCD_3    movlw      3           ; Суммирование содержимого текущего LED с числом
            addwf      0,W         ; 03h, с записью результата операции, через регистр 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_3.
;*********************************************************************************************
; Процедура преобразования кода.
;=============================================================================================
ASC3        movlw      30h         ; Запись в регистр W числа 30h.
            iorwf      LED0,F      ; Логическое "ИЛИ" содержимого регистра W и регистра LED0
                                   ; с сохранением результата в LED0.
            iorwf      LED1,F      ; То же самое для LED1.
            iorwf      LED2,F      ; То же самое для LED2.
;=============================================================================================
; Теперь можно выводить на LCD
;=============================================================================================
            return                 ; возврат по стеку.            
;*********************************************************************************************
;=============================================================================================
;=============================================================================================
;=============================================================================================




;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 2-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В 4-РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Подготовка к преобразованию.
;===============================================================================================
BIN2_10_4   bcf        STATUS,C    ; Сброс флага переноса-заема.
            movlw      .16         ; "Закладка" в регистр Count числа
            movwf      COUNT       ; проходов преобразования.

            clrf       LED0        ; Сброс регистра LED0.
            clrf       LED1        ; -------"------ LED1.
            clrf       LED2        ; -------"------ LED2.
            clrf       LED3        ; -------"------ LED3.
;===============================================================================================
; Циклический сдвиг влево.
;===============================================================================================         
Loop16_4    rlf        TMR_L,F     ; Побитная 
            rlf        TMR_H,F     ; "переправка"
            rlf        LED0,F      ; содержимого
            rlf        LED1,F      ; TMR_L/TMR_H
                                   ; в LED1/LED0.
            decfsz     COUNT,F     ; Анализ числа проходов
            goto       adjDEC_4    ; преобразования.
;===============================================================================================
; Поразрядное распределение полубайтов регистров LED1 и LED0
; по младшим полубайтам регистров LED3, LED2, LED1, LED0.
;===============================================================================================
            swapf      LED1,W      ; Запись старшего полубайта LED1
            andlw      0Fh         ; в младший полубайт LED3.
            movwf      LED3        ; --------------------------------

            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        ; --------------------------------

            goto       ASC4        ; Переход в  Процедуру преобразования кода

;===============================================================================================
; Запись в регистр FSR адресов регистров LED0...1 для дальнейшей косвенной адресации
; к ним в ПП adjBCD.
; Переход к обработке следующего LED - после возврата по стеку.                      
;===============================================================================================
adjDEC_4    movlw      LED0        ; Запись в регистр FSR, через регистр W, адреса регистра LED0
            movwf      FSR         ; с дальнейшим переходом в ПП adjBCD
            call       adjBCD_4    ; (адрес следующей команды закладывается в стек).
;---> Возврат по стеку из ПП adjBCD_4.                                  
            movlw      LED1        ; -----------------------------
            movwf      FSR         ; То же самое для регистра LED1.
            call       adjBCD_4    ; -----------------------------
;---> Возврат по стеку из ПП adjBCD_4.

            goto       Loop16_4    ; Переход в ПП Loop16_4, то есть, на 
                                   ; следующее кольцо числовых преобразований.
;===============================================================================================
; Основные операции преобразования двоичных чисел в двоично-десятичные.
;===============================================================================================
adjBCD_4    movlw      3           ; Суммирование содержимого текущего LED с числом
            addwf      0,W         ; 03h, с записью результата операции, через регистр 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.
;=============================================================================================
;*********************************************************************************************
; Процедура преобразования кода.
;=============================================================================================
ASC4        movlw      30h         ; Запись в регистр W числа 30h.
            iorwf      LED0,F      ; Логическое "ИЛИ" содержимого регистра W и регистра LED0
                                   ; с сохранением результата в LED0.
            iorwf      LED1,F      ; То же самое для LED1.
            iorwf      LED2,F      ; То же самое для LED2.
            iorwf      LED3,F      ; То же самое для LED3.
;=============================================================================================
; Теперь можно выводить на LCD
;=============================================================================================
             return                 ; возврат по стеку.  
;=============================================================================================
;=============================================================================================
;=============================================================================================


;#############################################################################################
; ПП BIPERA . или  бип 250мс
;#############################################################################################
           
;===============================================================================================
; Формирование времени сигнала зумера.
;===============================================================================================          
SIGNAL      BCF        PORTC,4     ;  Установить на выходе RC4 "0" вкл. зумер
            call       PAUSA_250   ; задержка 250мс

            BSF        PORTC,4     ; Установить на выходе RC4 "1". откл. зумер 
            BSF        PORTC,5     ; Установить на выходе RC5 "1". вкл. светодиод
            call       PAUSA_250   ; задержка 250мс 
            BCF        PORTC,5     ; Установить на выходе RC5 "0". выкл. светодиод      
            RETURN                 ; Возврат по стеку. 
;===============================================================================================
;Запись констант времени таймера  задержки. 250мс
;===============================================================================================     
PAUSA_250   MOVLW      .2          ; Запись в регистр SIG_H
            MOVWF      SIG_H       ; константы .2
            MOVLW      .69         ; Запись в регистр SIG_M
            MOVWF      SIG_M       ; константы .69
            MOVLW      .255        ; Запись в регистр SIG_L
            MOVWF      SIG_L       ; константы .255
;===============================================================================================
; "Очистка" (декремент) таймера.
;===============================================================================================        
ZUM1        DECFSZ     SIG_L,F     ; Декремент содержимого регистра SIG_L.
            GOTO       ZUM1        ; Если результат декремента не=0 - переход на ПП ZUM.                    
                                   ; Если результат декремента =0 - программа исполняется далее.
            DECFSZ     SIG_M,F     ; Декремент содержимого регистра SIG_M.
            GOTO       ZUM1        ; Если результат декремента не=0 - переход на ПП ZUM.                    
                                   ; Если результат декремента =0 - программа исполняется далее.
            DECFSZ     SIG_H,F     ; Декремент содержимого регистра SIG_H.
            GOTO       ZUM1        ; Если результат декремента не=0 - переход на ПП ZUM.
                                   ; Если результат декремента =0 - программа исполняется далее.           
            RETURN                 ; Возврат по стеку. 
;_____________________________________________________________________________________________
;=============================================================================================
;=============================================================================================
;=============================================================================================

;#############################################################################################
; ПП TIMER0   500МС RA4
;#############################################################################################

TIMER       bcf         INTCON,7    ; запретить все прерывания
                      
            BSF        STATUS,RP0   ; Переход в 1-й банк.
            MOVLW      b'11101000'  ; Предделитель с коэффициентом деления 1 включен
            MOVWF      OPTION_REG   ; перед WDT, выбор внешнего тактового сигнала с вывода
                                    ; RA4/TOCKI, приращение TMR0 - по переднему фронту. 
    

;==============================================================================================
; Начало счета (обозначено меткой On).
;==============================================================================================
            BSF        STATUS,RP0   ; Переход в 0-й банк.
ON          bsf        TRISA,4      ; RA4 работает на вход записать в регистр TrisA
                                    ; (начало счета).
            BCF        STATUS,RP0   ; Переход в 0-й банк.
            CLRF       TMR0         ; Сброс в 0 содержимого регистра TMR0.
;===============================================================================================
; Формирование времени работы таймера 500мс. 500 001м.ц.
;===============================================================================================
            MOVLW      .2           ; Запись в регистр TMR_H
            MOVWF      TMR_H        ; константы .2
            MOVLW      .232         ; Запись в регистр TMR_H
            MOVWF      TMR_M        ; константы .232
            MOVLW      .81          ; Запись в регистр TMR_L
            MOVWF      TMR_L        ; константы .81

PAUSE_T     CLRWDT                  ; Сброс сторожевого таймера WDT.
            DECFSZ     TMR_L,F      ; ДЕКРЕМЕНТ СОДЕРЖИМОГО СЧЕТЧИКА TMR_L.
            GOTO       PAUSE_T      ; 
            DECFSZ     TMR_M,F      ; ДЕКРЕМЕНТ СОДЕРЖИМОГО СЧЕТЧИКА TMR_M.
            GOTO       PAUSE_T      ; 
            DECFSZ     TMR_H,F      ; ДЕКРЕМЕНТ СОДЕРЖИМОГО СЧЕТЧИКА TMR_H.
            GOTO       PAUSE_T      ; 
;===============================================================================================
; Конец счета (обозначен меткой Off).
;===============================================================================================
            BSF        STATUS,RP0   ; Переход в 1-й банк.
OFF         bcf        TRISA,4      ; RA4 работает на выход записать в регистр TrisA (конец счета).
            BCF        STATUS,RP0   ; Переход в 0-й банк.
            
            movlw      .1
            movwf      COR_SEC
            movlw      .54          ; записать константу для корекции рег. MSEC    
            call       TIME_CORECT  ; переход на пп коррекции времени часов
            bsf        INTCON,7     ; разрешить все прерывания
;=============================================================================================
; Обработка данных с подсчета TMR0, коррекция нуля
;=============================================================================================                  
            CLRF       TMR_L        ; Сброс в 0 содержимого младшего регистра TMR0.
            CLRF       TMR_H        ; Сброс в 0 содержимого старшего регистра TMR0.
            MOVF       TMR0,W       ; Копирование содержимого регистра TMR0 в регистр W.
            MOVWF      TMR_L        ; Копирование содержимого регистра W в регистр TMR_L.
            movlw      .1           ; записать в W число 1 (число коррекции нуля таймера)
            bcf        STATUS,Z     ; опустить флаг нулевого результата.
            subwf      TMR_L,W      ; TMR_L-W=0?
            btfsc      STATUS,Z     ; проверка на ноль флага нулевого результата
            decf       TMR_L,F      ; если Z=1 то в TMR_L =1, тогда декремент .
                                    ; если Z=0 то в TMR_L >1, тогда пропускаем декремент
;===============================================================================================
; Подпрограмма умножения на 60 однобайтного двоичного числа для вывода в LCD
;===============================================================================================
; Принцип умножения 60=2х2х2х2х2х2-1-1-1-1;    TMR_Lх60= число об/мин. измерен. за 500мс.
;                      |_________|
;                          64     -TMR_L-TMR_L-TMR_L-TMR_L= результат сохр. TMR_H/TMR_L
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
            movf        TMR_L,W     ; Копирование содержимого регистра TMR_L в регистр W.
            clrf        TMR_H       ; Сброс в 0 содержимого регистра TMR_H.
;===============================================================================================
; Шесть последовательных умножений на 2 (умножение на 64).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r1          rlf         TMR_L,F     ; Циклический сдвиг влево содержимого регистра TMR_L
                                    ; с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H c переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r2          rlf         TMR_L,F     ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то циклический сдвиг влево содержимого регистра
                                    ; TMR_L с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H с переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r3          rlf         TMR_L,F     ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то циклический сдвиг влево содержимого регистра
                                    ; TMR_L с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H с переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r4          rlf         TMR_L,F     ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то циклический сдвиг влево содержимого регистра
                                    ; TMR_L с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H с переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r5          rlf         TMR_L,F     ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то циклический сдвиг влево содержимого регистра
                                    ; TMR_L с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H с переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).
;===============================================================================================
            bcf         STATUS,C    ; Установка в 0 бита № 0 регистра Status.
r6          rlf         TMR_L,F     ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то циклический сдвиг влево содержимого регистра
                                    ; TMR_L с сохранением результата в нем же.
            btfsc       STATUS,C    ; Опрос состояния бита флага С.
            rlf         TMR_H,F     ; Если С=1, то циклический сдвиг влево содержимого регистра
                                    ; TMR_H с переносом в его младший разряд 1 из бита флага С
                                    ; с сохранением результата в нем же (в TMR_H).

                                    ; Если С=0 (а также после исполнения предшествующей команды),
                                    ; то программа исполняется далее (переход к суммированиям).
;===============================================================================================
; 4 последовательных вычитания сохраненного в регистре W множимого из результата умножения
; множимого на 64.
;===============================================================================================
            bsf         STATUS,C    ; поднять флаг С=1
            subwf       TMR_L,F     ; Вычесть содержимое W  из TMR_L с сохранением
                                    ; результата в регистре TMR_L.
            btfss       STATUS,C    ; Опрос состояния бита флага С.
            decf        TMR_H,F     ; Если бит С=0, то декремент содержимого регистра RegH с
                                    ; сохранением результата в нем же.
;===============================================================================================
            bsf         STATUS,C    ; поднять флаг С=1
            subwf       TMR_L,F     ; Вычесть содержимое W  из TMR_L с сохранением
                                    ; результата в регистре TMR_L.
            btfss       STATUS,C    ; Опрос состояния бита флага С.
            decf        TMR_H,F     ; Если бит С=0, то декремент содержимого регистра RegH с
                                    ; сохранением результата в нем же.
;===============================================================================================
            bsf         STATUS,C    ; поднять флаг С=1
            subwf       TMR_L,F     ; Вычесть содержимое W  из TMR_L с сохранением
                                    ; результата в регистре TMR_L.
            btfss       STATUS,C    ; Опрос состояния бита флага С.
            decf        TMR_H,F     ; Если бит С=0, то декремент содержимого регистра RegH с
                                    ; сохранением результата в нем же.
;===============================================================================================
            bsf         STATUS,C    ; поднять флаг С=1
            subwf       TMR_L,F     ; Вычесть содержимое W  из TMR_L с сохранением
                                    ; результата в регистре TMR_L.
            btfss       STATUS,C    ; Опрос состояния бита флага С.
            decf        TMR_H,F     ; Если бит С=0, то декремент содержимого регистра RegH с
                                    ; сохранением результата в нем же.
;===============================================================================================           
                                    ; Если бит С=1 (а также после исполнения предшествующей
                                    ; команды), то программа исполняется далее.
            RETURN                  ; Возврат по стеку из ПП TIMER
;#############################################################################################




;#############################################################################################
; НАЧАЛО ПРОГРАММЫ.
;#############################################################################################
; Подготовительные операции.
;#############################################################################################
; Настройка направлений работы выводов.
;#############################################################################################
START       CLRF       INTCON       ; Запретить все прерывания             
            CALL       p300ms       ; Задержка в 300 мс
            CLRF       PORTA        ; Сбросить защелки PORTA !
            CLRF       PORTB        ; Сбросить защелки PORTВ !
            CLRF       PORTC        ; Сбросить защелки PORTС !
            BCF        STATUS,RP1   ; 
            BSF        STATUS,RP0   ; Переход в 1-й банк. 
            movlw      b'00001011'
            movwf      TRISA        ; Все выводы порта A работают на выход, 0,1,3 на вход.
            movlw      b'00000011'
            movwf      TRISB        ; Все выводы порта В работают на выход.0,1 на вход.
            movlw      B'10001111'  ; выводы порта С 0,1,2,3,7- на вход 
            movwf      TRISC        ; 4,5,6- работают на выход.
            movlw      b'11101000'  ;    
            movwf      OPTION_REG   ;
            movlw      b'10000100'  ; Диапазон квантования напряжения от -Vss до + Vdd,   
            movwf      ADCON1       ; AN0,AN1,AN3-аналоговые входы, AN2,AN4-цифровые каналы 
                                    ; ввода/вывода, правое выравнивание.
;===============================================================================================
; настройка регистров для работы в прерываниях
;===============================================================================================
            clrf       PIR1         ; сбросить все флаги всевозможных прерываний
            movlw      B'11000000'  ; запретить прерывания от TMR0,RB0,RB4-RB7 
            movwf      INTCON       ; разрешить все немаскированные прерывания
                                    ; разрешить все немаскированные прерывания от периф. модулей
;===============================================================================================
; инициализация TMR2
;===============================================================================================
            movlw      B'00000010'  ; запретить прерывания от TMR1,CCP1,USART,АЦП,паралельного и 
            movwf      PIE1         ; последовательного порта
                                    ; разрешить  прерывания по переполнению TMR2                                
;===============================================================================================
; конец настройки регистров для работы в прерываниях
;===============================================================================================
            bcf        STATUS,RP0   ; Переход в 0-й банк.
            clrf       T2CON        ; Выключить TMR2, предделитель 1:1
                                    ; выходной делитель 1:1
            clrf       TMR2         ; Очистить содержимое регистра TMR2
            movlw      B'01001001'  ; предделитель 1:4, выходной делитель 1:9 TMR2 отключен.
            movwf      T2CON        ; записать W в T2CON
            bsf        STATUS,RP0   ; выбрать банк 1 
            movlw      .249         ; записать костанту в W
            movwf      PR2          ; установить период прерываний TMR2 = 250
                                    ; это значит 4х250х10=10000мкс= 10мс х100 проходов= 1сек  
            bcf        STATUS,RP0   ; выбрать банк 0
            clrf       MSEC         ; обнулить регистр колличества переполнений TMR2
            clrf       SEC          ; обнулить регистр секунд
            clrf       MIN          ; обнулить регистр минут 
            clrf       CHAS         ; обнулить регистр Часов
            clrf       COR_SEC      ; обнулить регистр коррекции секунд
            clrf       CORR
          
            CLRF       PORTA        ; Сбросить защелки PORTA
            CLRF       PORTB        ; Сбросить защелки PORTВ
            CLRF       PORTC        ; Сбросить защелки PORTС
            BSF        PORTC,4      ; выключить зумер
            CALL       INIT_LCD     ; Рабочая инициализация  ЖКИ модуля.
            clrf       znak         ; Сбросить регистр znak для АЦП тока
           ; bsf        T2CON,2      ; включить TMR2 (при работе в MPLAB убрать кавычки, а при 
                                    ; прошивке установить и скомпилировать)
;===============================================================================================
; настройка закончена, ниже рабочая часть программы
;===============================================================================================
                  
;===============================================================================================
; Режим ожидания.
;===============================================================================================
ZAGIG       call       DS1          ; измерить температуру на улице
            call       KNOPKI       ; условный перехо в пп проверки кнопок. 
            call       NADPIS10     ; Выводим постоянную надпись NADPIS10 

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Устанавливаем коррекцию секунд за 1 час
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
            movlw      .7           ; запись константы коррекции секунд за 1 прошедший час
            movwf      CORR         ; W в CORR
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;===============================================================================================
; Выводим показания времени часы:минуты
;===========+==========+============+===========================================================
            movfw      CHAS         ; записать содержимое регистра CHAS в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение часов в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R6           ; из аккумулятора в R6
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R7           ; из аккумулятора в R7

            movfw      MIN          ; записать содержимое регистра MIN в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение минут  в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R9           ; из аккумулятора в R9
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R10          ; из аккумулятора в R10
            call       D_R6         ; вывести десятки в 1-ю строку 6 знакоместо
            call       D_R7         ; вывести единицы в 1-ю строку 7 знакоместо 
            call       D_R9         ; вывести десятки в 1-ю строку 9 знакоместо
            call       D_R10        ; вывести единицы в 1-ю строку 10 знакоместо           
;===========+==========+============+===========================================================
            
;===============================================================================================
; Определение и вывод на индикацию знака температуры (+/-).
;===============================================================================================
            btfsc      TEMP_MSB,0   ; В бите №0 старшего байта температуры 0 или 1 ?
            goto       $+5          ; Если 1, то переход в на вывод знака "-".
            movlw      2Bh          ; Если 0, то символ "+" записывается в -> W 
            movwf      R28          ; из W -> в регистр R28
            call       D_R28        ; вывести знак во вторую строку 8 знакоместо
            goto       $+6          ; После вывода на индикацию символа "+", переход           
                                    ; на обработку младшего байта температуры.
            movlw      2Dh          ; символ "-" записывается в -> W 
            movwf      R28          ; из W -> в регистр R28
            call       D_R28        ; вывести знак в0 вторую строку 8 знакоместо
;===============================================================================================
; Перевод двоичного числа младшего байта температуры 
; из отрицательной области температур в положительную.
;===============================================================================================
            comf       TEMP_LSB,F   ; После вывода на индикацию символа "-", все
            incf       TEMP_LSB,F   ; биты младшего байта температуры инвертируются 
                                    ; и к результату прибавляется 1.
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2 
;===============================================================================================
            rrf        TEMP_LSB,F   ; Деление на 2 t-ры в рег. TEMP_LSB с сохр. в нем же.
            movfw      TEMP_LSB     ; рег. TEMP_LSB записать в ->W
            movwf      TEMP         ; из W в рег. TEMP
            call       BIN2_10_2    ; преобразуем двоичное в десятичное 2-х значное
            movf       LED1,W       ; рег. LED1 записать в ->W
            movwf      R29          ; из W в рег. R29
            movf       LED0,W       ; рег. LED0 записать в ->W
            movwf      R210         ; из W в рег. R210
            call       D_R29        ; вывести десятки во 2-ю строку 9 знакоместо
            call       D_R210       ; вывести единицы во 2-ю строку 10 знакоместо
;===============================================================================================

;===============================================================================================
; Проверка включения зажигания.
;===============================================================================================
            btfsc      PORTC,0      ; Зажигание включено?
            goto       ZAGIG        ; Нет зажигание выключено
                                    ; да включено программа исп. далее
            btfsc      PORTC,0      ; Еще проверка Зажигание включено?
            goto       ZAGIG        ; Нет зажигание выключено
                                    ; да включено программа исп. далее
;===============================================================================================
; зажигание включено выводим приветствие, надпись № 1 
;===============================================================================================
            call       NADPIS1      ; выводим на индикатор NADPIS1
            call       p1000ms      ; 
            call       p1000ms      ; задержка  2сек.
;===============================================================================================
;===============================================================================================
;  выводим температуру улицы и двигателя
;===============================================================================================
            movlw      .2           ; записать число проходов обоих датчиков  в W
            movwf      PROX          ; из W -> в регистр PROX    
       
DS1_2 
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
; Зажигание включено?
;===============================================================================================
            btfsc       PORTC,0     ; Если  зажигание выключено  KONEC
            goto        KONEC       ; переход на конец программы с выводом прощальной надписи.
;===============================================================================================
; стартер выключен?
;===============================================================================================
            btfss       PORTC,1     ; Если  стартер включен
            call        p300ms      ; задержка        ; переход на метку ZAPUSK.
            btfss       PORTC,1     ; Если  стартер включен
            goto        ZAPUSK      ; переход на метку ZAPUSK.
;===============================================================================================
; Тосол в расширителе есть?
;===============================================================================================
            btfss       PORTC,2     ; Если  тосола нет то
            call        NADPIS13    ; условный переход на вывод NADPIS13.
            btfss       PORTC,2     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,2
                                    ; если есть то продолжаем программу
;===============================================================================================
; тормозная жидкость в расширителе есть?
;===============================================================================================
            btfss       PORTC,3     ; Если  тосола нет то
            call        NADPIS12    ; условный переход на вывод NADPIS12.
            btfss       PORTC,3     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,3
                                    ; если есть то продолжаем программу
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================      
            call       DS1          ; измерить температуру на улице
;===============================================================================================
            call       NADPIS2      ; Выводим постоянную надпись NADPIS2 
;=============================================================================================== 
;===============================================================================================
; Определение и вывод на индикацию знака температуры (+/-).
;===============================================================================================
            btfsc      TEMP_MSB,0   ; В бите №0 старшего байта температуры 0 или 1 ?
            goto       $+5          ; Если 1, то выводим знак "-".
            movlw      2Bh          ; Если 0, то символ "+" записывается в -> W 
            movwf      R8           ; из W -> в регистр R8
            call       D_R8         ; вывести знак в первую строку 8 знакоместо
            goto       $+6          ; После вывода на индикацию символа "+", переход           
                                    ; на обработку младшего байта температуры.
            movlw      2Dh          ; символ "-" записывается в -> W 
            movwf      R8           ; из W -> в регистр R8
            call       D_R8         ; вывести знак в первую строку 8 знакоместо
;===============================================================================================
; Перевод двоичного числа младшего байта температуры 
; из отрицательной области температур в положительную.
;===============================================================================================
            comf       TEMP_LSB,F   ; После вывода на индикацию символа "-", все
            incf       TEMP_LSB,F   ; биты младшего байта температуры инвертируются 
                                    ; и к результату прибавляется 1.
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2 
;===============================================================================================
            rrf        TEMP_LSB,F   ; Деление на 2 t-ры в рег. TEMP_LSB с сохр. в нем же.
            movfw      TEMP_LSB     ; рег. TEMP_LSB записать в ->W
            movwf      TEMP         ; из W в рег. TEMP
            call       BIN2_10_2    ; преобразуем двоичное в десятичное 2-х значное
            movf       LED1,W       ; рег. LED1 записать в ->W
            movwf      R9           ; из W в рег. R9
            movf       LED0,W       ; рег. LED0 записать в ->W
            movwf      R10          ; из W в рег. R10
            call       D_R9         ; вывести десятки в 1-ю строку 9 знакоместо
            call       D_R10        ; вывести единицы в 1-ю строку 10 знакоместо
;===============================================================================================
; измерение температуры второго датчика
;===============================================================================================
            call       DS2          ; измерить температуру на двигателе
;===============================================================================================
; Определение и вывод на индикацию знака температуры (+/-).
;===============================================================================================
            btfsc      TEMP_MSB,0   ; В бите №0 старшего байта температуры 0 или 1 ?
            goto       $+5          ; Если 1, то переход выводим "-"
            movlw      2Bh          ; Если 0, то символ "+" --->W 
            movwf      R28          ; записать в регистр R28 символ знака "+"
            call       D_R28        ; вывести + на индикатор во 2-ю строку, 8-е знакоместо
            goto       $+6          ; После вывода на индикацию символа "+", переход           
                                    ; на обработку младшего байта температуры.
            movlw      2Dh          ; символ "-" --->W 
            movwf      R28          ; записать в регистр R28 символ знака "-"
            call       D_R28        ; вывести - на индикатор во 2-ю строку, 8-е знакоместо
;===============================================================================================
; Перевод двоичного числа младшего байта температуры 
; из отрицательной области температур в положительную.
;===============================================================================================
            comf       TEMP_LSB,F   ; После вывода на индикацию символа "-", все
            incf       TEMP_LSB,F   ; биты младшего байта температуры инвертируются 
                                    ; и к результату прибавляется 1.
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2 
;===============================================================================================
SDVIG1      rrf        TEMP_LSB,F   ; Деление на 2.
;===============================================================================================
; Установка (или нет) признака добавления (к показаниям) символа "1" 
; (признак устанавливается при температуре от 100 градусов и выше).
;===============================================================================================
            movlw      .100         ; записать константу .100 в -->W
            bcf        STATUS,C     ; сбросить флаг С
            subwf      TEMP_LSB,W   ; Temp_LSB - .100 = ? Результат - в W.
            btfss      STATUS,C     ; Результат положительный или отрицательный?
            goto       C_00_99      ; Если отрицательный, то признак добавления символа "1" 
                                    ; не устанавливается (бит №7 регистра FLAG=0).          
            bsf        FLAG,7       ; Если положительный, то устанавливается 
                                    ; (бит №7 регистра FLAG=1).
            call       NADPIS14     ; условный переход на пп NADPIS14, ПЕРЕГРЕВ ДВИГАТЕЛЯ 
;===============================================================================================
; Если t-ра ниже 100 гр. то продолжаем вывод на индикацию
;===========+==========+============+===========================================================
C_00_99     movfw      TEMP_LSB     ; содержимое TEMP_LSB -> в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение температуры в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R29          ; из аккумулятора в R29
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R210         ; из аккумулятора в R210
            call       D_R29        ; вывести десятки во 2-ю строку 9 знакоместо
            call       D_R210       ; вывести единицы во 2-ю строку 10 знакоместо
            call       p1000ms      ; задержка  1сек.
;===============================================================================================
; данные каждого датчика температуры обрабатываются по 2 раза 
;===========+==========+============+===========================================================
        
            decfsz     PROX,F       ; декремент содержимого регистра PROX с сохр. в нем же
            goto       DS1_2        ; безусловный переход на метку DS1_2
                                    ; пошла далее
;===========+==========+============+===========================================================
;===============================================================================================
; Далее замеряем АЦП напряжения аккумулятора
;===========+==========+============+===========================================================            
            call       ACPU         ; замеряем напряжение аккумулятора.
;===============================================================================================
; проверяем на разряженность аккумулятора.
;===========+==========+============+===========================================================            
            movlw	.110        ; копировать константу напряжения 11.0V в W
            bsf        STATUS,C     ; поднять флаг С
            subwf      TEMP_L,W     ; вычесть содерж. рег. W из TEMP_L с сохр. в W
            btfsc      STATUS,C     ; если С=1 то заема небыло и Uбат. выше 11 вольт, то NORMA
            goto       NORMA        ; на пп вывода при нормальном напряжении.
            goto       NIZKOE       ; если С=0 на пп вывода низкого напряжения.
;===============================================================================================
; пп вывода при низком напряжении
;===========+==========+============+=========================================================== 
NIZKOE      call       NADPIS4      ; вывести постоянную надпись на LCD            
	    call       BIN2_10_3    ; преобразуем двоичное в десятичное 3-х разрядное.
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R5           ; из аккумулятора в R5
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R6           ; из аккумулятора в R6
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R8           ; из аккумулятора в R8
            call       D_R5         ; вывести десятки в 1-ю строку 5 знакоместо
            call       D_R6         ; вывести единицы в 1-ю строку 6 знакоместо
            call       D_R8         ; вывести десятые в 1-ю строку 8 знакоместо
            goto       ZAPUSK       ; безусловный переход на метку ZAPUSK
                                    ; и последующее ожидание запуска стартера.
;===============================================================================================
; пп вывода при нормальном напряжении напряжении аккумулятора
;===========+==========+============+===========================================================
NORMA       call       NADPIS3      ; вывести постоянную надпись на LCD            
	    call       BIN2_10_3    ; преобразуем двоичное в десятичное 3-х разрядное.
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R6           ; из аккумулятора в R6
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R7           ; из аккумулятора в R7
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R9           ; из аккумулятора в R9
            call       D_R6         ; вывести десятки в 1-ю строку 6 знакоместо
            call       D_R7         ; вывести единицы в 1-ю строку 7 знакоместо
            call       D_R9         ; вывести десятые в 1-ю строку 9 знакоместо            
                                    ; ожидание запуска стартера.
;===============================================================================================
; метка контроля запуска стартера
;===========+==========+============+===========================================================
ZAPUSK      btfsc      PORTC,0      ; Если  зажигание выключено 
            goto       KONEC        ; переход на конец программы с выводом прощальной надписи.
            btfsc      PORTC,1      ; проверка стартер запущен?
            goto       ZAPUSK       ; нет переход на проверку ZAPUSK
            call       NADPIS5      ; выводим надпись запуска стартера.
            call       p1000ms      ; задержка 1 сек.
            btfss      PORTC,1      ; проверка стартер еще запущен?
            goto       $-2          ; переход на 2 команды вверх
;===============================================================================================
; стартер отключен, переходим на контроль параметров при запущеном двигателе.
;===========+==========+============+===========================================================            

RABOTA      movlw      .3           ; записать число проходов измерений датчиков  в W
            movwf      PROX         ; из W -> в регистр PROX   
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; устанавливаем коррекцию секунд за прошедший час
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                
N6          call       DS2          ; измерить температуру на двигателе
            movlw      .6           ; запись константы коррекции секунд за 1 прошедший час
            movwf      CORR         ; W в CORR
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&         
;===============================================================================================
;===========+==========+============+=========================================================== 
            call       NADPIS6      ; выводим надпись 6 параметров работы двигателя.
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
; Зажигание включено?
;===============================================================================================
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            call       p300ms       ; задержка
            
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            goto       KONEC        ; переход на конец программы с выводом прощальной надписи.
;===============================================================================================
; стартер выключен?
;===============================================================================================
            btfss       PORTC,1     ; Если  стартер включен
            goto        ZAPUSK      ; переход на метку ZAPUSK.
;===============================================================================================
; Тосол в расширителе есть?
;===============================================================================================
            btfss       PORTC,2     ; Если  тосола нет то
            call        NADPIS13    ; условный переход на вывод NADPIS13.
            btfss       PORTC,2     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,2
                                    ; если есть то продолжаем программу
;===============================================================================================
; тормозная жидкость в расширителе есть?
;===============================================================================================
            btfss       PORTC,3     ; Если  тосола нет то
            call        NADPIS12    ; условный переход на вывод NADPIS12.
            btfss       PORTC,3     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,3
                                    ; если есть то продолжаем программу
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================

;===============================================================================================
; Определение и вывод на индикацию знака температуры (+/-).
;===============================================================================================
            btfsc      TEMP_MSB,0   ; В бите №0 старшего байта температуры 0 или 1 ?
            goto       $+5          ; Если 1, то переход в на вывод "-".
            movlw      2Bh          ; Если 0, то символ "+" --->W 
            movwf      R5           ; записать в регистр R5 символ знака "+"
            call       D_R5         ; вывести + на индикатор в 1-ю строку, 5-е знакоместо
            goto       $+6          ; После вывода на индикацию символа "+", переход           
                                    ; на обработку младшего байта температуры.
            movlw      2Dh          ; символ "-" --->W 
            movwf      R5           ; записать в регистр R5 символ знака "-"
            call       D_R5         ; вывести - на индикатор в 1-ю строку, 5-е знакоместо
;===============================================================================================
; Перевод двоичного числа младшего байта температуры 
; из отрицательной области температур в положительную.
;===============================================================================================
            comf       TEMP_LSB,F   ; После вывода на индикацию символа "-", все
            incf       TEMP_LSB,F   ; биты младшего байта температуры инвертируются 
                                    ; и к результату прибавляется 1.
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2 
;===============================================================================================
            rrf        TEMP_LSB,F   ; Деление на 2.
;===============================================================================================
; Установка (или нет) признака добавления (к показаниям) символа "1" 
; (признак устанавливается при температуре от 100 градусов и выше).
;===============================================================================================
            movlw      .100         ; записать константу .100 в -->W
            bcf        STATUS,C     ; сбросить флаг С
            subwf      TEMP_LSB,W   ; Temp_LSB - .100 = ? Результат - в W.
            btfss      STATUS,C     ; Результат положительный или отрицательный?
            goto       C_00_99R     ; Если отрицательный, то признак добавления символа "1" 
                                    ; не устанавливается (бит №7 регистра FLAG=0).          
            bsf        FLAG,7       ; Если положительный, то устанавливается 
                                    ; (бит №7 регистра FLAG=1).
            call       NADPIS14     ; условный переход на пп NADPIS14, ПЕРЕГРЕВ ДВИГАТЕЛЯ 
;===============================================================================================
; Если t-ра ниже 100 гр. то продолжаем, вывод на индикацию
;===========+==========+============+===========================================================
C_00_99R    movfw      TEMP_LSB     ; содержимое TEMP_LSB -> в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение температуры в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R6           ; из аккумулятора в R6
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R7           ; из аккумулятора в R7
            call       D_R6         ; вывести десятки в 1-ю строку 6 знакоместо
            call       D_R7         ; вывести единицы в 1-ю строку 7 знакоместо 
;===============================================================================================
; Выводим показания времени часы:минуты
;===========+==========+============+===========================================================
            movfw      CHAS         ; записать содержимое регистра CHAS в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение часов в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R11          ; из аккумулятора в R11
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R12          ; из аккумулятора в R12

            movfw      MIN          ; записать содержимое регистра MIN в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение минут  в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R14          ; из аккумулятора в R14
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R15          ; из аккумулятора в R15
            call       D_R11        ; вывести десятки в 1-ю строку 11 знакоместо
            call       D_R12        ; вывести единицы в 1-ю строку 12 знакоместо 
            call       D_R14        ; вывести десятки в 1-ю строку 14 знакоместо
            call       D_R15        ; вывести единицы в 1-ю строку 15 знакоместо
;===========+==========+============+=========================================================== 
;===============================================================================================
; Измеряем АЦП тока зарядки 
;===========+==========+============+===========================================================
            call       ACPTOKA      ; условный переход на измерение тока зарядки
         
            call       BIN2_10_3    ; преобразуем значение тока в 3-х значное число.
            movf       znak,W       ; переписать знак тока в W
            movwf      R24          ; из аккумулятора в R24
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R25          ; из аккумулятора в R24
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R26          ; из аккумулятора в R25
            call       D_R24        ; вывести знак в 2-ю строку 4 знакоместо
            call       D_R25        ; вывести десятки в 2-ю строку 5 знакоместо  
            call       D_R26        ; вывести единицы в 2-ю строку 6 знакоместо           
;===============================================================================================
;===============================================================================================
; Измеряем АЦП напряжения аккумулятора
;===========+==========+============+===========================================================
            call       ACPU         ; условный переход на измерение напряжения аккумулятора           
            call       BIN2_10_3    ; преобразуем значение тока в 3-х значное число.
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R212         ; из аккумулятора в R212
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R213         ; из аккумулятора в R213
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R215         ; из аккумулятора в R215
            call       D_R212       ; вывести десятки во 2-ю строку 12 знакоместо
            call       D_R213       ; вывести единицы во 2-ю строку 13 знакоместо
            call       D_R215       ; вывести десятые во 2-ю строку 15 знакоместо             
;===============================================================================================
; данные каждого датчика  обрабатываются и выводятся по 3 раза затем задержка 1 сек.
;===========+==========+============+===========================================================
            decfsz     PROX,F       ; декремент содержимого регистра PROX с сохр. в нем же
            goto       N6           ; безусловный переход на метку N6
            call       p300ms       ; задержка  1сек.
;===========+==========+============+===========================================================
;===========+==========+============+=========================================================== 
            movlw      .4           ; записать число проходов  датчиков  в W
            movwf      PROX         ; из W -> в регистр PROX
;===========+==========+============+===========================================================
; замеряем обороты двигателя для надписи №7
;===========+==========+============+=========================================================== 
N7         call       TIMER         ; условный переход на пп TIMER, в ней производится замер 
                                    ; оборотов двигателя по количеству импульсов катушки 
                                    ; зажигания, за время 500мс, затем, это значение умножается
                                    ; на 60, что и будет значение оборотов/мин.
                                    ; пример: 1000 об/мин - это 2000 имп. 1 об.= 2 импульсам
                                    ; 2000/60= 33,3 об/сек.
                                    ; за 0,5 сек. будет 16,6 имп. +1 инкремент 17 имп.
                                    ; 17*60=1020 об./мин  
                                    ; это примерно и есть обороты двигателя.
;===========+==========+============+===========================================================
; Выводим надпись 7 на индикацию
;===========+==========+============+===========================================================            
            call       NADPIS7      ; выводим надпись 7 параметров работы двигателя.
;===============================================================================================

;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
; Зажигание включено?
;===============================================================================================
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            call       p300ms       ; задержка
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            goto       KONEC        ; переход на конец программы с выводом прощальной надписи.
;===============================================================================================
; стартер выключен?
;===============================================================================================
            btfss       PORTC,1     ; Если  стартер включен
            goto        ZAPUSK      ; переход на метку ZAPUSK.
;===============================================================================================
; Тосол в расширителе есть?
;===============================================================================================
            btfss       PORTC,2     ; Если  тосола нет то
            call        NADPIS13    ; условный переход на вывод NADPIS13.
            btfss       PORTC,2     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,2
                                    ; если есть то продолжаем программу
;===============================================================================================
; тормозная жидкость в расширителе есть?
;===============================================================================================
            btfss       PORTC,3     ; Если  тосола нет то
            call        NADPIS12    ; условный переход на вывод NADPIS12.
            btfss       PORTC,3     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,3
                                    ; если есть то продолжаем программу
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
;===============================================================================================
; Измеряем АЦП тока зарядки 
;===========+==========+============+===========================================================
            call       ACPTOKA      ; условный переход на измерение тока зарядки
         
            call       BIN2_10_3    ; преобразуем значение тока в 3-х значное число.
            movf       znak,W       ; переписать знак тока в W
            movwf      R4           ; из аккумулятора в R4
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R5           ; из аккумулятора в R4
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R6           ; из аккумулятора в R5
            call       D_R4         ; вывести знак в 1-ю строку 4 знакоместо
            call       D_R5         ; вывести десятки в 1-ю строку 5 знакоместо  
            call       D_R6         ; вывести единицы в 1-ю строку 6 знакоместо           
;===============================================================================================
; Измеряем АЦП напряжения аккумулятора и выводим на индикатор
;===========+==========+============+===========================================================
            call       ACPU         ; условный переход на измерение напряжения аккумулятора           
            call       BIN2_10_3    ; преобразуем значение тока в 3-х значное число.
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R12          ; из аккумулятора в R12
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R13          ; из аккумулятора в R13
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R15          ; из аккумулятора в R15
            call       D_R12        ; вывести десятки в 1-ю строку 12 знакоместо
            call       D_R13        ; вывести единицы в 1-ю строку 13 знакоместо
            call       D_R15        ; вывести десятые в 1-ю строку 15 знакоместо     
;===============================================================================================
; Измеряем обороты двигателя с вывода RA4 с помощью TMR0
;===========+==========+============+===========================================================
            
            call       BIN2_10_4    ; преобразуем значение из таймера в 4-х значное число.
            movf       LED3,W       ; содержимое LED3 -> в W
            movwf      R26          ; из аккумулятора в R26
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R27          ; из аккумулятора в R27
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R28          ; из аккумулятора в R28
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R29          ; из аккумулятора в R29
            call       D_R26        ; вывести тысячи  во 2-ю строку 6 знакоместо
            call       D_R27        ; вывести сотни   во 2-ю строку 7 знакоместо
            call       D_R28        ; вывести десятки во 2-ю строку 8 знакоместо
            call       D_R29        ; вывести единицы во 2-ю строку 9 знакоместо
            call       p300ms       ; задержка  1сек.
;===============================================================================================
; данные каждого датчика  обрабатываются и выводятся по 4 раза.
;===========+==========+============+===========================================================
            decfsz     PROX,F       ; декремент содержимого регистра PROX с сохр. в нем же
            goto       N7           ; безусловный переход на метку N7
    
;===========+==========+============+=========================================================== 
;===============================================================================================
;  выводим температуру улицы часы обороты и напряжение
;===============================================================================================
            movlw      .4           ; записать число проходов обоих датчиков  в W
            movwf      PROX         ; из W -> в регистр PROX    
;===============================================================================================
; Измеряем обороты двигателя с вывода RA4 с помощью TMR0
;===========+==========+============+===========================================================
N8          call       DS1          ; измерить температуру на улице
            call       TIMER        ; условный переход на пп TIMER
;===========+==========+============+=========================================================== 
; Выводим надпись 8 на индикацию
;===========+==========+============+===========================================================            
            call       NADPIS8      ; выводим надпись 8 параметров работы двигателя.
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
; Зажигание включено?
;===============================================================================================
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            call       p300ms       ; задержка
            btfsc      PORTC,0      ; Если  зажигание выключено  KONEC
            goto       KONEC        ; переход на конец программы с выводом прощальной надписи.
;===============================================================================================
; стартер выключен?
;===============================================================================================
            btfss       PORTC,1     ; Если  стартер включен
            goto        ZAPUSK      ; переход на метку ZAPUSK.
;===============================================================================================
; Тосол в расширителе есть?
;===============================================================================================
            btfss       PORTC,2     ; Если  тосола нет то
            call        NADPIS13    ; условный переход на вывод NADPIS13.
            btfss       PORTC,2     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,2
                                    ; если есть то продолжаем программу
;===============================================================================================
; тормозная жидкость в расширителе есть?
;===============================================================================================
            btfss       PORTC,3     ; Если  тосола нет то
            call        NADPIS12    ; условный переход на вывод NADPIS12.
            btfss       PORTC,3     ; Если  тосола нет то
            goto        $-3         ; то скачет на 3 команды вверх.btfss  PORTC,3
                                    ; если есть то продолжаем программу
;===============================================================================================
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;===============================================================================================
            
            call       BIN2_10_4    ; преобразуем значение из таймера в 4-х значное число.
            movf       LED3,W       ; содержимое LED3 -> в W
            movwf      R6           ; из аккумулятора в R6
            movf       LED2,W       ; содержимое LED2 -> в W
            movwf      R7           ; из аккумулятора в R7
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R8           ; из аккумулятора в R8
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R9           ; из аккумулятора в R9
            call       D_R6         ; вывести тысячи  в 1-ю строку 6 знакоместо
            call       D_R7         ; вывести сотни   в 1-ю строку 7 знакоместо
            call       D_R8         ; вывести десятки в 1-ю строку 8 знакоместо
            call       D_R9         ; вывести единицы в 1-ю строку 9 знакоместо
;===============================================================================================
            
;===============================================================================================
; Определение и вывод на индикацию знака температуры (+/-).
;===============================================================================================
            btfsc      TEMP_MSB,0   ; В бите №0 старшего байта температуры 0 или 1 ?
            goto       MINUS_       ; Если 1, то переход в ПП MINUS_.
            movlw      2Bh          ; Если 0, то символ "+" записывается в -> W 
            movwf      R25          ; из W -> в регистр R25
            call       D_R25        ; вывести знак во 2 строку 5 знакоместо
            goto       $+6          ; После вывода на индикацию символа "+", переход           
                                    ; на обработку младшего байта температуры.
MINUS_      movlw      2Dh          ; символ "-" записывается в -> W 
            movwf      R25          ; из W -> в регистр R25
            call       D_R25        ; вывести знак во 2ю строку 5 знакоместо
;===============================================================================================
; Перевод двоичного числа младшего байта температуры 
; из отрицательной области температур в положительную.
;===============================================================================================
            comf       TEMP_LSB,F   ; После вывода на индикацию символа "-", все
            incf       TEMP_LSB,F   ; биты младшего байта температуры инвертируются 
                                    ; и к результату прибавляется 1.
;===============================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;===============================================================================================
; Деление числа, записанного в младшем байте температуры, на 2 
;===============================================================================================
            rrf        TEMP_LSB,F   ; Деление на 2 t-ры в рег. TEMP_LSB с сохр. в нем же.
            movfw      TEMP_LSB     ; рег. TEMP_LSB записать в ->W
            movwf      TEMP         ; из W в рег. TEMP
            call       BIN2_10_2    ; преобразуем двоичное в десятичное 2-х значное
            movf       LED1,W       ; рег. LED1 записать в ->W
            movwf      R26          ; из W в рег. R26
            movf       LED0,W       ; рег. LED0 записать в ->W
            movwf      R27          ; из W в рег. R27
            call       D_R26        ; вывести десятки в 2-ю строку 6 знакоместо
            call       D_R27        ; вывести единицы в 2-ю строку 7 знакоместо
;===============================================================================================
; Выводим показания времени часы:минуты
;===========+==========+============+===========================================================
            movfw      CHAS         ; записать содержимое регистра CHAS в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение часов в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R211         ; из аккумулятора в R211
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R212         ; из аккумулятора в R212

            movfw      MIN          ; записать содержимое регистра MIN в W
            movwf      TEMP         ; из аккумулятора в TEMP
            call       BIN2_10_2    ; преобразуем значение минут  в 2-х значное число.
            movf       LED1,W       ; содержимое LED1 -> в W
            movwf      R214         ; из аккумулятора в R214
            movf       LED0,W       ; содержимое LED0 -> в W
            movwf      R215         ; из аккумулятора в R215
            call       D_R211       ; вывести десятки во 2-ю строку 11 знакоместо
            call       D_R212       ; вывести единицы во 2-ю строку 12 знакоместо 
            call       D_R214       ; вывести десятки во 2-ю строку 14 знакоместо
            call       D_R215       ; вывести единицы во 2-ю строку 15 знакоместо
;===============================================================================================
;замеряем АЦП напряжения аккумулятора на факт выявления аварии генератора
;===========+==========+============+===========================================================            
            call       ACPU         ; замеряем напряжение аккумулятора.
;===============================================================================================
; проверяем разряженность аккумулятора.
;===========+==========+============+===========================================================            
            movlw	.105        ; копировать константу напряжения 10.5V в W
            bsf        STATUS,C     ; поднять флаг С
            subwf      TEMP_L,W     ; вычесть содерж. рег. W из TEMP_L с сохр. в W
            btfss      STATUS,C     ; если С=1 то заема небыло и Uбат. выше 11 вольт, то NORMA
            call       NADPIS11     ; если С=0 то выводим аварию генератора
;===========+==========+============+===========================================================
;===============================================================================================
; данные каждого датчика  обрабатываются и выводятся по 4 раза.
;===========+==========+============+===========================================================
            decfsz     PROX,F       ; декремент содержимого регистра PROX с сохр. в нем же
            goto       N8           ; безусловный переход на метку N8
            call       p300ms       ; задержка  0.3сек.
;===============================================================================================
; данные каждого датчика  обрабатываются и выводятся 1 раз затем снова на N6
;===========+==========+============+===========================================================
            goto       RABOTA       ; безусловный переход на метку RABOTA           
;===========+==========+============+=========================================================== 
;===============================================================================================
;зажигание выключено, проверяем выключение фар.
;===========+==========+============+===========================================================
KONEC       btfss      PORTC,7      ; фары выключены?
            goto       $+2
            call       NADPIS15     ; нет включены, выводим надпись 15 фары включены
            call       NADPIS9      ; выводим прощальную надпись 
            call       p1000ms      ; пауза в 1 сек.
            call       p1000ms      ; пауза в 1 сек.
            goto       ZAGIG        ; переход на начало программы
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;№№№№№№№№№№№№№№№№№№№№    КОНЕЦ    РАБОЧЕЙ ЧАСТИ ПРОГРАММЫ  №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;==========+============+===========+=========================================================
;==========+============+===========+=========================================================
;==========+============+===========+=========================================================
;=============================================================================================
;                   Работа программы на следующей странице
;=============================================================================================
            org        0801

;=============================================================================================
;                   ВЫВОД на ЖКИ надписи при включении зажигания!!!
;=============================================================================================
;=============================================================================================
;Надпись №1                           для 1-й строки надписи <ПРИВЕТ**ХОЗЯИН>
;                                     для 2-й строки надписи ЗАЖИГАНИЕ*ВКЛЮЧ.
;==========+============+===========+=========================================================
TEXT1_1     movlw        high T1_1   ; записать старший байт счетчика команд метки T1_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T1_1    ; cложить w и младший байт PC метки T1_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T1_1        dt           0x3C, 0xA8, 0x50, 0xA5, 0x42, 0x45, 0x54, 0x20 
            dt           0x20, 0x58, 0x4F, 0xA4, 0xB1, 0xA5, 0x48, 0x3E
;=============================================================================================
TEXT1_2     movlw        high T1_2   ; записать старший байт счетчика команд метки T1_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T1_2    ; cложить w и младший байт PC метки T1_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T1_2        dt           0xA4, 0x41, 0xA3, 0xA5, 0xA1, 0x41, 0x48, 0xA5
            dt           0x45, 0x20, 0x42, 0x4B, 0xA7, 0xB0, 0xAB, 0x2E
;==========+============+===========+==========================================================

;==========+============+===========+==========================================================
;Надпись №2  Вычисляемый табличный переход для 1-й строки надписи ***tул=±**0С****
;                                          для 2-й строки надписи ***tдв=±**0С****
;==========+============+===========+==========================================================
TEXT2_1     movlw        high T2_1   ; записать старший байт счетчика команд метки T2_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T2_1    ; cложить w и младший байт PC метки T2_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T2_1        dt           0x20,0x20,0x20,0x74,0xE3,0xB3,0x3D,0x20
            dt           0x20,0x20,0xEF,0x43,0x20,0x20,0x20,0x20
;==============================================================================================
TEXT2_2     movlw        high T2_2   ; записать старший байт счетчика команд метки T2_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T2_2    ; cложить w и младший байт PC метки T2_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T2_2        dt           0x20,0x20,0x20,0x74,0x79,0xBB,0x3D,0x20
            dt           0x20,0x20,0xEF,0x43,0x20,0x20,0x20,0x20
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;Надпись №3  Вычисляемый табличный переход для 1-й строки надписи Uакк=**,*В*НОРМА
;                                          для 2-й строки надписи ГОТОВ К ЗАПУСКУ!
;==========+============+===========+==========================================================
TEXT3_1     movlw        high T3_1   ; записать старший байт счетчика команд метки T3_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T3_1    ; cложить w и младший байт PC метки T3_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T3_1        dt           0x55,0x61,0xBA,0xBA,0x3D,0x20,0x20,0x2C,0x20,0x42,0x20,0x48,0x4F,0x50,0x4D,0x41
;==============================================================================================
TEXT3_2     movlw        high T3_2   ; записать старший байт счетчика команд метки T3_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T3_2    ; cложить w и младший байт PC метки T3_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T3_2        dt           0xA1,0x4F,0x54,0x4F,0x42,0x20,0x4B,0x20,0xA4,0x41,0xA8,0xA9,0x43,0x4B,0xA9,0x21
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;Надпись №4  Вычисляемый табличный переход для 1-й строки надписи Uак=**,*В*НИЗКОЕ
;                                          для 2-й строки надписи Надо подзарядить
;==========+============+===========+==========================================================
TEXT4_1     movlw        high T4_1   ; записать старший байт счетчика команд метки T4_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T4_1    ; cложить w и младший байт PC метки T4_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T4_1        dt           0x55,0x61,0xBA,0x3D,0x20,0x20,0x2C,0x20,0x42,0x20,0x48,0xA5,0xA4,0x4B,0x4F,0x45
;==============================================================================================
TEXT4_2     movlw        high T4_2   ; записать старший байт счетчика команд метки T4_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T4_2    ; cложить w и младший байт PC метки T4_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T4_2        dt           0x48,0x61,0xE3,0x6F,0x20,0xBE,0x6F,0xE3,0xB7,0x61,0x70,0xC7,0xE3,0xB8,0xBF,0xC4
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;==========+============+===========+==========================================================
;Надпись №5  Вычисляемый табличный переход для 1-й строки надписи **<<<ЗАПУСК>>>**
;                                          для 2-й строки надписи Стартер  включен 
;==========+============+===========+==========================================================
TEXT5_1     movlw        high T5_1   ; записать старший байт счетчика команд метки T5_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T5_1    ; cложить w и младший байт PC метки T5_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T5_1        dt           0x20,0x20,0x3C,0x3C,0x3C,0xA4,0x41,0xA8,0xA9,0x43,0x4B,0x3E,0x3E,0x3E,0x20,0x20
;===============================================================================================
TEXT5_2     movlw        high T5_2   ; записать старший байт счетчика команд метки T5_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T5_2    ; cложить w и младший байт PC метки T5_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T5_2        dt           0x43,0xBF,0x61,0x70,0xBF,0x65,0x70,0x20,0x20,0xB3,0xBA,0xBB,0xC6,0xC0,0x65,0xBD
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №6  Вычисляемый табличный переход для 1-й строки надписи tдв=±**0С*00:00*
;                                          для 2-й строки надписи Iз=***А*Uс=**,*В 
;==========+============+===========+===========================================================
TEXT6_1     movlw        high T6_1   ; записать старший байт счетчика команд метки T6_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T6_1    ; cложить w и младший байт PC метки T6_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T6_1        dt           0x74,0xE3,0xB3,0x3D,0x20,0x20,0x20,0xEF,0x43,0x20,0x20,0x20,0x3A,0x20,0x20,0x20
;===============================================================================================
TEXT6_2     movlw        high T6_2   ; записать старший байт счетчика команд метки T6_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T6_2    ; cложить w и младший байт PC метки T6_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T6_2        dt           0x49,0xB7,0x3D,0x20,0x20,0x20,0x41,0x20,0x55,0x63,0x3D,0x20,0x20,0x2C,0x20,0x42
;===============================================================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №7  Вычисляемый табличный переход для 1-й строки надписи Iз=***А*Uс=**,*В
;                                          для 2-й строки надписи *Fдв=****об/мин* 
;==========+============+===========+===========================================================
TEXT7_1     movlw        high T7_1   ; записать старший байт счетчика команд метки T7_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T7_1    ; cложить w и младший байт PC метки T7_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T7_1        dt           0x49,0xB7,0x3D,0x20,0x20,0x20,0x41,0x20,0x55,0x63,0x3D,0x20,0x20,0x2C,0x20,0x42
;===============================================================================================
TEXT7_2     movlw        high T7_2   ; записать старший байт счетчика команд метки T7_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T7_2    ; cложить w и младший байт PC метки T7_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T7_2        dt           0x20,0x46,0xE3,0xB3,0x3D,0x20,0x20,0x20,0x20,0x6F,0xB2,0x2F,0xBC,0xB8,0xBD,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №8  Вычисляемый табличный переход для 1-й строки надписи *Fдв=****об/мин*
;                                          для 2-й строки надписи tул=±**0С*00:00* 
;==========+============+===========+====================================================
TEXT8_1     movlw        high T8_1   ; записать старший байт счетчика команд метки T8_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T8_1    ; cложить w и младший байт PC метки T8_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T8_1        dt           0x20,0x46,0xE3,0xB3,0x3D,0x20,0x20,0x20,0x20,0x6F,0xB2,0x2F,0xBC,0xB8,0xBD,0x20
;===============================================================================================
TEXT8_2     movlw        high T8_2   ; записать старший байт счетчика команд метки T8_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T8_2    ; cложить w и младший байт PC метки T8_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T8_2        dt           0x74,0x79,0xBB,0x3D,0x20,0x20,0x20,0xEF,0x43,0x20,0x20,0x20,0x3A,0x20,0x20,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;                   ВЫВОД на ЖКИ надписи в момент выключения двигателя
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №9  Вычисляемый табличный переход для 1-й строки надписи <<ПОКА  ХОЗЯИН>>
;                                          для 2-й строки надписи Зажигание выключ 
;==========+============+===========+====================================================
TEXT9_1     movlw        high T9_1   ; записать старший байт счетчика команд метки T9_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T9_1    ; cложить w и младший байт PC метки T9_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T9_1        dt           0x3C,0x3C,0xA8,0x4F,0x4B,0x41,0x20,0x20,0x58,0x4F,0xA4,0xB1,0xA5,0x48,0x3E,0x3E
;===============================================================================================
TEXT9_2     movlw        high T9_2   ; записать старший байт счетчика команд метки T9_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T9_2    ; cложить w и младший байт PC метки T9_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T9_2        dt           0xA4,0x61,0xB6,0xB8,0xB4,0x61,0xBD,0xB8,0x65,0x20,0xB3,0xC3,0xBA,0xBB,0xC6,0xC0
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;                   ВЫВОД на ЖКИ надписи в Режиме ожидания (дежурный режим)
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №10  Вычисляемый табличный переход для 1-й строки надписи *****00:00******
;                                           для 2-й строки надписи ***tул=±**0С**** 
;==========+============+===========+===========================================================
TEXT10_1    movlw        high T10_1   ; записать старший байт счетчика команд метки T10_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T10_1    ; cложить w и младший байт PC метки T10_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T10_1       dt           0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
;===============================================================================================
TEXT10_2    movlw        high T10_2   ; записать старший байт счетчика команд метки T10_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T10_2    ; cложить w и младший байт PC метки T10_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T10_2       dt           0x20,0x20,0x20,0x74,0x79,0xBB,0x3D,0x20,0x20,0x20,0xEF,0x43,0x20,0x20,0x20,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;                  НИЖЕ ВЫВОД НА ЖКИ НАДПИСЕЙ АВАРИЙНЫХ СОБЫТИЙ
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №11  Вычисляемый табличный переход для 1-й строки надписи ВНИМАНИЕ**АВАРИЯ
;                                           для 2-й строки надписи **<ГЕНЕРАТОРА>** 
;==========+============+===========+===========================================================
TEXT11_1    movlw        high T11_1   ; записать старший байт счетчика команд метки T11_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T11_1    ; cложить w и младший байт PC метки T11_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T11_1       dt           0x42,0x48,0xA5,0x4D,0x41,0x48,0xA5,0x45,0x20,0x20,0x41,0x42,0x41,0x50,0xA5,0xB1
;===============================================================================================
TEXT11_2    movlw        high T11_2   ; записать старший байт счетчика команд метки T11_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T11_2    ; cложить w и младший байт PC метки T11_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T11_2       dt           0x20,0x20,0x3C,0xA1,0x45,0x48,0x45,0x50,0x41,0x54,0x4F,0x50,0x41,0x3E,0x20,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №12  Вычисляемый табличный переход для 1-й строки надписи ****АВАРИЙНЫЙ***
;                                           для 2-й строки надписи **УРОВЕНЬ В ТС**   
;==========+============+===========+===========================================================
TEXT12_1    movlw        high T12_1   ; записать старший байт счетчика команд метки T12_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T12_1    ; cложить w и младший байт PC метки T12_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T12_1       dt           0x20,0x20,0x20,0x20,0x41,0x42,0x41,0x50,0xA5,0xA6,0x48,0xAE,0xA6,0x20,0x20,0x20
;===============================================================================================
TEXT12_2    movlw        high T12_2   ; записать старший байт счетчика команд метки T12_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T12_2    ; cложить w и младший байт PC метки T12_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T12_2       dt           0x20,0x20,0xA9,0x50,0x4F,0x42,0x45,0x48,0xAD,0x20,0x42,0x20,0x54,0x43,0x20,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №13  Вычисляемый табличный переход для 1-й строки надписи  *АВАРИЯ*СИСТЕМЫ* 
;                                           для 2-й строки надписи  *ОХЛАЖДЕНИЯ*ДВ.* 
;==========+============+===========+===========================================================
TEXT13_1    movlw        high T13_1   ; записать старший байт счетчика команд метки T13_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T13_1    ; cложить w и младший байт PC метки T13_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T13_1       dt           0x20,0x41,0x42,0x41,0x50,0xA5,0xB1,0x20,0x43,0xA5,0x43,0x54,0x45,0x4D,0xAE,0x20
;===============================================================================================
TEXT13_2    movlw        high T13_2   ; записать старший байт счетчика команд метки T13_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T13_2    ; cложить w и младший байт PC метки T13_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T13_2       dt           0x20,0x4F,0x58,0xA7,0x41,0xA3,0xE0,0x45,0x48,0xA5,0xB1,0x20,0xE0,0x42,0x2E,0x20
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №14  Вычисляемый табличный переход для 1-й строки надписи   ***tдв=±***0С***  
;                                           для 2-й строки надписи   ПЕРЕГРЕВ*МОТОРА! 
;==========+============+===========+===========================================================
TEXT14_1    movlw        high T14_1   ; записать старший байт счетчика команд метки T14_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T14_1    ; cложить w и младший байт PC метки T14_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T14_1       dt           0x20,0x20,0x20,0x74,0xE3,0xB3,0x3D,0x20,0x20,0x20,0x20,0xEF,0x43,0x20,0x20,0x20
;===============================================================================================
TEXT14_2    movlw        high T14_2   ; записать старший байт счетчика команд метки T14_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T14_2    ; cложить w и младший байт PC метки T14_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T14_2       dt           0xA8,0x45,0x50,0x45,0xA1,0x50,0x45,0x42,0x20,0x4D,0x4F,0x54,0x4F,0x50,0x41,0x21
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;Надпись №15  Вычисляемый табличный переход для 1-й строки надписи   ****Внимание****  
;                                           для 2-й строки надписи   *Фары*включены!* 
;==========+============+===========+===========================================================
TEXT15_1    movlw        high T15_1   ; записать старший байт счетчика команд метки T15_1  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T15_1    ; cложить w и младший байт PC метки T15_1
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T15_1       dt           0x20,0x20,0x20,0x20,0x42,0xBD,0xB8,0xBC,0x61,0xBD,0xB8,0x65,0x20,0x20,0x20,0x20
;================================================================================================
TEXT15_2    movlw        high T15_2   ; записать старший байт счетчика команд метки T15_2  в w
            movwf        PCLATH 
            ; проверка на принадлежность смещения РС к текущей страницы памяти (кратно 256 )     
            movf         MEM,w       ; переслать в w (насколько перейдем)
            addlw        low T15_2    ; cложить w и младший байт PC метки T15_2
            btfsc        STATUS,C    ; проверить бит С (переполнение)
            incf         PCLATH,f    ; было, +1 к PCLATH
            movf         MEM,w       ; не было,просто выч. переход.
            
            addwf        PCL,F       ; Приращение PCL на величину содержимого W.
T15_2       dt           0x20,0xAA,0x61,0x70,0xC3,0x20,0xB3,0xBA,0xBB,0xC6,0xC0,0x65,0xBD,0xC3,0x21,0x20

;==========+============+===========+===========================================================
;==========+============+===========+===========================================================
;                         НАКОНЕЦ ТАКИ КОНЕЦ!!!!!
;===========+==========+============+===========================================================
            end                     ; директива конца программы.

