;**********************************************************************
;                                                                     *
;    Filename:	    CH-3200-VOLT-02.asm                                *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:  Универсальный вольтметр постоянного тока 0,0-99,9 *
;                          конструктор                                *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
	list      p=16f88           	; list directive to define processor
	#include <p16F88.inc>        	; processor specific variable definitions
	errorlevel  2              	
	__CONFIG    _CONFIG1, _CP_ALL & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_ALL & _CPD_ON & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_ON & _INTRC_IO
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

;=======================================================================================================
	cblock	0x020
;================================	
r_PORTB							; виртуальные регистры портов
d_PORTB							;	
d_PORTA							;

ind_1									; переменная первого индикатора старший разряд
ind_2									; перемннная второго индикатора младший разряд
ind_3									; перемннная третьего индикатора десятичный разряд	
buf_ind_1								; буфер переменной 1 знакоместа
buf_ind_2								; буфер переменной 2 знакоместа
buf_ind_3								; буфер переменной 3 знакоместа 

perem1									; 
perem2									; 
perem5									; 

reg_ind									; регистр индикации выбора знакоместа
b_zad_ind								; переменная длительности индикации
;================================
cher300_10								; 
cher02									; 
cher05									; 
;chet_10								; счетчик делитель длительности до 1 Гц
;cher60m								; счетчик делитель длительности до 1 мин
;================================
flag_i1									; флаги индикации
flag_i2									; флаги индикации

flag_2									; флаг выбора параметров настройки регулятора
flag_3									; флаги управления
flag_4									; флаги управления
flag_5
;================================
avtovyh									; переменная автовыхода из режима настройки
;================================
adr_e									; переменные для работы с EEPROM
data_e									; 
chtteep								    ; счетчик программы работы с EEPROM
;================================
uskor                   		  		; переменные обработки скорости автоповтора нажатия клавиш
uskor_1                 		    	;
;========================================
;================================
;переменные сохраняемые в памяти EEPROM
;========================================
flag_0									;* флаги состояния работы контроллера
Up_alr_hi,Up_alr_lo						;* Верхний аварийный уровень
Dn_alr_hi,Dn_alr_lo						;* Нижний аварийный уровень
Vr_zak_lo								;* Время задежки автоконтроля параметров среды с момента включения или смены параметра
Vr_pov_lo								;* Время задержки аварии
kalibr_hi,kalibr_lo						;* Калибровка вольтметра
end_stek								;*
;========================================
Vr_cak_lo								; Счетчик задежки автоконтроля параметров среды с момента включения или смены параметра
Vr_cpo_lo								; Счетчик задежки 
;========================================
; регистры программы десятичного преобразования
;========================================
; служебные
flag_s									; 
count									; 
temp									; 
R3										; 
R2										; 
R1										; 
R0										; 
; входные
binu									; 
binh									; 
binl									; 
; выходные
edin									; единицы
dest									; десятки
sotn									; сотни
tysc									; тысячи
dtys									; дестки тысяч
stys									; сотни тысяц
mlon									; милионы
;========================================
;========================================
; переменные программы сравнения 16 битных чисел
peAsuh
peAsu
peAsh									; число_А 
peAsl									; 
peBsu
peBsh									; число_Б 
peBsl									; 
regsr									; 
flag_srv								; 
;========================================
peCsu									; числоSTATUS,C
peCsh									; 
peCsl									; 
peDsu									; число_D
peDsh									; 
peDsl									; 
sign
;========================================
schet_sim1								; счетчик цикла вывода
schet_sim2								; счетчик выбора символа
;========================================
;temp 						  	 		; 
t_binu					  		 		; 
t_binh					  		 		; 
t_binl					  	 			; 
U_izm_hi					  	 		; измерянная напряжение
U_izm_lo					  			;
;========================================
Chokr								    ; счетчик 
ChTiz					   			    ; счетчик измерений
Tih1				   				    ; такты измерния температуры h1
Til1			   					    ; 
Tih2				   				    ; 
Til2				   				    ; 
Tih3				   				    ; 
Til3				   				    ; 
Tih4				   				    ; 
Til4				   				    ; 

;U_izm_hi			   					    ; 
;U_izm_lo				   				  	;

;========================================
	endc
;========================================
	cblock	0x07d	
;================================
w_temp                     				; variable used for context saving 
status_temp            		    		; variable used for context saving
pclath_temp        	  					; variable used for context saving
;========================================
	endc
;========================================

	cblock	0x0aa	
;================================
AARGB0,AARGB1,AARGB2,AARGB3,AARGB4
TEMPB0,TEMPB1,TEMPB2,TEMPB3
LOOPCOUNT
BARGB0,BARGB1
tu5adc_64h,tu5adc_64l
tu5adc_128h,tu5adc_128l
;========================================
	endc
;========================================


;===========================================================================================
;===========================================================================================
; описание портов индикации
#define		S_A		d_PORTB,1			; сегмент А
#define		S_B		d_PORTB,2			; сегмент B
#define		S_C		d_PORTB,3			; сегмент C	
#define		S_D		d_PORTB,4			; сегмент D
#define		S_E		d_PORTB,5			; сегмент E 
#define		S_F		d_PORTB,6			; сегмент F
#define		S_G		d_PORTB,7			; сегмент G
#define		S_H		d_PORTA,6			; сегмент H

#define		SOT		d_PORTA,1			; управляющий бит первого знакоместа
#define		DES		d_PORTA,2			; управляющий бит второго знакоместа
#define		EDI		d_PORTA,7			; управляющий бит третьего знакоместа

; упраляющие байты для работы программы индикации
; порт А
#define		CL_PA	b'00000000'			; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PA	b'10000110'			; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
; порт В
#define		CL_PB	b'00000001'			; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PB	b'00000000'			; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов

;===========================================================================================
; описание портов клавиатуры
#define		KRB1		PORTB,2				; клавиша функция

#define		KRB3		PORTB,4				; клавиша меньше

#define		KRB2		PORTB,3				; клавиша больше


#define		KRB4		PORTB,7				; клавиша функция
#define		PORTKN	b'10011100'			; описание расположения портов кнопок

;===========================================================================================
;===========================================================================================
#define		INDK	flag_0,0			; режим "Индикатор напряжения"
#define		KVUP	flag_0,1			; режим "Контроль выхода за установленные пределы"
#define		KVZD	flag_0,2			; режим "Контроль входа в заданный диапазон"
#define		R_ind	flag_0,3			; режим индикации
;=================================


;=================================
; биты программы настройки регулятора
#define		REGRA	flag_2,0			; бит выбора режима работы вольтметра
#define		UP_VOL	flag_2,1			; бит настройки вернего уровня автокконтроля вольтметра
#define		DN_VOL	flag_2,2			; бит настройки нижнего уровня автокконтроля вольтметра
#define		ZD_AKO	flag_2,3			; бит задежки включения режима автоконтроля (после включения)
#define		ZD_AVR	flag_2,4			; бит задежки срабатывания аварии
#define		KALIBR	flag_2,5			; бит калибровки вольтметра
#define		RE_IND	flag_2,6			; режим индикации
#define		PROIZ	flag_2,7			; данные о изготовителе
;=================================
#define		kl_no	flag_3,0			; бит удержания клавиши
#define		RELE1	flag_3,1			; линия реле 
#define		E_data	flag_3,2			; флаг ошибки данных
#define		MINUS	flag_3,3			; бит измерения отрицательных температур
#define		B_MIG	flag_3,4			; бит мигания (1 потушен, 0 горит)
#define		UST		flag_3,5			; бит режима настройки регулятора
#define		vp_rp	flag_3,6			; бит режима 0-выбор параметра, 1-коррекция параметра
;=================================
#define		LE_RI	flag_4,0			; бит направления сдвига
#define		B24		flag_4,1			;
#define		BTE		flag_4,2			; бит гашения первых нулей до 00
#define		BTE0_00	flag_4,3			;
#define		BRACON	flag_4,4			; бит разрешения автоконтроля
#define		zad_op	flag_4,5			; бит разрешения 
;=================================
#define		f_KRB1	flag_5,0			;
#define		f_KRB2	flag_5,1			;
#define		f_KRB3	flag_5,2			;
#define		f_KRB4	flag_5,3			;
;=================================
; биты программы индикации
#define		TOCHKA1	flag_i2,0			; бит индикации десятичной точки
#define		TOCHKA2	flag_i1,1			; 
#define		TOCHKA3	flag_i1,2			; 
#define		TOCHm1	flag_i1,3			; бит мигания десятичной точки
#define		TOCHm2	flag_i1,4			; 1 - мигает с частотой 2 гц.
#define		TOCHm3	flag_i1,5			; 0 - горит постоянно
#define		RAZR1	flag_i1,6			; бит мигания разряда индикатора
#define		RAZR2	flag_i1,7			; 0 - горит постоянно
#define		RAZR3	flag_i1,0			; 1 - мигает с частотой 2 гц.
;=================================
; биты программы сравнения
#define		RAV		flag_srv,0			; бит сравнения =
#define		BOL		flag_srv,1			; бит сравнения >
#define		MEN		flag_srv,2			; бит сравнения <
#define		BOL_RAV	flag_srv,3			; бит сравнения >=
#define		MEN_RAV	flag_srv,4			; бит сравнения <=
;=================================
#define		IZM_ACP		ADCON0,2		; бит управления запуском АЦП
;=================================




;=================================
#define		SPUAN	.15					; значение скорости автонабора по умолчанию
#define		DIND	.15					; длительность находжения в режиме настройки (автовыход через - .10 секунд)
;======================================================================================
; символы знакогенератора
#define		c0		b'01111110'			; 0-0
#define		c1		b'00001100'			; 1-1
#define		c2		b'10110110'			; 2-2 "z"
#define		c3		b'10011110'			; 3-3
#define		c4		b'11001100'			; 4-4 "Ч"
#define		c5		b'11011010'			; 5-5 "S"
#define		c6		b'11111010'			; 6-6
#define		c7		b'00001110'			; 7-7
#define		c8		b'11111110'			; 8-8
#define		c9		b'11011110'			; 9-9
;======================================================================================
#define		c_		b'00000000'			; символ "пробел" 
#define		cM		b'10000000'			; символ "-"
#define		cw		b'00000010'			; символ "надчеркивание"
#define		cn		b'10101000'			; "n"
#define		cN		b'01101110'			; "П"
#define		co		b'10111000'			; "o" 
#define		cE		b'11110010'			; "E"
#define		cr		b'10100000'			; "r"
#define		cd		b'10111100'			; "d"
#define		cb		b'11111000'			; "b"
#define		ct		b'11110000'			; "t"
#define		cA		b'11101110'			; "A"
#define		cC		b'01110010'			; "C"
#define		cH		b'11101100'			; "H"
#define		cP		b'11100110'			; "P"
#define		cc		b'10110000'			; "c"
#define		ch		b'11101000'			; "h"
#define		cL		b'01110000'			; "L"
#define		ci		b'00100000'			; "i"
#define		cg		b'11001110'			; "g"
#define		cF		b'11100010'			; "F"
#define		cU		b'01111100'			; "U"
#define		cu		b'00111000'			; "u"
#define		cY		b'11011100'			; "У"

;======================================================================================

;=======================================================================================================
;**********************************************************************
		ORG		0x000      	   			; processor reset vector
 			nop
		goto	main           			; go to beginning of program
;=======================================================================================================
	ORG     0x004             			; interrupt vector location
			movwf   w_temp            	; save off current W register contents
			movf	STATUS,w          	; move STATUS register into W register
			movwf	status_temp       	; save off contents of STATUS register
			movf	PCLATH,W	  		; move PCLATH register into W register
			movwf	pclath_temp       	; save off contents of PCLATH register

			clrf	STATUS				; выбор банка 0
;===============================================
			bcf		T1CON,TMR1ON		; таймер выключен,
			bcf		PIR1,TMR1IF			; сбросить флаг прерывания от модуля TMR1
			movlw	0xfc				; 
			movwf	TMR1H				; 
			movlw	0xfd				; 
			movwf	TMR1L				;  
;============== период 	300 Гц	
;========================================================================== 
;==============	программа формирования задежки индикации символов
			movf	b_zad_ind,f			; проверить время задежки вышло
			BZ		$+2					;
			decf	b_zad_ind,f			; 
;==============	программа обслуживания работы индикатора
			call	indic				;
;========================================================================== 
			decfsz	cher300_10,f		; счетчик делитель длительности до 10 Гц 
			goto	end_pr				; 
			movlw	.30					; если достигнут ноль востановить счетчик
			movwf	cher300_10			;
;========================================================================== 
;======== период 	10 Гц		



;========================================================================== 
			decfsz	cher05,f			; счетчик делитель длительности до 2 Гц 
			goto	end_pr				; 
			movlw	.5					; если достигнут ноль востановить счетчик
			movwf	cher05				;
;========================================================================== 
;============== период 	2 Гц
			btfss	B_MIG				; цикл управления прерывистой индикацией
			goto	$+3					;
			bcf		B_MIG				;
			goto	$+2					;
			bsf		B_MIG				;
;========================================
			call	Voltmetr					;
;========================================
;========================================================================== 			
			decfsz	cher02,f			; счетчик делитель длительности до 1 Гц 
			goto	end_pr				; 
			movlw	.2					; если достигнут ноль востановить счетчик
			movwf	cher02				; период 1 Гц
;==========================================================================
;============== период 	1 Гц start		;				
			;==============		отсчет времени задержки атоконтроля	
			movf	Vr_cak_lo,f			; 
			btfss	STATUS,Z			; 
		goto	decfvrem				; 
			bsf		BRACON				; 			
		goto	end_decfvrem			;	
decfvrem								;
			movlw	.1					;
			subwf	Vr_cak_lo,f			;
end_decfvrem							;
			;==============			
			;==============		отсчет времени задежки срабатывания аварии	
			movf	Vr_cpo_lo,f			; 
			btfss	STATUS,Z			; 
		goto	decf_open				; 
			bsf		zad_op				; 			
		goto	end_decf_open			; 	
decf_open								; 
			movlw	.1					;
			subwf	Vr_cpo_lo,f			;
end_decf_open
			;==============				;
			movf	avtovyh,f			; отсчет времени 
			SKPNZ						;
		goto	chet_1mi_m				;
			decfsz	avtovyh,f			;
		goto 	chet_1mi_m				;
			call	resautoexit			;
			;==============				;
;===============================================				
chet_1mi_m								;	
;===============================================
;==========================================================================
;============== период 	1 Гц end
;=================================
;=================================
;=================================
;=================================
end_pr
			bsf		T1CON,TMR1ON		; таймер включен,

			movf    pclath_temp,w     	; retrieve copy of PCLATH register
			movwf	PCLATH            	; restore pre-isr PCLATH register contents
			movf    status_temp,w     	; retrieve copy of STATUS register
			movwf	STATUS            	; restore pre-isr STATUS register contents
			swapf   w_temp,f
			swapf   w_temp,w          	; restore pre-isr W register contents
		retfie                   	 	; return from interrupt
;=======================================================================================================
;*************************************************************************************************************************************************
deshif		addwf	PCL,f				; дешифратор цифр
			retlw	b'01111110'			; "0"
			retlw	b'00001100'			; "1"
			retlw	b'10110110'			; "2"
			retlw	b'10011110'			; "3"
			retlw	b'11001100'			; "4"
			retlw	b'11011010'			; "5"
			retlw	b'11111010'			; "6"
			retlw	b'00001110'			; "7"
			retlw	b'11111110'			; "8"
			retlw	b'11011110'			; "9"
			retlw	b'00000000'			; "10"-"пусто"
			retlw	b'10000000'			; "11"-"минус"				
;*************************************************************************************************************************************************
;*************************************************************************************************************************************************
con_dro		addwf	PCL,f				;  		точные коды	 округленные
			retlw	.0					; 0-		00			0 для точности 0,1 грд
			retlw	.1					; 1-		06			1 прописывать округленые
			retlw	.1					; 2-		12			1 для точности 0,01 грд
			retlw	.2					; 3-		18			2 прописать точные коды
			retlw	.3					; 4-		25			3
			retlw	.3					; 5-		31			3
			retlw	.4					; 6-		37			4
			retlw	.4					; 7-		43			4
			retlw	.5					; 8-		50			5
			retlw	.6					; 9-		56			6
			retlw	.6					; 10-		62			6
			retlw	.7					; 11-		68			7
			retlw	.8					; 12-		75			8
			retlw	.8					; 13-		81			8
			retlw	.9					; 14-		87			9
			retlw	.9					; 15-		93			9
			retlw	.0					; 16-		00			0 отриц ноль
;============================================================================================
;*******************************************************************************************************************************************
text_1		addwf	PCL,f				; тип устройства (счет строк с 0)
			retlw	.12					;  количество (символов) в сообщении
			retlw	cc					; c
			retlw	ch					; h
			retlw	cM					; "-"
			retlw	c3					; 3
			retlw	c2					; 2
			retlw	c0					; 0
			retlw	c0					; 0
			retlw   cM					; "-"				
			retlw	c1					; 0
			retlw	c9					; 3
			retlw	cC					; С
					;	.12 ошибки датчика
			retlw	.12					; количество команд - retlw в подпрограмме
			retlw	b'11110010'			; "E"
			retlw	b'10100000'			; "r"
			retlw	b'10100000'			; "r"
			retlw	b'10111000'			; "o"
			retlw	b'10100000'			; "r"
			retlw	b'00000000'			; " "
			retlw   b'10111100'			; "d"
			retlw   b'11101110'			; "a"				
			retlw	b'11110000'			; "t"
			retlw	b'10110000'			; "c"
			retlw	b'11101001'			; "h."
					;	.24 телефон изготовителя
			retlw	.16					; количество команд - retlw в подпрограмме
			retlw	b'11111110'			; "8"
			retlw	b'10000000'			; "-"
			retlw	b'01111110'			; "0"
			retlw	b'11011010'			; "5"
			retlw	b'11111010'			; "6"
			retlw	b'10000000'			; "-"
			retlw	b'10011110'			; 3-3
			retlw	b'00001110'			; 7-7				
			retlw	b'11001100'			; "4"
			retlw	b'10000000'			; "-"
			retlw	b'01111110'			; "0"
			retlw	b'11001100'			; "4"					
			retlw	b'10000000'			; "-"
			retlw	b'01111110'			; "0"					
			retlw	b'11011010'			; "5"				
					;	.40 авария данных
			retlw	.10					; количество команд - retlw в подпрограмме
			retlw	b'00000000'			; " "
			retlw	b'11110010'			; "E"
			retlw	b'10100000'			; "r"
			retlw	b'10100001'			; "r."
			retlw	b'00000000'			; " "
			retlw	b'10111100'			; "d"
			retlw	b'11101110'			; "A"
			retlw   b'11110000'			; "t"				
			retlw	b'11101110'			; "a"
					;	.50 бегущая строка - ма
			retlw	.3					; количество команд - retlw в подпрограмме
			retlw	c0					; "0"
			retlw	cL					; "L"
			retlw	cw					; "--"
					;	.54  бегущая строка - холодно
			retlw	.4					; количество команд - retlw в подпрограмме
			retlw	b'01110010'			; "С"
			retlw	b'10111000'			; "o"
			retlw	b'01110000'			; "L"
					;	.58
			retlw	.12					; количество команд - retlw в подпрограмме
			retlw	b'11100010'			; "F"
			retlw	b'11101110'			; "A"
			retlw	b'00001000'			; "i"
			retlw	b'00001100'			; "l"
			retlw	b'00111000'			; "u"
			retlw	b'10100000'			; "r"
			retlw	b'11110010'			; "E"
			retlw	c_					; " "
			retlw	c_					; " "
			retlw	c_					; " "
					;	.69  
			retlw	.4					; количество символов +1
			retlw	cr					; "r"
			retlw	ci					; "i"
			retlw	cn					; "n"
					;	.73  prop
			retlw	.4					; количество символов +1
			retlw	cA					; "A"
			retlw	co					; "o"
			retlw	cu					; "u"
					;	.77  iteg
			retlw	.4					; количество символов +1
			retlw	cU					; "U"
			retlw	b'00000010'			; "-"
			retlw	b'00000010'			; "-"
					;	.81 Uu1 ---
			retlw	.4					; количество символов +1
			retlw	cU					; "U"
			retlw	b'00010000'			; "_"
			retlw	b'00010000'			; "_"
					;	.85 Tel
			retlw	.4					; количество символов +1
			retlw	b'11110000'			; "t"
			retlw	b'11110010'			; "E"
			retlw	b'01110000'			; "L"
					;	.89 Вкл/Выкл
			retlw	.4					; количество символов +1
			retlw	b'10100000'			; "r"
			retlw	b'11110010'			; "E"
			retlw	b'11001110'			; "q"
					;	.93  Uu2 ---
			retlw	.4					; количество команд - retlw в подпрограмме
			retlw	cA					; "A"
			retlw	b'00001000'			; "i"
			retlw	cn					; "n"
					;	.97  CAL ---
			retlw	.4					; количество команд - retlw в подпрограмме
			retlw	cC					; "C"
			retlw	cA					; "A"
			retlw	cL					; "L"
;============================================================================================


;============================================================================================
; очистка памяти данных
main		movlw	0x5					; банк 0
			movwf	FSR					; 
ClfMem		clrf	INDF				; 
			incf	FSR,f				; 
			movlw	0x80				;
			subwf	FSR,w				;
			BNZ 	ClfMem				;
			clrf	INDF				; 			
;============================================================================================
;============================================================================================
;инициализация процессора
			clrwdt						; сброс сторожевого таймера++++++
;====================================
;нстройка генератора
			BANKSEL OSCTUNE			
			clrf	OSCTUNE				; регистр корректировки частоты внутреннего генератора
			movlw	b'01110000'			; частота 8 мГерц
			movwf	OSCCON				; 
;====================================
			BANKSEL OPTION_REG			; выбрать банк регистра OPTION_REG
			movlw	b'00001111'			; загрузить константу (включить подтяг. резисторы, предделитель на WDT, коэф. 1:128)
			movwf	OPTION_REG			; 
;====================================
			movlw	b'00000001'			;  настройка портов A и В R0 на вход, остальные на выход
			movwf	TRISA				;
			clrf	TRISB				; 
;====================================
		; настройка	АЦП для 819
;			BANKSEL ADCON1
;			movlw	b'11001110'			; правое выравнивание, Ft/2, режим 1/0 (один аналоговый вход)
;			movwf	ADCON1				; 			
;			BANKSEL ADCON0				; 
;			movlw	b'10000001'			; FOSC/64, канал А0, АЦП включен
;			movwf	ADCON0				; 

		; настройка	АЦП для 88
			BANKSEL ANSEL			; 
			movlw	b'00000001'		;
			movwf	ANSEL			; 1 вход			
			BANKSEL ADCON0			; 
			movlw	b'11000001'		; FOSC/64, канал А0, АЦП включен
			movwf	ADCON0			; 			
			BANKSEL ADCON1
			movlw	b'11000000'		; правое выравнивание, Ft/2, режим 1/0 опорное по питанию.
			movwf	ADCON1			; 			
		; настройка таймера	TMP1	;


;==================================== 			
		; настройка таймера	TMP1		; 
			BANKSEL T1CON				; выбрать банк 0
			movlw	b'00110001'			; таймер включен, предделитель 4 мг = 1:8 - 125 000 гц
			movwf	T1CON				;
;============================================================================================
			call	vost_data			; востановление настроек после включения питания
;============================================================================================
		; инициализация переменных
			movlw	SPUAN				;
			movwf	uskor_1				; 
			movwf	uskor				; 
			
			movlw	.2					; счетчик 10 гц выход 1 секунда
			movwf	cher300_10			; 
			movwf	cher02				; 
			movwf	cher05				; 
			
			bcf		LE_RI				; настройка битов клавиш направлений

			call	res_init			;
;============================================================================================
		; настройка прерываний
			movlw	b'11000000'			;
			movwf	INTCON				; разрешить прерывания от переферийных устройств
			BANKSEL	PIE1				; 
			bsf		PIE1,TMR1IE			; разрешить прерывания от TIMER1
			bcf		STATUS,RP0			; выбор банка 0
			bcf		STATUS,RP1			; 
;============================================================================================
;============================================================================================
			bsf		STATUS,RP0			; выбрать банк 1
			movlw	PORTKN				; и настроить порты кнопок на ввод
			movwf	TRISB				; 
			bcf		STATUS,RP0			; выбрать банк 0			
			call	zaderj				; вызов подпрограммы задержки

			btfsc	KRB3				; вход через рестарт вольтметра 
			goto	$+.2				; 	
		goto	vos_data				; 
			
			bsf		STATUS,RP0			; выбрать банк 1
			clrf	TRISB				; и настроить все линии порта на вывод 
			bcf		STATUS,RP0			; выбрать банк 0
;============================================================================================			
;============================================================================================
		; операции индикации состояния и задания регулятора
			;==============				;
			movlw	.0					; 
			call	big_str				; бегущая строка CH3200
			call 	och_left			; очистка индикатора
;============================================================================================
; цикл работы регулятора
ind
			clrwdt						; сброс сторожевого таймера++++++
			;==============				;
			call	kondosdata			; 
			;==============				;		


			;==============				; индикация
			movf	U_izm_hi,w			; 				
			movwf	binh				; 			
			movf	U_izm_lo,w			; 
			movwf	binl				;
			bsf		BTE					;
			call	conv_volt			;

			;==============				;			
			call	ind_zad				;
			;==============				;
			movlw	.20					;
			movwf	b_zad_ind			;
			;==============				;
			call	upravlenie			;	(измениться длительность индикации)		
			;==============				;
			call	klava				; 
;--------------------------------------------				
kontr		btfss	UST					; выбор режима работы
			goto	ind					; режим индикации и регулирования/режим установки
;--------------------------------------------
; цикл настройки регулятора
nast	
			clrwdt						; сброс сторожевого таймера++++++
			btfss	KALIBR				; 	
		goto	gotus					; 	
			btfss	vp_rp				; 	
		goto	gotus					; 	
			movf	U_izm_hi,w			; 				
			movwf	binh				; 			
			movf	U_izm_lo,w			; 
			movwf	binl				;
			bsf		BTE					;
			call	conv_volt			;

gotus												
			call	upravlenie			;

			movfw	uskor				;
			movwf	b_zad_ind			;
			call	ind_zad				; 			
			call	klava				; 
		goto	kontr					; 
;============================================================================================
;============================================================================================
upravlenie								;программа управления работой контроллера
;============================================================================================
;============================================================================================
;======================================= режим регулирования
			btfsc	UST
		return			
			btfsc	KVUP				; контроль напряжения только если 
		goto	control					; выбраны режимы контроля
			btfsc	KVZD				; 
		goto	control					; 
			bcf	RELE1					; 
		return							; 			
;============================================================================================
control		; контроль поведения параметра регулируемой среды
			; выход за допуспимые пределы и времени входа в заданные параметры
			btfsc		INDK			; 
	return								; 
			btfsc		KVUP			; 
	goto	connap						; 
			btfss		KVZD			; 
	return								; 
connap
			movfw	U_izm_hi			; сравнение данных на превышение максим	
			movwf	peAsh				; измеряемая температура не должна превышать
			movfw	U_izm_lo			; 
			movwf	peAsl				;
			
			movfw	Up_alr_hi			;
			movwf	peBsh				; 
			movfw	Up_alr_lo			; 
			movwf	peBsl				;
			call	sravnenie			;
			btfss	MEN					;
		goto	alr_d2					;

			movfw	Dn_alr_hi			;
			movwf	peBsh				; 
			movfw	Dn_alr_lo			; 
			movwf	peBsl				;
			call	sravnenie			;
			btfss	BOL					;
		goto	alr_d2					;
			movfw	Vr_pov_lo			; инициализация задежки на срабатывания аварии
			movwf	Vr_cpo_lo			;
			bcf		zad_op				;
		btfss		BRACON				; 	
	return								; время задежки не вышло
			btfsc	KVZD				; система в норме
		goto	$+.3					; 
			bcf		RELE1				; состояние сигнального реле
	return								; 
			bsf		RELE1				;
	return								; 
alr_d2									; 
			btfss	zad_op				; система в аварийном состоянии
	return								; 
			movfw	Vr_zak_lo			;
			movwf	Vr_cak_lo			; 
			bcf		BRACON				; 			
			btfsc	KVZD				; 
		goto	$+.3					;  
			bsf		RELE1				; состояние сигнального реле
		goto	$+.2					; 
			bcf		RELE1				; 
			movlw	.58 				; 
			call	big_str				; 
			movlw	.255				; 
			movwf	b_zad_ind			;
	return								; 			

				
;============================================================================================
;============================================================================================
klava		; программа обработки нажатия клавиш
			BANKSEL	TRISB				; выбрать TRISB
			movlw	PORTKN				; и настроить порты кнопок на ввод
			movwf	TRISB				; 
			BANKSEL	PORTB				; 
;==================================== !!!!!!!!
			call	zaderj				; вызов подпрограммы задержки
										; необходимая для установки уровней сигналов на входах
;====================================
			btfsc	KRB1					; клавиша функция 
		goto	t_PB3					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	KRB1					; для гашения дребезга контактов			
		goto	end_kl_call				; 
			bcf		f_KRB1				;
;====================
			btfsc		vp_rp			; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf			vp_rp			; установить режим коррекции параметров для кнопок < >
		goto	$+2						; 
			bcf			vp_rp			; установить режим вывора функций для кнопок < >
vyb_re	
			call	vyb_fun				; 
		goto	end_kl_call				; 
;====================================		
t_PB3		btfsc	KRB3					; клавиша меньше 
		goto	t_PB2					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	KRB3					; 			
		goto	end_kl_call				; 			
			bcf		f_KRB3				;
;====================
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf		LE_RI				; выбор направления вывора функций. только когда настроена выбор функции
	goto	vyb_re						; 
			call	ustanov				; 
		goto	end_kl_call				; 
;====================================	
t_PB2		btfsc	KRB2					; клавиша больше 
		goto	t_PB4					;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	KRB2					; 			
		goto	end_kl_call				; 			
			bcf		f_KRB2				;
;====================			
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bcf		LE_RI				; выбор направления вывора функций
		goto	vyb_re					; 
			call	ustanov				; 
		goto	end_kl_call				; 
;====================================
;====================================
t_PB4		btfsc	KRB4					; клавиша больше 
		goto	end_klava				;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	KRB4					; 			
		goto	end_kl_call				; 			
			bcf		f_KRB4				;
;====================			
; здесь описывается функция кнопки KRB4
		goto	end_kl_call				; 

;====================================
end_klava								;
			bcf		kl_no				; сбросить бит нажатия клавиши			
			movlw	SPUAN				; инициализация длительности свечения
			movwf	uskor_1				; 
			movwf	uskor				;

end_kl_call								;
			banksel	TRISB				; выбрать TRISB
			clrf	TRISB				; и настроить все линии порта на вывод 
			banksel	PORTB				; 

			bsf		f_KRB1				;
			bsf		f_KRB2				;
			bsf		f_KRB3				;
			bsf		f_KRB4				;
	return								;										
;====================================
vyh		;	нажатия двойные
			btfss	UST					;
		goto	end_vyh3				; 
			btfsc	vp_rp				; проверить система находится в режиме выбора функции
		goto	end_vyh1				; 
			btfsc	KRB4					; если удерживаю PB3+PB1		
		goto	end_vyh1				; 
			btfsc	KRB1					; 
		goto	end_vyh1				; 			
			;==============				; принудительный выход из режима настройки
			clrf	avtovyh				; 
			call	resautoexit
			;==============				;
		goto	end_vyh3				; 
;====================================
end_vyh1
			movlw	.5					; 
			subwf	uskor_1,w			; проверка достижения переменной величины 1
			BZ		end_vyh2			;	
			decfsz	uskor,f				; 
		goto	end_vyh3				; 
			decf	uskor_1,f			; 
			movfw	uskor_1				; 
			movwf	uskor				; 
end_vyh2								;			
			bcf		kl_no				;				
end_vyh3								;	
			bsf		f_KRB1				;
			bsf		f_KRB2				;
			bsf		f_KRB3				;
			bsf		f_KRB4				;
						
			banksel TRISB				; выбрать TRISB
			clrf	TRISB				; и настроить все линии порта на вывод 
			banksel PORTB				; 
	return								;
;============================================================================================
resautoexit
			call	zap_eeprom			; записать в память заводские установки
			bcf		UST					; бит режима настройки регулятора
			clrf	flag_2				; очистить флаг выбора параметра			
			bcf		vp_rp				; бит режима 0-выбор параметра		
			bcf		LE_RI				; настройка битов направлений
res_init
			movfw	Vr_zak_lo			;
			movwf	Vr_cak_lo			; 
			bcf		BRACON				; 			
			movfw	Vr_pov_lo			;
			movwf	Vr_cpo_lo			;
			bcf		zad_op				;			
	return								; 
;============================================================================================
zaderj				; вызов подпрограммы задержки
			movlw	.100					; .200
			movwf	temp				; 
			decfsz	temp,f				; 
			goto	$-1					; 		
		return							; 		
;============================================================================================
;============================================================================================						
; выбор функции настройки регулятора
vyb_fun
;====================================
			banksel	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			banksel	PORTB			; 

			bsf		kl_no			; бит клавиша нажата
			bsf		UST				; 
			clrf	flag_i1			; сброс спец индикации 	
			clrf	flag_i2			; 
;====================================			
			movlw	DIND			; перезагрузить пепеременную автовыхода
			movwf	avtovyh			; 
;====================================
			btfss	vp_rp			; если сброшен индицировать назавание параметра
		goto	pr_pr				; если установлен его значение			
;====================================
			btfsc	REGRA			; режим работы вольтметра
		goto	REGRA_f				; 
			btfsc	UP_VOL			; настройка вернего уровня автокконтроля вольтметра
		goto	UP_VOL_f			; 			
			btfsc	DN_VOL			; настройка нижнего уровня автокконтроля вольтметра
		goto	DN_VOL_f			; 
			btfsc	ZD_AKO			; задежка включения режима автоконтроля (после включения)
		goto	ZD_AKO_f			; 
			btfsc	ZD_AVR			; задежка срабатывания аварии
		goto	ZD_AVR_f			; 			
			btfsc	KALIBR			; калибровка вольтметра
		goto	KALIBR_f			; 			
			btfsc	RE_IND			; режим индикации
		goto	RE_IND_f			; 			
			btfsc	PROIZ			; Индикация телефона изготовителя
		goto	PROIZ_f				; 			
		goto	REGRA_f				; 						
;=================================
pr_pr								; 		
			btfsc	LE_RI			;
		goto	prev				; 	 
;=================================
			; циклический переключатель режимов
			btfsc	REGRA			; если установлен REGRA
		goto	UP_VOL_f			; то выбрать UP_VOL
			btfsc	UP_VOL			; 
		goto	DN_VOL_f			; 
			btfsc	DN_VOL			; 
		goto	ZD_AKO_f			; 
			btfsc	ZD_AKO			; 
		goto	ZD_AVR_f			; 
			btfsc	ZD_AVR			; 
		goto	KALIBR_f			; 
			btfsc	KALIBR			; 
		goto	RE_IND_f			; 			
			btfsc	RE_IND			; если установлен RE_IND 
		goto	PROIZ_f				; то выбрать PROIZ
		goto	REGRA_f				;
;=================================
prev			; циклический переключатель режимов - реверс
			btfsc	REGRA			; если установлен REGRA
		goto	PROIZ_f				; то выбрать  PROIZ
			btfsc	PROIZ			; 
		goto	RE_IND_f			; 
			btfsc	RE_IND			; 
		goto	KALIBR_f			; 
			btfsc	KALIBR			; 
		goto	ZD_AVR_f			; 
			btfsc	ZD_AVR			; 
		goto	ZD_AKO_f			; 
			btfsc	ZD_AKO			; 
		goto	DN_VOL_f			; 
			btfsc	DN_VOL			; 
		goto	UP_VOL_f			; 
		goto	REGRA_f				; 
;===============================================
		; бит выбора режима работы вольтметра
REGRA_f		clrf	flag_2			; 
			bsf		REGRA			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать название параметра
		goto	REGRA_d				; если установлен его значение
			movlw	.89				; 		
		goto	end_vybor_f			; 
REGRA_d		btfss	KVZD			; режим "Контроль входа в заданный диапазон"
		goto	i_KVUP				; 
			movlw	b'00000010'		; символ _
			movwf	ind_1			;
			movlw	cU				; символ U
			movwf	ind_2			;			
			movlw	b'00000010'		; символ _
			movwf	ind_3			;
	return							; 
i_KVUP		btfss	KVUP			; режим "Контроль выхода за установленные пределы"
		goto	i_INDK
			movlw	b'00010000'		; символ _
			movwf	ind_1			;
			movlw	cN				; символ П
			movwf	ind_2			;			
			movlw	b'00010000'		; символ _
			movwf	ind_3			;
	return							; 
i_INDK								; режим "Индикатор напряжения"
			movlw	ci				; символ i 
			movwf	ind_1			;
			movlw	cn				; символ n
			movwf	ind_2			;			
			movlw	cd				; символ d
			movwf	ind_3			;
			bsf		INDK			; если нет инициализации
	return							;  
;===============================================
	; бит настройки вернего уровня автоконтроля напряжения 
UP_VOL_f	clrf	flag_2			; 
			bsf		UP_VOL			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	UP_VOL_d			; если установлен его значение
			movlw	.77				; t--
		goto	end_vybor_f			; 
UP_VOL_d		
			movfw	Up_alr_hi		; 
			movwf	binh			; 
			movfw	Up_alr_lo		; 
			movwf	binl			; 
		goto	end_vybor1			; 
;===============================================
	; бит настройки нижнего уровня автоконтроля напряжения
DN_VOL_f	clrf	flag_2			; 
			bsf		DN_VOL			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	DN_VOL_d			; если установлен его значение
			movlw	.81				; t__ ---
		goto	end_vybor_f			; 
DN_VOL_d		
			movfw	Dn_alr_hi		; 
			movwf	binh			; 
			movfw	Dn_alr_lo		; 
			movwf	binl			; 
		goto	end_vybor1			; 
;===============================================
	;Время задежки автоконтроля параметров среды с момента включения или смены параметра
ZD_AKO_f	clrf	flag_2			; 
			bsf		ZD_AKO			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	ZD_AKO_d			; если установлен его значение
			movlw	.93				;  UAc ---
		goto	end_vybor_f			; 
ZD_AKO_d		
			clrf	binh			; 
			movfw	Vr_zak_lo		; 
			movwf	binl			; 
frfr		bcf		TOCHKA2			;
			bcf		TOCHKA3			;
			bcf		BTE				; 
			call    bin_dec			; 
			goto	end_vybor2		; 
;===============================================
	;Время задержки аварии
ZD_AVR_f	clrf	flag_2			; 
			bsf		ZD_AVR			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	ZD_AVR_d			; если установлен его значение
			movlw	.73				; 
		goto	end_vybor_f			; 
ZD_AVR_d		
			clrf	binh			; 
			movfw	Vr_pov_lo		; 
			movwf	binl			; 
		goto	frfr				; 	
;===============================================
	;Калибровка вольтметра
KALIBR_f	clrf	flag_2			; 
			bsf		KALIBR			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	KALIBR_d			; если установлен его значение
			movlw	.97				;  Uco ---
		goto	end_vybor_f			; 
KALIBR_d							; 
			movfw	U_izm_hi		; 				
			movwf	binh			; 			
			movfw	U_izm_lo		; 
			movwf	binl			; 
		goto	end_vybor1			; 		 			
;===============================================
		; режим индикации
RE_IND_f	clrf	flag_2			; 
			bsf		RE_IND			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать название параметра
		goto	RE_IND_d			; если установлен его значение
			movlw	.69				; 		
		goto	end_vybor_f			; 
RE_IND_d	btfss	R_ind			; режим "Индикатор напряжения"
		goto	i_RE_IND			; 
			movlw	cC				; символ - 
			movwf	ind_1			;
			movlw	cE				; символ -
			movwf	ind_2			;			
			movlw	cL				; символ -
			movwf	ind_3			;
	return							;  
i_RE_IND
			movlw	cd				; символ -
			movwf	ind_1			;
			movlw	cr				; символ -
			movwf	ind_2			;			
			movlw	co				; символ -
			movwf	ind_3			;
	return							; 
;===============================================
	; данные о изготовителе
PROIZ_f		clrf	flag_2			; 
			bsf		PROIZ			;
;====================================
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	PROIZ_d				; если установлен его значение
			movlw	.85				; тел. изготовителя
		goto	end_vybor_f			; 
PROIZ_d		movlw	.24				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка
			movlw	.85				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка	
	return							;  
;===============================================
;===============================================
; общие программы режима индикации функций
;===============================================
end_vybor_f							; 
			btfsc	LE_RI			; 
		goto	$+3
			call	big_str			; подпрограмма бегущая строка
	return							;  
			call	big_str_re		; подпрограмма бегущая строка
	return							; 
end_vybor1							; 
			bsf		BTE				; 
			call    bin_dec			; 
			btfsc	R_ind
		goto	$+.4
			bsf		TOCHKA2			;
			bcf		TOCHKA3			;
		goto	$+.3	
			bcf		TOCHKA2			;
			bsf		TOCHKA3			;
end_vybor2							; 
			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
			movwf	ind_1			;
	return							; 
;============================================================================================
;============================================================================================






;============================================================================================
; коррекция параметра выбранной функции
ustanov	
;====================================
			banksel	TRISB				; выбрать TRISB
			clrf	TRISB				; и настроить все линии порта на вывод 
			banksel	PORTB				; 
			
			bsf		kl_no			; бит клавиша нажата
			movlw	DIND			; инициализация счетчика задежки
			movwf	avtovyh			; автовыхода из установки

			
			btfsc	REGRA			;  режим работы вольтметра
			goto	u_REGRA			;
						
			btfsc	UP_VOL			; настройка вернего уровня автокконтроля вольтметра
			goto	u_UP_VOL		; 

			btfsc	DN_VOL			; настройка нижнего уровня автокконтроля вольтметра
			goto	u_DN_VOL		; 
			
			btfsc	ZD_AKO			; задежка включения режима автоконтроля (после включения)
			goto	u_ZD_AKO		; 

			btfsc	ZD_AVR			; задежка срабатывания аварии
			goto	u_ZD_AVR		; 			
			
			btfsc	KALIBR			; калибровка вольтметра
			goto	u_KALIBR		; 

			btfsc	RE_IND			; режим индикации
			goto	u_RE_IND		; 
	return							; 
;====================================
;  режим работы вольтметра
u_REGRA				
			btfsc	f_KRB3			; 
		goto	kk_REGRA			;
			btfss	INDK			;
		goto	$+.4				;
			bcf		INDK			;
			bsf		KVUP			;
	goto	REGRA_d					;
			btfss	KVUP			;
		goto	$+.4				;
			bcf		KVUP			;
			bsf		KVZD			;
	goto	REGRA_d					;				
			bcf		KVZD			;
			bsf		INDK			;
	goto	REGRA_d					;

kk_REGRA	btfsc	f_KRB2			; 
	goto	REGRA_d					;	
			btfss	INDK			;
		goto	$+.4				;
			bcf		INDK			;
			bsf		KVZD			;
	goto	REGRA_d					;
			btfss	KVZD			;
		goto	$+.4				;
			bcf		KVZD			;
			bsf		KVUP			;
	goto	REGRA_d					;
			bcf		KVUP			;
			bsf		INDK			;
	goto	REGRA_d					;
;====================================
; режим индикации
u_RE_IND			
			btfss	R_ind			;
		goto	$+.3				;
			bcf		R_ind			;
		goto	$+.2	
			bsf		R_ind			;
	goto	RE_IND_d				;
		
;====================================
;=========================================
u_KALIBR	; калибровка вольтметра
			btfsc	f_KRB3				; + увеличение
		goto	kk_KALIBR				;
	
;			movlw	0xff				;
;			movwf	peAsh				;
;			movlw	0xff				;
;			movwf	peAsl				;

;			movf	kalibr_hi,w			;
;			movwf	peBsh				;
;			movf	kalibr_lo,w			;
;			movwf	peBsl				;
;			call	sravnenie			;
;			btfss	BOL					;
;		goto	kk_KALIBR				;
			movlw	.1					;
			addwf	kalibr_lo,f			;
			btfss	STATUS,C			;
		goto	end_KALIBR				; 
			incf	kalibr_hi,f			;
		goto	end_KALIBR				; 
kk_KALIBR								; 
			btfsc	f_KRB2				; - уменьшение
	goto	end_KALIBR					; 
;			clrf	peAsh				; 1 cek		
;			movlw	.1
;			movwf	peAsl				;
;	
;			movf	kalibr_hi,w			;
;			movwf	peBsh				;
;			movf	kalibr_lo,w			;
;			movwf	peBsl				;
;			call	sravnenie			;
;			btfss	MEN					;
;	goto	end_KALIBR					; 
			movlw	.1					;
			subwf	kalibr_lo,f			;
			btfsc	STATUS,C			;
	goto	end_KALIBR					;			
			decf	kalibr_hi,f			;
end_KALIBR								;
	goto	KALIBR_d					;
;=========================================
; задежка срабатывания аварии
u_ZD_AVR
			btfsc	f_KRB3				; + увеличение
		goto	kk_ZD_AVR				;
			clrf	peAsh				;
			movlw	.240				; 240sek
			movwf	peAsl				;

			clrf	peBsh			;
			movf	Vr_pov_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
		goto	kk_ZD_AVR			;
			movlw	.1				;
			addwf	Vr_pov_lo,f		;
		goto	end_ZD_AVR			; 
kk_ZD_AVR							; 
			btfsc	f_KRB2			; - уменьшение
	goto	end_ZD_AVR				; 
			clrf	peAsh			;	
			clrf	peAsl			;

			clrf	peBsh			;
			movf	Vr_pov_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	end_ZD_AVR				; 
			movlw	.1				;
			subwf	Vr_pov_lo,f		;
end_ZD_AVR							;
	goto	ZD_AVR_d					;
;=========================================
;=========================================
; настройка вернего уровня автоконтроля температуры
u_UP_VOL
			btfsc	f_KRB3			; + увеличение
		goto	kk_UP_VOL			;
			movlw	0x03			; +99,9
			movwf	peAsh			;
			movlw	0xe7			;
			movwf	peAsl			;
			
			movf	Up_alr_hi,w		;
			movwf	peBsh			;
			movf	Up_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
		goto	kk_UP_VOL			;
			movlw	.1				;
			addwf	Up_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Up_alr_hi,f		;
		goto	end_UP_VOL			; 

kk_UP_VOL							; 
			btfsc	f_KRB2			; - уменьшение
	goto	end_UP_VOL				; 
			movfw	Dn_alr_hi		; должна быть не ниже Dn_alr+1,0
			movwf	peAsh			;		
			movfw	Dn_alr_lo		;
			movwf	peAsl			;
			movlw	.10				; + 1.0 v
			addwf	peAsl,f			;
			btfsc	STATUS,C		;
			incf	peAsh,f			;
			
			movf	Up_alr_hi,w		;
			movwf	peBsh			;
			movf	Up_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	end_UP_VOL				; 
			movlw	.1				;
			subwf	Up_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Up_alr_hi,f		;
	goto	end_UP_VOL				; 
end_UP_VOL							;
	goto	UP_VOL_d				;
;=========================================
;=========================================
; настройка нижнего уровня автоконтроля температуры
u_DN_VOL
			btfsc	f_KRB3			; + увеличение
		goto	kk_DN_VOL			;
			movfw	Up_alr_hi		;ограничение по заданию максимального значения
			movwf	peAsh			; должна быть не выше Тзад-Тгис-1,0
			movfw	Up_alr_lo		;Задание уровня температуры
			movwf	peAsl			;
			movlw	.10				; отнять  1.0 v
			subwf	peAsl,f			;
			btfss	STATUS,C		;
			decf	peAsh,f			;
			
			movf	Dn_alr_hi,w		;
			movwf	peBsh			;
			movf	Dn_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
		goto	kk_DN_VOL			;
			movlw	.1				;
			addwf	Dn_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Dn_alr_hi,f		;
		goto	end_DN_VOL			; 
kk_DN_VOL							; 
			btfsc	f_KRB2			; - уменьшение
	goto	end_DN_VOL				; 
			clrf	peAsh			;	00	
			clrf	peAsl			;
			movf	Dn_alr_hi,w		;
			movwf	peBsh			;
			movf	Dn_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	end_DN_VOL				; 
			movlw	.1				;
			subwf	Dn_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Dn_alr_hi,f		;
end_DN_VOL							;
	goto	DN_VOL_d					;
;=========================================
;=========================================
u_ZD_AKO	; задежка включения режима автоконтроля (после включения)
			btfsc	f_KRB3			; + увеличение
		goto	kk_ZD_AKO			;
			clrf	peAsh			;
			movlw	.240			; 240sek
			movwf	peAsl			;

			clrf	peBsh			;
			movf	Vr_zak_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
		goto	kk_ZD_AKO			;
			movlw	.1				;
			addwf	Vr_zak_lo,f		;
		goto	end_ZD_AKO			; 
kk_ZD_AKO							; 
			btfsc	f_KRB2			; - уменьшение
	goto	end_ZD_AKO				; 
			clrf	peAsh			;	
			clrf	peAsl			;

			clrf	peBsh			;
			movf	Vr_zak_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	end_ZD_AKO				; 
			movlw	.1				;
			subwf	Vr_zak_lo,f		;
end_ZD_AKO							;
	goto	ZD_AKO_d				;
;=========================================

;=========================================











;*************************************************************************************************
big_str								; подпрограмма бегущая строка
			movwf	perem2			; 		
			clrf	flag_i1			; сброс спец индикации 	
			call 	och_left		; очистка индикатора
			movfw	perem2			; начало чтения данных
			movwf	schet_sim2		; 
			call 	text_1			; подпрограма текста
			movwf 	schet_sim1		; запись количества символов текста в счетчик
infch		incf	schet_sim2,f	; увеличения счетчика вывора символа
			decfsz	schet_sim1,f	; уменьшения счет. циклов на 1 и проверка на 0
			goto	pr				; начало очистки
	return
pr			clrwdt					; сброс сторожевого таймера++++++
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_1			; загрузка в знакоместо
			movfw	ind_3			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	schet_sim2		; вызов значения в аккумулятор
			call 	text_1			; вызов текущего символа
			movwf	ind_3			; загрузка в знакоместо
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.65				;
			movwf	b_zad_ind		;
			goto	infch			; повтор очистки
;*************************************************************************************************
big_str_re							; подпрограмма бегущая строка с лево на право
			movwf	perem2			; 		
			clrf	flag_i1			; сброс спец индикации 	
			call 	och_ring		; очистка индикатора
			movfw	perem2			; начало чтения данных
			movwf	schet_sim2		; 
			call 	text_1			; подпрограма текста
			movwf 	schet_sim1		; запись количества символов текста в счетчик
			;movfw	perem2
			addwf	schet_sim2,f
infch_re	decf	schet_sim2,f	; увеличения счетчика вывора символа
			decfsz	schet_sim1,f	; уменьшения счет. циклов на 1 и проверка на 0
			goto	pr_re			; 	начало очистки
			;call 	och_ring		; очистка индикатора
	return
pr_re		clrwdt					; сброс сторожевого таймера++++++
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_3			; загрузка в знакоместо
			movfw	ind_1			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	schet_sim2		; вызов значения в аккумулятор
			call 	text_1			; вызов текущего символа
			movwf	ind_1			; загрузка в знакоместо
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.65				;
			movwf	b_zad_ind		;
			goto	infch_re		; 	повтор очистки
;*************************************************************************************************
			; очистка индикатора "<-"
och_left	movlw	.4				; количество знакомест индикатора +1
			movwf	schet_sim2		; закрузка счетчика циклов
dec_left	decfsz	schet_sim2,f	; уменьшения счет. циклов на 1 и проверка на 0
			goto	$+.2			; 	начало очистки
		return						; 	конец очистки
			clrwdt					; сброс сторожевого таймера++++++
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_1			; загрузка в знакоместо
			movfw	ind_3			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			clrf	ind_3			; очистить 3 знакрместо
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.65				;
			movwf	b_zad_ind		;
			goto	dec_left		; 	повтор очистки
;*************************************************************************************************
			; очистка индикатора "->"
och_ring	movlw	.4				; количество знакомест индикатора +1
			movwf	schet_sim2		; закрузка счетчика циклов
dec_ring	decfsz	schet_sim2,f	; уменьшения счет. циклов на 1 и проверка на 0
			goto	$+.2			; 	начало очистки
		return						; 	конец очистки
			clrwdt					; сброс сторожевого таймера++++++
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_3			; загрузка в знакоместо
			movfw	ind_1			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			clrf	ind_1			; очистить 3 знакрместо
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.65				;
			movwf	b_zad_ind		;
			goto	dec_ring		; 	повтор очистки
;*************************************************************************************************
;==================Индикация=================================================================
;программа управления портами ввода/вывода микроконтроллера	
;============================================================================================
indic								; программа развертки индикацией
;=============================================	
			btfsc	TOCHKA1			; загрузка десятичной точки
			bsf		ind_1,0			; 
			btfsc	TOCHKA2			; 
			bsf		ind_2,0			; 
			btfsc	TOCHKA3			; 
			bsf		ind_3,0			; 
;=============================================	
;=============================================	
i1ry		btfss	reg_ind,0		; 
		goto	i2ry				; 
			movfw	ind_1			; вызов кода индикации первого знакоместа (левого)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR1			; 
			goto	ir1t			; индикация разряда постоянна
;=========================			; 
			btfss	B_MIG			; мигание
			goto	ir1t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir1t			; 
;=========================			; 	
ir1t		btfss	TOCHm1			; 
			goto	ir1				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir1			call	indiprot		; 
			clrf	reg_ind			; 
			bsf		reg_ind,1		; 
	return							; 
;=============================================	
;=============================================		
i2ry		btfss	reg_ind,1		; 
		goto	i3ry				; 
			movfw	ind_2			; вызов кода индикации второго знакоместка (среднего)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR2			; 
			goto	ir2t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir2t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir2t			; 
;=========================			; 		
ir2t		btfss	TOCHm2			; 
			goto	ir2				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir2			call	indiprot		; 
			clrf	reg_ind			; 
			bsf		reg_ind,2		; 
	return							; 
;=============================================	
;=============================================	
i3ry								; 
			movfw	ind_3			; вызов кода индикации третьего знакоместка (правого)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR3			; 
			goto	ir3t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir3t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir3t			; 
;=========================			; 		
ir3t		btfss	TOCHm3			; 
			goto	ir3				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir3			call	indiprot		;
			clrf	reg_ind			;
			bsf		reg_ind,0		;
	return							; 
;=============================================	
;=============================================	
indiprot	; управления портами ввода вывода 				
			; отключение индикации c охранением состояния портов управления (реле)			
			movfw	PORTB			; загрузка 
			movwf	d_PORTB			; 
			movfw	PORTA			; 
			movwf	d_PORTA			; 
;====================================
			movlw	CL_PA			; очистка порта A (c учетом RA4/3 выхода на реле)  
			andwf	d_PORTA,f		;			
			movlw	SE_PA			; установка битов разрядов индикации в off
			iorwf	d_PORTA,f		; 

			movlw	CL_PB			; очистка порта A (c учетом RA4 выхода на реле)  
			andwf	d_PORTB,f		;			
			movlw	SE_PB			; установка битов разрядов индикации в off
			iorwf	d_PORTB,f		; 
;====================================			
			movfw	d_PORTA			; отключение индикации
			movwf	PORTA			; 
			movfw	d_PORTB			; 
			movwf	PORTB			;   
;====================================
			
			btfsc	r_PORTB,0		; дешифрация символа
			bsf		S_H				; в состояние портов
			btfsc	r_PORTB,1		;
			bsf		S_A				;			
			btfsc	r_PORTB,2		;
			bsf		S_B				;
			btfsc	r_PORTB,3		;
			bsf		S_C				;
			btfsc	r_PORTB,4		;
			bsf		S_D				;
			btfsc	r_PORTB,5		;
			bsf		S_E				;
			btfsc	r_PORTB,6		;
			bsf		S_F				;
			btfsc	r_PORTB,7		;
			bsf		S_G				;			

			btfsc	reg_ind,0		; выбор индикации разряда
			bcf		SOT				; 
			btfsc	reg_ind,1		; 
			bcf		DES				; 
			btfsc	reg_ind,2		; 
			bcf		EDI				; 
;=====================================
			btfsc	RELE1			; управлением реле нагревателя
		goto	$+3					; 
			bcf		d_PORTB,0		; 
		goto	$+2					; 
			bsf		d_PORTB,0		; 			
;=====================================			
;			btfsc	RELE2			; управление реле аварии
;		goto	$+3					; 
;			bcf		d_PORTA,0		; 
;		goto	$+2					; 
;			bsf		d_PORTA,0		; 			
;=====================================
			movfw	d_PORTA			; загрузка портов
			movwf	PORTA			; 
			movfw	d_PORTB			; 
			movwf	PORTB			; 
	return							; 
;============================================================================================	
;******************** цикл индикации *************************************************************
ind_zad								; задежка вывода индикации
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.60				;
			movwf	b_zad_ind		;
		return						; 					; 
;*************************************************************************************************
;============================================================================================
;********************востановление данных*********************************************************
vost_data								; 
			movlw	(end_stek-flag_0)+1	; 
			movwf	chtteep				; 
			movlw	flag_0
			movwf	FSR				;  загрузка начала блока данных
			clrf	adr_e				; 			
povch			
			call	prov_eep			; сосчитать данные с EEPROM
			movwf	INDF				; загрузить в ОЗУ и увеличить указатель
			incf	FSR,f			
			incf	adr_e,f				; увеличить адрес EEPROM
			decfsz	chtteep,f				; уменьшить счетчик и проверить на ноль
			goto	povch				; повториь если не ноль
	return								; 
;********************
;=================================================================================================
prov_eep	call	rd_eeprom			; вызвать данные
			movf	data_e,w
			movwf	perem1				; 
			incf	adr_e,f				; адрес для EEPROM
			call	rd_eeprom			; вызвать данные (копия)
			movf	data_e,w			;
			subwf	perem1,w			; сравнить на равенство данных в EEPROM
			btfss	STATUS,Z			; 
			goto	$+3					; 
			movf	data_e,w			; данные равны
		return							; 
			btfss	STATUS,C			; 
			goto	$+3					; 
			movf	data_e,w			; 
			goto	$+2					; 
			movf	perem1,w			; 
			bsf		E_data				; ошибка в EEPROM
		return							; 
;=================================================================================================
rd_eeprom	movfw	adr_e			; загрузить значение адреса чтения
			BANKSEL	EEADR			; выбор банка EEADR
			movwf	EEADR			; выставить нулевой адрес
			BANKSEL	EECON1			; 
			BCF 	EECON1,EEPGD	; выбор память данных (EEPROM)
			bsf		EECON1,RD		; начать чтение с  EEPROM
			BANKSEL	EEDATA			; 
			movfw	EEDATA			; сосчитать данные температуры регулирования
			BANKSEL	data_e			; выбор банка data_e
			movwf	data_e			; сохранить в переменной
	return
;=================================================================================================
zap_eeprom								; запись в EEPROM
			movf	INTCON,w
			movwf	perem5				; сохранить значение регистра INTCON			
			bcf		INTCON,GIE			; запретить все прерывания			

			movlw	(end_stek-flag_0)+1	;	; для записи используются данные с адреса Tzad_h1 по kol_oh_vv	
			movwf	chtteep				; 
			movlw	flag_0
			movwf	FSR					; загрузка начала блока данных
			clrf	adr_e				; 			

povch1		
			movf	INDF,w				; загрузить в ОЗУ и увеличить указатель
			call	zap_2byt_eeprom		;
			incf	FSR,f
			incf	adr_e,f				; увеличить адрес EEPROM
			decfsz	chtteep,f				; уменьшить счетчик и проверить на ноль
			goto	povch1				; повториь если не ноль
			movf	perem5,w
			movwf	INTCON				; востановить значение регистра INTCON
	return								;
;********************************************************************************************
zap_2byt_eeprom							;
			movwf	data_e				;
			movwf	perem2				;
			call	wr_eeprom			;
			incf	adr_e,f				; сохранение данных в EEPROM 
			movf	perem2,w			;
			movwf	data_e				;
			call	wr_eeprom			;
	return								;
;********************************************************************************************				
;********************************************************************************************				
;				запись байта в EEPROM
wr_eeprom		
			BANKSEL	EECON1
			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
		goto	$-1					; 
			BCF 	EECON1,EEPGD	; Point to DATA	memory
			bsf		EECON1,WREN		; разрешить запись
			BANKSEL	adr_e			; 
			movfw	adr_e			; 
			BANKSEL	EEADR			; 			
			movwf	EEADR			; установка адреса 1
			BANKSEL	data_e			; 
			movfw	data_e			; и вызов переменой состояния для сохранения
			BANKSEL	EEDATA			; 
			movwf	EEDATA			; в EEPROM
			BANKSEL	EECON2			; 
			movlw	0x55			; активация цикла записи в EEPROM
			movwf	EECON2			;
			movlw	0xAA			;
			movwf	EECON2			;
			bsf		EECON1,WR		; начать запись
;			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
;		goto	$-1	
			bcf		STATUS,RP0		; выбрать банк 0
			bcf		STATUS,RP1		; выбрать банк 0
	return
;********************************************************************************************
;********************************************************************************************
;				запрет записи в EEPROM
stop_wr_e		
			BANKSEL	EECON1
			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
			goto	$-1
			bcf		EECON1,WREN		; запретить запись			
			bcf		STATUS,RP0		; выбрать банк 0
			bcf		STATUS,RP1		; выбрать банк 0
	return								;
;********************************************************************************************
;============================================================================================
;============================================================================================
;***подпрограма преобразования 24/16 битного двоичного со знаком в 7 байта двоично десятичного ****************
; значение чисел для 24 бита  - - 8 388 607 до + 8 388 607
; для 16 бит  - - 32767 до + 32767
										; входные данный binl, binh, binu
										; выходные edin,dest,sotn,tysc,dtys,stys,mlon
										; B24 0 преобразоваание 16 бит, 1- 24 (16 по умолчанию)
										; BTE бит преобразования вида 00 или 0
										; BTE0_00	индикация "третьего нуля" для чисел вида - 0,00
bin_dec
;===============================================
				movfw	binu			; 
				movwf	t_binu			; 
				movfw	binh			; 
				movwf	t_binh			; 
				movfw	binl			; 
				movwf	t_binl			; 
;===============================================							
				bcf		MINUS			; сбросить флаг отрицательной температуры
				btfsc	B24				; если установлен бит
			goto	bi0p				; 
				clrf	binu			; очистить старший байт если обработка 16 битных чисел
				btfss	binh,7			; проверить температура отрицательная			
				goto	bi0				; нет
			goto	comfd				;
bi0p			btfss	binu,7			; проверить число отрицательное
			goto	bi0					; нет
				comf	binu,f			; преобразование отрицательного числа в положительное для обработки	
comfd			bsf		MINUS			; ДА установить бит отрицательной температуры
				comf	binl,f			; 
				comf	binh,f			; 
				movlw	.1				; 
				addwf	binl,f			; 
			BNC		bi0					; 
				addwf	binh,f			; 
			BNC		bi0					; 
				incf	binu,f			; 
;===============================================
bi0				bcf		B24				; сбросить бит обработки 24 битных чисел
	 			bcf     STATUS,0        ; clear the carry bit
				movlw   .24				; 
				movwf   count			; 
				clrf    R3				; 
				clrf    R2				; 
				clrf    R1				; 
				clrf    R0				; 
loop24  		rlf     binl, F			; 
				rlf     binh, F			; 
				rlf     binu, F			; 
				rlf     R0, F			; 
				rlf     R1, F			; 
				rlf     R2, F			; 
				rlf     R3, F			; 
				decfsz  count, F		; 
			goto    adjDEC				; 
;===============================================
				movfw	R3				; 
				andlw	b'00001111'		; 
				movwf	mlon			; 
				swapf	R2,w			; 
				andlw	b'00001111'		; 
				movwf	stys			; 
				movfw	R2				; 
				andlw	b'00001111'		; 
				movwf	dtys			; 
				swapf	R1,w			; 
				andlw	b'00001111'		; 
				movwf	tysc			; 
				movfw	R1				; 
				andlw	b'00001111'		; 
				movwf	sotn			; 
				swapf	R0,w			; 
				andlw	b'00001111'		; 
				movwf	dest			; 
				movfw	R0				; 
				andlw	b'00001111'		; 
				movwf	edin			; 
;===============================================
		; программа гашения незначащих нулей		
gnn				movlw	.10				; код очистки знакоместа (пусто)
				movf	mlon,f			; проверить на ноль
				BNZ		preo01			; пропустить след команду если ноль
				movwf	mlon			; записать код очиски знакоместа
				
				movf	stys,f			; проверить на ноль
				BNZ		preo01			; пропустить след команду если ноль
				movwf	stys			; записать код очиски знакоместа
				
				movf	dtys,f			; проверить на ноль
				BNZ		preo01			; пропустить след команду если ноль
				movwf	dtys			; записать код очиски знакоместа
				
				movf	tysc,f			; проверить на ноль
				BNZ		preo01			; пропустить след команду если ноль
				movwf	tysc			; записать код очиски знакоместа	
				
				movf	sotn,f			; проверить на ноль
				BNZ		preo01			
				btfss	BTE0_00			; проверить тип индикации 0 или 00
			goto	tuns				; тип индикации 0
				bcf		BTE0_00			; сбросить бит типа индикации
			goto	preo01				; тип индикации 00				
tuns			movwf	sotn			; записать код очиски знакоместа	
				movf	dest,f			; проверить на ноль
				BNZ		preo01			; 
				btfss	BTE				; проверить тип индикации 0 или 00
			goto	tunn				; тип индикации 0
				bcf		BTE				; сбросить бит типа индикации
			goto	preo01				; тип индикации 00				
tunn			movwf	dest			; записать код очиски знакоместа				
;===============================================
preo01		; программа прописи знака минус если число отрицательно
				btfss	MINUS			;
			goto 	concis				;
				movlw	.10				; проверить на код пусто в десятках
				subwf	dest,w			; вычетанием
				btfss	STATUS,Z		;
				goto 	mt60			; 
				movlw	.11				;
				movwf	dest			; установвить минус в десятках
			goto 	concis				;
mt60			movlw	.10				; проверить на код пусто в десятках
				subwf	sotn,w			; вычетанием
				btfss	STATUS,Z		;
				goto 	mt61			; 
				movlw	.11				;
				movwf	sotn			; установвить минус в десятках
			goto 	concis				;
mt61			movlw	.10				; проверить на код пусто в десятках
				subwf	tysc,w			; вычетанием
				btfss	STATUS,Z		;
				goto 	mt62			; 
				movlw	.11				;
				movwf	tysc			; установвить минус в десятках
			goto 	concis				;
mt62			movlw	.10				; проверить на код пусто в десятках
				subwf	dtys,w			; вычетанием
				btfss	STATUS,Z		;
				goto 	mt63			; 
				movlw	.11				;
				movwf	dtys			; установвить минус в десятках
			goto 	concis				;
mt63			movlw	.10				; проверить на код пусто в десятках
				subwf	stys,w			; вычетанием
				btfss	STATUS,Z		;
				goto 	mt64			; 
				movlw	.11				;
				movwf	stys			; установвить минус в десятках
			goto 	concis				;
mt64			movlw	.11				;
				movwf	mlon			; установить минус в сотнях					
;===============================================
			; преобразовать дес число в коды индикатора
concis			movf	mlon,w			; 
				call 	deshif			; 
				movwf	mlon			;
				movf	stys,w			; 
				call 	deshif			; 
				movwf	stys			;			
				movf	dtys,w			; 
				call 	deshif			; 
				movwf	dtys			;
				movf	tysc,w			; 
				call 	deshif			; 
				movwf	tysc			;
				movf	sotn,w			; 
				call 	deshif			; 
				movwf	sotn			;
				movf	dest,w			; 
				call 	deshif			; 
				movwf	dest			;
				movf	edin,w			; 
				call 	deshif			; 
				movwf	edin			;
;===============================================
				movfw	t_binu			; 
				movwf	binu			; 
				movfw	t_binh			; 
				movwf	binh			; 
				movfw	t_binl			; 
				movwf	binl			; 
;===============================================
		RETLW   0			; конец программы преобразования
;===============================================
adjDEC 		 	movlw   R0				;
				movwf   FSR				;
				call    adjBCD			;
		 		movlw   R1				;
				movwf   FSR				;
				call    adjBCD			;
				movlw   R2				;
				movwf   FSR				;
				call    adjBCD			;
				movlw   R3				;
				movwf   FSR				;
				call    adjBCD			;
			goto    loop24				;
;===============================================
adjBCD 			movlw   3				;
				addwf   0,W				;
				movwf   temp			;
				btfsc   temp,3          ; test if result > 7
				movwf   0				;
				movlw   30				;
				addwf   0,W				;
				movwf   temp			;
				btfsc   temp,7          ; test if result > 7
				movwf   0    	        ; save as MSD
		RETLW   0						;
;===============================================
;============================================================================================					
;============================================================================================


;============================================================================================
sravnenie								; 16 & 16 битных чисел
; входные peAsh,peAsl и peBsh,peBsl
; выходные флаги состояний RAV,BOL,MEN,BOL_RAV,MEN_RAV

			clrf	flag_srv			; очистка флагов сравнения
			clrf	regsr				; очистить переменную определения знаков

sr16z		btfsc	peAsh,7				; проверить 7 бит если 0 положит
			bsf		regsr,0				; если 1 отриц. записать 1 в 0 раз.
			btfsc	peBsh,7				; проверить 7 бит если 0 положит
			bsf		regsr,1				; если 1 отриц. записать 1 в 1 раз.
										; 0 оба числа положительные
										; 1 первое отриц.
										; 2 второе отриц
										; 3 оба отриц.
						; первоначальный принцип сравнения
						; положительное больше отрицатального
uzs			movf	regsr,f				;
			BZ		srv					; оба числа положит перейти на сравнения полож чисел
			movlw	.1					; 
			subwf	regsr,w				; если перем 5 = 1, то peAsh отриц, число, а peBsh полож
			BNZ		$+4					;
			bsf		MEN					; значит peBsh>peAsh 
			bsf		MEN_RAV				;
		return							; 
			movlw	.2					; если перм 5 = 2 то то peBsh отриц, число, а peAsh полож
			subwf	regsr,w				;
			BNZ		srv					; оба числа отрицательны перейти на сравнения как полож чисел
			bsf		BOL					; значит peBsh<peAsh  
			bsf		BOL_RAV				;
		return							; 
	;=================================== сравнение положительных чисел
srv										;
			movf	peAsh,w				; сравнение целых частей
			subwf	peBsh,w				;(пропустить если равно)
			btfss	STATUS,Z
			goto	$+2					; числа не равны
			goto	prs					; числа равны проверить след биты
			movf	peAsh,w				; 
			subwf	peBsh,w				; пропустить если меньше
			btfsc	STATUS,C			;
			goto	$+4					;
			bsf		BOL					; peAsh>peBsh сравнение млад неиграет роли
			bsf		BOL_RAV				;
		return							; 
			bsf		MEN					; peAsh<peBsh сравнение млад неиграет роли 			
			bsf		MEN_RAV				;
		return							;
prs			movf	peAsl,w				; сравнение вторых байт
			subwf	peBsl,w				;(пропустить если равно)
			btfss	STATUS,Z
			goto	$+.5				; числа не равны
			bsf		RAV					; peAsh=peBsh и perem2=peBsh
			bsf		MEN_RAV				; 
			bsf		BOL_RAV				; 		
		return
			movf	peAsl,w				; 
			subwf	peBsl,w				; пропустить если меньше
			btfsc	STATUS,C
			goto	$+4					;
			bsf		BOL					; peAsh=peBsh и perem2>
			bsf		BOL_RAV
		return							; 
			bsf		MEN					; peAsh=peBsh и perem2< 
			bsf		MEN_RAV				;
		return							;
;============================================================================================

;============================================================================================
kondosdata			; контроль достоверности данных
;		;контроль велицины  Верхний аварийный уровень
			movf	Up_alr_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			movf	Up_alr_hi,w		;
			movwf	peAsh			;			
			movlw	0xE7			;600
			movwf	peBsl			; загрузка данных
			movlw	0x03			; 
			movwf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
			clrf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	MEN				; если больше авария
		goto	vos_data			;
;		;контроль велицины Нижний аварийный уровень
			movf	Dn_alr_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			movf	Dn_alr_hi,w		;
			movwf	peAsh			;			
			movlw	0xE7			;600
			movwf	peBsl			; загрузка данных
			movlw	0x03			;
			movwf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
			clrf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	MEN				; если больше авария
		goto	vos_data			;
;		;контроль велицины Время задежки автоконтроля параметров среды с момента включения или смены параметра
			movf	Vr_zak_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			clrf	peAsh			;			
			movlw	0xF0			;+ 240
			movwf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
			clrf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	MEN				; если больше авария
		goto	vos_data			;
;		;контроль велицины Время задержки аварии
			movf	Vr_pov_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			clrf	peAsh			;			
			movlw	0xF0			;+ 240
			movwf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
			clrf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	MEN				; если больше авария
		goto	vos_data			;
;		;контроль велицины Нижний аварийный уровень
;			movf	kalibr_lo,w		;
;			movwf	peAsl			; сравнение данных на превышение максим	
;			movf	kalibr_hi,w		;
;			movwf	peAsh			;			
;			clrf	peBsl			; загрузка данных
;			clrf	peBsh			; загрузка данных
;			call    sravnenie		;
;			btfsc	MEN				; если больше авария
;		goto	vos_data			;
	return	
;====================================
vos_data	
			; инциализация данных в результате сбоя и сохранения в EEPROM
			BANKSEL	TRISB				; выбрать TRISB
			clrf	TRISB				; и настроить все линии порта на вывод 
			BANKSEL	PORTB				; 
			
			clrf	flag_0				; 

			clrf	Up_alr_hi			;* 
			movlw	0xf0				;
			movwf	Up_alr_lo			;*
			
			clrf	Dn_alr_hi			;* 
			movlw	0x0a				;
			movwf	Dn_alr_lo			;*
			

			movlw	0x0a				;
			movwf	Vr_zak_lo			;*

			movlw	0x0a				;
			movwf	Vr_pov_lo			;*

			movlw	0x13				;
			movwf	kalibr_lo			;*

			movlw	0x02				;
			movwf	kalibr_hi			;*

					
			call	zap_eeprom			; записать в память заводские установки 
alr_d
			
			bcf		RELE1				; линия реле 
			clrf	flag_i1				; 
			clrf	flag_i2				; 			
			movlw	.40					; 
			call	big_str				;бегущая строка авария данных
		goto	alr_d					; 
;============================================================================================

;********************************************************************************************************
conv_volt								; конвертирование значения температуры
				; проверка на диапазон индикации 00 + 999 ed
			call	bin_dec					;

			movf	binh,w			;ПРОВЕРИТЬ ИЗМ >999
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0x03			;
			movwf	peBsh			;
			movlw	0xE7			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	BOL				;
		goto	p_ind_r1			;
			movlw	.50  			; 
			call	big_str			; бегущая строка - горячо
			call 	och_left		; очистка индикатора
	return	
					
;				вид индикации
p_ind_r1
			btfsc	R_ind
		goto	obind
			btfss	RELE1			; цикл управления прерывистой индикацией
			goto	$+3				;
			bsf		TOCHm2			;
			goto	$+2				;
			bcf		TOCHm2			;
			bcf		TOCHm3			;			
			bcf		TOCHKA3			;
			bsf		TOCHKA2			;
			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
			movwf	ind_1			; 				
		return						; 
obind
			btfss	RELE1			; цикл управления прерывистой индикацией
			goto	$+3				;
			bsf		TOCHm3			;
			goto	$+2				;
			bcf		TOCHm3			;
			bcf		TOCHm2			;
			bsf		TOCHKA3
			bcf		TOCHKA2
			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
			movwf	ind_1			; 				
		return						;

;********************************************************************************************************
;U [mV] = kalibr*(Uadc*2) - kalibr*(Uadc*2)/64 - kalibr*(Uadc*2)/128
;диаразон 0-99,9 вольта
;*************************************************************************************************
Voltmetr								; подпрограммы измерения		
;				btfss	IZM						; ожидание окончания преобразования АЦП
;		return									;
;				bcf		IZM
				movf	ChTiz,f					;
				SKPNZ							;
				goto	$+5						;
				movlw	.2						;
				subwf	ChTiz,f					;
				SKPZ							;
				goto	$+3						;
				movlw	.8						;
				movwf	ChTiz					;
				bsf		IZM_ACP					; запуск АЦП
				btfsc	IZM_ACP					; ожидание окончания преобразования АЦП
				goto	$-1						;

				movlw	ChTiz					;
				addwf	ChTiz,w					;
				movwf	FSR						;
				bsf		STATUS,RP0				; RP0-1 выбор банка 1 памяти 				
				movfw	ADRESL					; чтение младшего байта 
				bcf		STATUS,RP0				; выбор банка 0				
				movwf	INDF					; запись в переменную старшего байта
				movfw	ADRESH					; чтение старшего байта АЦП	
				decf	FSR,f					;
				movwf	INDF					; запись в переменную младшего байта
;+++++++++++++++++++++++ программа вычисления среднего из 4 циклов измерния
				movlw	Til4					; 
				movwf	FSR						; 
				movfw	INDF					; 
				movwf	peAsl					; 
				decf	FSR,f					; 
				movfw	INDF					; 
				movwf	peAsh					; 

				movlw	.3						; 
				movwf	Chokr					; 
				
zag1			decf	FSR,f					; 
				movfw	INDF					; 
				addwf	peAsl,f					;
				SKPNC							; 
				incf	peAsh,f					; 
				decf	FSR,f					; 
				movfw	INDF					; 
				addwf	peAsh,f					; 
				decfsz	Chokr,f					; 				
				goto	zag1					; 
				
				CLRC							; (Uadc+Uadc+Uadc+Uadc)/2
				rrf		peAsh,f					; =Uadc*2
				rrf		peAsl,f					; 

				
				; умножаем полученное значение на Uadc*2*kalibr

				clrf	peAsuh					; 
				clrf	peAsu					; 
				banksel peAsh					; 
				movfw	peAsh					; 			
				banksel	BARGB0					; 
				movwf	BARGB0					; 
				banksel	peAsl					; 
				movfw	peAsl					; 			
				banksel	BARGB1					; 
				movwf	BARGB1					; 			
				

				banksel	AARGB0					;
				clrf	AARGB0					; 
				banksel	kalibr_hi				;
				movf	kalibr_hi,w				;
				banksel	AARGB1					;
				movwf	AARGB1					;
				banksel	kalibr_lo				;
				movf	kalibr_lo,w				;
				banksel	AARGB2					;
				movwf	AARGB2					;

				
				banksel AARGB0					;
				PAGESEL	FXM2416U				;
				call	FXM2416U				; умножить
			;	PAGESEL
				
				banksel AARGB1					;
				movfw	AARGB1					; перегружаем полученное значение в регистр А			
				banksel	peAsuh					;
				movwf	peAsuh					; 
				
				banksel	AARGB2					;
				movfw	AARGB2					; 			
				banksel	peAsu					;
				movwf	peAsu					; 
				
				banksel	AARGB3					;
				movfw	AARGB3					; 			
				banksel	peAsh					;
				movwf	peAsh					; 
				
				banksel	AARGB4					;
				movfw	AARGB4					; 			
				banksel	peAsl					;
				movwf	peAsl					; 


			;	movlw	0x00					;
				clrf	peBsu					; 
			;	movlw	0x00					;
				clrf	peBsh					;
				movlw	0x40					;
				movwf	peBsl					;


				PAGESEL FXD3224U				;
				call	FXD3224U				;
				PAGESEL sranfgh					;
sranfgh

				banksel	peAsh					;
				movfw	peAsh					; 			
				banksel	tu5adc_64h				;
				movwf	tu5adc_64h				; 				
				banksel	peAsl					;
				movfw	peAsl					; 			
				banksel	tu5adc_64l				;
				movwf	tu5adc_64l				; 

			
				banksel AARGB1					;
				movfw	AARGB1					; перегружаем полученное значение в регистр А			
				banksel	peAsuh					;
				movwf	peAsuh					; 
				
				banksel	AARGB2					;
				movfw	AARGB2					; 			
				banksel	peAsu					;
				movwf	peAsu					; 
				
				banksel	AARGB3					;
				movfw	AARGB3					; 			
				banksel	peAsh					;
				movwf	peAsh					; 
				
				banksel	AARGB4					;	
				movfw	AARGB4					; 			
				banksel	peAsl					;
				movwf	peAsl					; 


			;	movlw	0x00					;
				clrf	peBsu					; 
			;	movlw	0x00					;
				clrf	peBsh					;
				movlw	0x80					;
				movwf	peBsl					;


				PAGESEL FXD3224U				;
				call	FXD3224U
				PAGESEL sranfgh

				banksel	peAsh
				movfw	peAsh					; 			
				banksel	tu5adc_128h
				movwf	tu5adc_128h				; 				
				banksel	peAsl
				movfw	peAsl					; 			
				banksel	tu5adc_128l
				movwf	tu5adc_128l				; 			

				
				banksel	AARGB4
				movfw	tu5adc_64l				; 			
				subwf	AARGB4,f
				btfsc	STATUS,C
			goto	sub3
				movlw	.1
				subwf	AARGB3,f				
				btfsc	STATUS,C
			goto	sub3
				movlw	.1
				subwf	AARGB2,f
				btfss	STATUS,C
				decf	AARGB1,f
sub3
				movfw	tu5adc_64h				; 			
				subwf	AARGB3,f				
				btfsc	STATUS,C
			goto	sub4
				movlw	.1
				subwf	AARGB2,f
				btfss	STATUS,C
				decf	AARGB1,f
sub4
				movfw	tu5adc_128l				; 			
				subwf	AARGB4,f
				btfsc	STATUS,C
			goto	sub5
				movlw	.1
				subwf	AARGB3,f				
				btfsc	STATUS,C
			goto	sub5
				movlw	.1
				subwf	AARGB2,f
				btfss	STATUS,C
				decf	AARGB1,f
sub5
				movfw	tu5adc_128h				; 			
				subwf	AARGB3,f				
				btfsc	STATUS,C
			goto	sub6
				movlw	.1
				subwf	AARGB2,f
				btfss	STATUS,C
				decf	AARGB1,f
sub6


				banksel AARGB1					;
				movfw	AARGB1					; перегружаем полученное значение в регистр А			
				banksel	peAsuh					;
				movwf	peAsuh					; 
				
				banksel	AARGB2					;
				movfw	AARGB2					; 			
				banksel	peAsu					;
				movwf	peAsu					; 
				
				banksel	AARGB3					;	
				movfw	AARGB3					; 			
				banksel	peAsh					;
				movwf	peAsh					; 
				
				banksel	AARGB4					;
				movfw	AARGB4					; 			
				banksel	peAsl					;
				movwf	peAsl					; 

			;	movlw	0x00					;
				clrf	peBsu					; 
				movlw	0x27					;
				movwf	peBsh					;
				movlw	0x10					;
				movwf	peBsl					;


				PAGESEL FXD3224U				;
				call	FXD3224U				;
				PAGESEL sranfgh					;

				movfw	peAsh					; 			
				movwf	U_izm_hi				; 				
				movfw	peAsl					; 			
				movwf	U_izm_lo				;

	return	
;********************************************************************************************************

;*************************************************************************************************
				FILL(goto 0x00),0x800-$   ; заполнить все оставшееся место кодом



;============================================================================================
; страница 2
;********************************************************************************************
				FILL(goto 0x00),0x800-$   ; заполнить все оставшееся место кодом
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;============================================================================================;============================================================================================
			ORG     0x800			; страница 1
			bcf		STATUS,RP0		; выбор банка 0
			bcf		STATUS,RP1		; 
			PAGESEL	main			; аварийный перезапуск
			goto	main			; 
;============================================================================================
;**********************************************************************************************
        
;       24x16 Bit Unsigned Fixed Point Multiply 24x16 -> 40

;       Input:  24 bit unsigned fixed point multiplicand in AARGB0
;               16 bit unsigned fixed point multiplier in BARGB0

;       Use:    CALL    FXM2416U

;       Output: 40 bit unsigned fixed point product in AARGB0

FXM2416U
                CLRF    AARGB3          ; clear partial product
                CLRF    AARGB4
                MOVF    AARGB0,W
                MOVWF   TEMPB0
                MOVF    AARGB1,W
                MOVWF   TEMPB1
                MOVF    AARGB2,W
                MOVWF   TEMPB2


                MOVLW   0x08
                MOVWF   LOOPCOUNT

LOOPUM2416A
                RRF     BARGB1, F
                BTFSC   STATUS,C
                GOTO    ALUM2416NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM2416A

                MOVWF   LOOPCOUNT

LOOPUM2416B
                RRF     BARGB0, F
                BTFSC   STATUS,C
                GOTO    BLUM2416NAP
                DECFSZ  LOOPCOUNT, F
                GOTO    LOOPUM2416B

                CLRF    AARGB0
                CLRF    AARGB1
                CLRF    AARGB2
                RETLW   0x00

BLUM2416NAP
                BCF     STATUS,C
                GOTO    BLUM2416NA

ALUM2416NAP
                BCF     STATUS,C
                GOTO    ALUM2416NA

ALOOPUM2416
                RRF     BARGB1, F
                BTFSS   STATUS,C
                GOTO    ALUM2416NA
                MOVF    TEMPB2,W
                ADDWF   AARGB2, F
                MOVF    TEMPB1,W
                BTFSC   STATUS,C
                INCFSZ  TEMPB1,W
                ADDWF   AARGB1, F
                MOVF    TEMPB0,W
                BTFSC   STATUS,C
                INCFSZ  TEMPB0,W
                ADDWF   AARGB0, F

ALUM2416NA
                RRF     AARGB0, F
                RRF     AARGB1, F
                RRF     AARGB2, F
                RRF     AARGB3, F
                DECFSZ  LOOPCOUNT, F
                GOTO    ALOOPUM2416

                MOVLW   0x08
                MOVWF   LOOPCOUNT

BLOOPUM2416
                RRF     BARGB0, F
                BTFSS   STATUS,C
                GOTO    BLUM2416NA
                MOVF    TEMPB2,W
                ADDWF   AARGB2, F
                MOVF    TEMPB1,W
                BTFSC   STATUS,C
                INCFSZ  TEMPB1,W
                ADDWF   AARGB1, F
                MOVF    TEMPB0,W
                BTFSC   STATUS,C
                INCFSZ  TEMPB0,W
                ADDWF   AARGB0, F

BLUM2416NA
                RRF     AARGB0, F
                RRF     AARGB1, F
                RRF     AARGB2, F
                RRF     AARGB3, F
                RRF     AARGB4, F
                DECFSZ  LOOPCOUNT, F
                GOTO    BLOOPUM2416


                RETLW   0x00

;**********************************************************************************************
;**********************************************************************************************
        
;       32/24 Bit Unsigned Fixed Point Divide 32/24 -> 32.24

;       Input:  32 bit unsigned fixed point dividend in peAsuh, peAsu,peAsh,peAsl
;               24 bit unsigned fixed point divisor in peBsu, peBsh, peBsl

;       Use:    CALL    FXD3224U

;       Output: 32 bit unsigned fixed point quotient in peAsuh, peAsu,peAsh,peAsl
;               24 bit unsigned fixed point remainder in peCsu, peCsh, peCsl

;       Result: AARG, REM  <--  AARG / BARG


FXD3224U        CLRF            peCsu
                CLRF            peCsh
                CLRF            peCsl

                CLRF            temp

                RLF             peAsuh,W
                RLF             peCsl,F
                MOVF            peBsl,W
                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F

                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                RLF             peAsuh,F

                MOVLW           7
                MOVWF           regsr

LOOPU3224A      RLF             peAsuh,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsuh,0
                GOTO            UADD24LA

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24LA

UADD24LA        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24LA         RLF             peAsuh,F

                DECFSZ          regsr,F
                GOTO            LOOPU3224A

                RLF             peAsu,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsuh,0
                GOTO            UADD24L8

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24L8

UADD24L8        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24L8         RLF             peAsu,F

                MOVLW           7
                MOVWF           regsr

LOOPU3224B      RLF             peAsu,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsu,0
                GOTO            UADD24LB

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24LB

UADD24LB        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24LB         RLF             peAsu,F

                DECFSZ          regsr,F
                GOTO            LOOPU3224B

                RLF             peAsh,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsu,0
                GOTO            UADD24L16

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24L16

UADD24L16       ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24L16        RLF             peAsh,F

                MOVLW           7
                MOVWF           regsr

LOOPU3224C      RLF             peAsh,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsh,0
                GOTO            UADD24LC

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24LC

UADD24LC        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24LC         RLF             peAsh,F

                DECFSZ          regsr,F
                GOTO            LOOPU3224C

                RLF             peAsl,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsh,0
                GOTO            UADD24L24

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24L24

UADD24L24       ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24L24        RLF             peAsl,F

                MOVLW           7
                MOVWF           regsr

LOOPU3224D      RLF             peAsl,W
                RLF             peCsl,F
                RLF             peCsh,F
                RLF             peCsu,F
                RLF             temp,F
                MOVF            peBsl,W
                BTFSS           peAsl,0
                GOTO            UADD24LD

                SUBWF           peCsl,F
                MOVF            peBsh,W
                BTFSS           STATUS,C
                INCFSZ          peBsh,W
                SUBWF           peCsh,F
                MOVF            peBsu,W
                BTFSS           STATUS,C
                INCFSZ          peBsu,W
                SUBWF           peCsu,F
                CLRW
                BTFSS           STATUS,C
                MOVLW           1
                SUBWF           temp,F
                GOTO            UOK24LD

UADD24LD        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
                CLRW
                BTFSC           STATUS,C
                MOVLW           1
                ADDWF           temp,F
        
UOK24LD         RLF             peAsl,F

                DECFSZ          regsr,F
                GOTO            LOOPU3224D

                BTFSC           peAsl,0
                GOTO            UOK24L
                MOVF            peBsl,W
	        ADDWF           peCsl,F
                MOVF            peBsh,W
                BTFSC           STATUS,C
                INCFSZ          peBsh,W
                ADDWF           peCsh,F
                MOVF            peBsu,W
                BTFSC           STATUS,C
                INCFSZ          peBsu,W
                ADDWF           peCsu,F
UOK24L

                RETLW           0x00

;**********************************************************************************************

;============================================================================================
;********************************************************************************************
				FILL(goto 0x00),0xFFF-$   ; заполнить все оставшееся место кодом



;============================================================================================











; initialize eeprom locations
;============================================================================================										
;++++++++++++++++++++++++++Данные для записи в EEPROM +++++++++++++++++++++++++++++++++++++++
			ORG		0x2100						; 							

			DE		.00,.00 					;flag_0									;* флаги состояния работы контроллера
			DE		0x00,0x00,0xf0,0xf0			;Up_alr_hi,Up_alr_lo	50.0v			;* Верхний аварийный уровень
			DE		0x00,0x00,0x0a,0x0a			;Dn_alr_hi,Dn_alr_lo	1.0v			;* Нижний аварийный уровень
			DE		0x0a,0x0a					;Vr_zak_lo				60 sek			;* Время задежки автоконтроля параметров среды с момента включения или смены параметра
			DE		0x0a,0x0a					;Vr_pov_lo				0 sek			;* Время задержки аварии
			DE		0x14,0x14,0xbe,0xbe;kalibr_hi,kalibr_lo					;* Бит калибровки
			DE		.0,.0						;end_stek								;*
;============================================================================================

	END                       ; directive 'end of program'

;=======================================================================================================
