;****************************************************************************************************************************************
;                                                                     																			*
;    Filename:	    xxx.asm                                           																			*
;    Date:                                                           																			*
;    File Version:                                                    																			*
;                                                                     																			*
;    Author:                                                          																			*
;    Company:                                                         																			*
;                                                                     																			*
;                                                                     																			*
;****************************************************************************************************************************************
;                                                                      																			*
;    Files required:                                                   																			*
;                                                                      																			*
;                     ИТОГ                                             																			*
;                                                                      																			*
;****************************************************************************************************************************************
;                                                                     																			*
;    Notes:            регулятор температуры аналог 2480 только с показанием 0,1 грд                                                			*                      режим холодильника                              																			*
;                        холодильник                                              																			*
;                                                                      																			*
;                                                                      																			*
;****************************************************************************************************************************************

	list     	 p=16f628A          ; list directive to define processor
	#include 	<p16F628A.inc>      ; processor specific variable definitions

	errorlevel  -302              															; suppress message 302 from list file

	__CONFIG   _CP_ON & _DATA_CP_ON & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
	cblock	0x020

ind_1						; переменная первого индикатора старший разряд
ind_2						; перемннная второго индикатора младший разряд
ind_3						; перемннная третьего индикатора десятичный разряд

buf_ind_1					; буфер переменной 1 знакоместа
buf_ind_2					; буфер переменной 2 знакоместа
buf_ind_3					; 

perem1						; переменная для тестирования системы при включении
perem2						; переменная для тестирования системы при включении
perem3						; 
perem4						; 
perem5						; 

adr_e						; переменные для работы с EEPROM
data_e						; 

per_zad
zaderj1						; внутренняя перменная цикла задержка
zaderj2						; внутренняя перменная цикла задержка

flag_1						; 
flag_2						; 
flag_3						; 
flag_4						; 
flag_5						; 

T_izm_hi					; переменные температуры после цикла измерения датчика 1
T_izm_lo					; переменные температуры после цикла измерения 


schet_sim1					; счетчик цикла вывода
schet_sim2					; счетчик выбора символа

cher300_10
cher02
cher05
chet_10						; счетчик делитель длительности до 1 Гц
cher60m						; счетчик делитель длительности до 1 мин

;========================================
flag_0						;* 
T_zad_hi,T_zad_lo			;* температура задания

Gis_lo						;* гистерезис задания

T_dop						;* гистерезис допустимого колебания температуры (10)
V_avk						;* время включения автоконтроля (30)

end_stek					;*
;========================================
uskor                       ;
flag_i1
flag_i2
reg_ind						; регистр индикации выбора знакоместа
b_zad_ind
;========================================
; регистры программы десятичного преобразования
; программа преобразования 24 бита двоичного в 4/8 байта двоично-десятичного
; B24 = 1 - бит преобразования 24 бита, (B24 = 0) по умолчанию 16 бит.  
; входные двоичное число 16 или 24 бита
binu									; 17-24 бит
binh									; 9-16 бит
binl									; 0-8 бит
;буфер
bu_binu									; 17-24 бит
bu_binh									; 9-16 бит
bu_binl									; 0-8 бит
; выходные
edin									; единицы
dest									; десятки
sotn									; сотни
tysc									; тысячи
dtys									; дестки тысяч
stys									; сотни тысяц
mlon									; милионы
;========================================
						; переменные программы сравнения
peAsu									; число_А
peAsh									; 
peAsl									; 
peBsu									; число_Б
peBsh									; 
peBsl									; 
regsr									; 
flag_srv								; 
;========================================
avtovyh						; переменная автовыхода из режима настройки

td_kon						; таймер задержки контроля Т dop

COM_REG
TEMP_HI
TEMP_LO
TEMP0
TEMP1
t_binl
t_binh
t_binu
vr_konvert			; формирования времени конвертирования
chtteep
	endc

	cblock	0x07E	
w_temp           			; variable used for context saving 
status_temp        	 		; variable used for context saving
	endc
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;***********************************************************************************************

#define		SOT		PORTA,0			; управляющий бит первого знакоместа
#define		DES		PORTA,1			; управляющий бит второго знакоместа
#define		EDI		PORTA,2			; управляющий бит третьего знакоместа

;#define		BEEP	PORTA,3			; бит ПИЩАЛКИ
#define		RELE1	PORTA,6			; линия реле 
#define		RELE2	PORTA,7			; линия реле 

#define		KLAV_F	PORTB,2			; клавиша функция
#define		KLAV_U	PORTB,1			; клавиша больше
#define		KLAV_D	PORTB,3			; клавиша меньше

#define		CLS		4				; ЧАСТОТА генератора
#define		GOR		(CLS*.1000000/.160000)	; длительность свечения знакоместа
#define		ZADG	                  (CLS*.1000000/.110000)	; длительность свечения знакоместа в бегущей строку
#define		DIND	.7				; длительность находжения в режиме настройки (автовыход через - .7 секунд)

#define		TOCHKA1		flag_i1,0		; бит индикации десятичной точки
#define		TOCHKA2		flag_i1,1		; 
#define		TOCHKA3		flag_i1,2		; 
#define		TOCHm1		flag_i1,4		; бит мигания десятичной точки
#define		TOCHm2		flag_i1,5		; 1 - мигает с частотой 2 гц.
#define		TOCHm3		flag_i1,6		; 0 - горит постоянно
#define		RAZR1		flag_i2,0		; бит мигания разряда индикатора
#define		RAZR2		flag_i2,1		; 0 - горит постоянно
#define		RAZR3		flag_i2,2		; 1 - мигает с частотой 2 гц.

;*************


#define		B_MIG	flag_1,2		; бит мигания (1 потушен, 0 горит)
#define		E_data	flag_1,3		; флаг ошибки данных
#define		oh_te	flag_1,4		; бит ошибки температуры
#define		SR		flag_1,5		; бит сравнения
#define		ERROR_D	flag_1,6		; бит аварийной ситуации "нет датчика температуры"
									; 0- есть датчик, 1- нет датчика
#define		MINUS	flag_1,7		; бит измерения отрицательных температур

#define		ON_OFF	flag_0,0		; бит регулятор 1-включен 0-выключен	

;#define		TP		flag_4,0		; бит измерения температуры
#define		IT		flag_4,1		; бит ндикации работы нагревателя
#define		UST		flag_4,2		; бит режима настройки регулятора
#define		kl_no	flag_4,3		; бит удержания клавиши
#define		vp_rp	flag_4,4		; бит режима 0-выбор параметра, 1-коррекуция параметра,
#define		RAKTD	flag_4,5		; бит разрешения режима автоконтроля параметров рег. среды

#define		RSF		flag_4,6		; бит формирования импульса Reset Далласа
#define		CT		flag_4,7		; бит цикла измерения/чтение температуры

#define		ONF		flag_2,0		; бит регулятор 1-включен 0-выключен
#define		TUM		flag_2,1		; бит настройки температуры задания
#define		UGZ		flag_2,2		; бит гистерезиса
#define		TDO		flag_2,3		; бит НАСТРОЙКИ температуры автоконтроля отклонения от задания 
#define		VAK		flag_2,4		; бит настройки времени включения режима автоконтроля (10-60)
#define		IZG		flag_2,5		; данные о изготовителе

#define		B24		flag_5,0	; 
#define		BTE		flag_5,1	;
#define		MINUS_d	flag_5,2		; бит измерения отрицательных температур

#define		KL_F	flag_3,0		; бит функции кнопки
#define		KL_U	flag_3,1		; бит направления сдвига
#define		KL_D	flag_3,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		TRISDAL		TRISA		; регистр управления порта ДАЛЛАСА
#define		PORTDAL		PORTA		; регистр данных порта ДАЛЛАСА

#define		LINE		3			; линия порта ДАЛЛАСА1
#define		DALLAS		PORTA,3		; шина связи с ДАЛЛАСОМ1

#define		T_ZAV		.250				; заводская установка
#define		Tmax_hi		0x04		; 125 максимальная температура установки
#define		Tmax_lo		0xe2		; 
#define		Tmin_hi		0xfd
#define		Tmin_lo		0xda		; -40 минимальная температура установки

#define		G_ZAV	.10				; заводская установка
#define		G_MAX	.250			; 25 максимальное значение
#define		G_MIN	.0				; 0 минимальное значение

#define		D_ZAV	.0				; заводская установка (делта допуска отклонения температура)
#define		D_MAX	.250			; 25 максимальное значение
#define		D_MIN	.0				; 0 минимальное значение - 0 режим отключен

#define		K_ZAV	.10				; заводская установка (время задежки автоконтроля)
#define		K_MAX	.120			; 100 максимальное значение
#define		K_MIN	.1				; 10 минимальное значение 


											
;++++++++++++++++++++++++++Данные для записи в EEPROM +++++++++++++++++++++++++++++++++++++++
			ORG		0x2100
			DE		.0,.0 			; flaf_0
			DE		0x1,0x1,0x2c,0x2c			; T_zad		- 30.0
			DE		.10,.10			; Gis_lo		- 1
			DE		.0,.0			; T_dop		- 10
			DE		.30,.30			; V_avk		- 30	

;**********************************************************************
			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

			clrf	STATUS			; выбор банка 0
;===============================================
			bcf		PIR1,CCP1IF		; сбросить флаг прерывания от модуля ССР1
;============== период 	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 Гц		

;===============================================
;============== формирование импульса задежки для работы с датчиком температуры
			btfss	RSF				; проверить в настоящий момент импульс сброса формируется
			goto	ch_v			; нет
			decfsz	vr_konvert,f	; Да
			goto	ch_v			;
			bcf		RSF				; если достигнут ноль, сбросить бит формирования длительности
ch_v
;========================================================================== 
			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			;
;============== 

;========================================================================== 			
			decfsz	cher02,f		; счетчик делитель длительности до 1 Гц 
			goto	end_pr			; 
			movlw	.2				; если достигнут ноль востановить счетчик
			movwf	cher02			; период 1 Гц
;==========================================================================
;============== период 	1 Гц start	;				
			
			call	celsio
			
			;==============			;
			btfss	RELE1			; цикл индикации работы устройства (1 - реле включено)
			goto	we_er			; 
			btfss	IT				;
			goto	$+3				;
			bcf		IT				;
			goto	$+2				;
			bsf		IT				;
			;==============			;
we_er
			;==============			;
			movf	avtovyh,f		; отсчет времени 
			SKPNZ					;
			goto	chet_1mi_m		;
			decfsz	avtovyh,f		;
			goto 	chet_1mi_m		;
		;	bcf		BEEP			; включить "бипер"
			call	zap_eeprom		; записать в память заводские установки

			bcf		UST				; бит режима настройки регулятора
			clrf	flag_2			; очистить флаг выбора параметра			
			bcf		vp_rp			; бит режима 0-выбор параметра		
			movfw	V_avk			; перегрузить время автоконтроля
			movwf	td_kon			;
			bcf		RAKTD			; заблокировать работу автоконтроля
			bcf		KL_U			; настройка битов направлений
			bsf		KL_D			;
			;==============			;
;===============================================				
chet_1mi_m	

;==========================================================================
;============== период 	1 Гц end
			decfsz	cher60m,f			; счетчик делитель длительности до 1 мин
			goto	end_pr				; 
			movlw	.60					; если достигнут ноль востановить счетчик
			movwf	cher60m				; период 1 мин
;==========================================================================
;============== start период 	1 мин	;

			;==============			;
			movf	td_kon,f		; отсчет времени задержки включения автоконтроля
			SKPNZ					;
			goto	$+3				; 
			decfsz	td_kon,f		;******************
			goto 	$+2				; 
			bsf		RAKTD			; работа автоконтроля разрешена
			;==============			;

end_pr
			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'10000001'		; 0-0
			retlw	b'11110011'		; 1-1
			retlw	b'01001001'		; 2-2
			retlw	b'01100001'		; 3-3
			retlw	b'00110011'		; 4-4
			retlw	b'00100101'		; 5-5
			retlw	b'00000101'		; 6-6
			retlw	b'11110001'		; 7-7
			retlw	b'00000001'		; 8-8
			retlw	b'00100001'		; 9-9
			retlw	b'11111111'		; 10-"пусто"
			retlw	b'01111111'		; 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 в подпрограмме
			retlw	b'10001101'		; "C"
			retlw	b'00010001'		; "A"
			retlw	b'01111111'		; "-"
			retlw	b'01001001'	                 ; 2-2
			retlw	b'00110011'		; 4-4
			retlw          b'01111111'		; "-"
                                                      retlw	b'01010111'		; "n"
			retlw	b'11110111'		; "i"
			retlw	b'01001111'		; "c"
                                                      retlw	b'01000111'		; "o"
			retlw          b'01111111'		; "-"	
					;	.12 ошибки датчика
			retlw	.12				; количество команд - retlw в подпрограмме
			retlw	b'00001101'		; "E"
			retlw	b'01011111'		; "r"
			retlw	b'01011111'		; "r"
			retlw	b'01000111'		; "o"
			retlw	b'01011111'		; "r"
			retlw	b'11111111'		; " "
			retlw   	b'01001111'		; "c"
			retlw   	b'11110111'		; "i"				
			retlw	b'01000011'		; "d"
			retlw	b'10111111'		; "l"
			retlw	b'01000111'		; "o"
					;	.24 телефон изготовителя
			retlw	.16				; количество команд - retlw в подпрограмме
			retlw	b'01111111'      		; "-"
			retlw	b'01111111'      		; "-"
			retlw	b'11110001'		; 7-7
			retlw	b'01001001'		; 2-2
			retlw	b'00000001'		; 8-8
			retlw	b'01111111' 		; "-"
			retlw	b'00100001'		; 9-9
			retlw	b'00110011'		; 4-4				
			retlw	b'00000001'		; 8-8
			retlw	b'01111111' 		; "-"
			retlw	b'11110001'		; 7-7
			retlw	b'00000101'		; 6-6					
			retlw	b'00000101'		; 6-6
			retlw	b'01111111'		; "-"					
			retlw	b'01111111'		; "-"				
					;	.40 авария данных
			retlw	.10				; количество команд - retlw в подпрограмме
			retlw	b'00010001'        		; "A"
			retlw	b'10001111'       		; "L"
			retlw	b'00010001'		; "A"
			retlw	b'01011110' 		; "r."
			retlw	b'11111111' 		; " "
			retlw	b'01000011'		; "d"
			retlw	b'00010001'  		; "A"
			retlw          b'00001111'        		; "t"				
			retlw	b'00010001'		; "A"
					;	.50 регулятор отключен
			retlw	.4				; количество команд - retlw в подпрограмме
			retlw	b'01000111'        		; "o"
			retlw	b'00011101'        		; "F"
			retlw	b'00011101'        		; "F"
					;	.54 регулятор включен
			retlw	.3				; количество команд - retlw в подпрограмме
			retlw	b'01000111' 		; "o"
			retlw	b'01010111'		; "n"
					;	.57 холодно
			retlw	.5				; количество команд - retlw в подпрограмме
			retlw	b'10001101'        		; "C"
			retlw	b'01000111' 		; "o"
			retlw	b'10111111'		; "l"
			retlw	b'01000011'		; "d"
					;	.62 горячо
			retlw	.6				; количество команд - retlw в подпрограмме
			retlw	b'00010011'        		; "H"
			retlw	b'01000111'		; "o"
			retlw	b'00001111' 		; "t"
			retlw	b'10111111'		; "l"
			retlw	b'11000011' 		; "y"
					;	.68 уст
			retlw	.4				; количество символов +1
			retlw	b'00100101'   		; "S"
			retlw	b'00001101' 		; "E"
			retlw	b'00001111' 		; "t"
					;	.72 tuc
			retlw	.4				; symbol teplota +1
			retlw	b'00001111'		; "t"
			retlw	b'00001101' 		; "E"
			retlw	b'00011001'		; "p"
					;	.76 qic
			retlw	.4				;symbol hystereze+1
			retlw	b'00010011'        		; "H"
			retlw	b'11000011' 		; Y
			retlw	b'00100101'   		; "S"
					;	.80 dot
			retlw	.4				; symbol havarijnн teplota +1
			retlw	b'00010011'  		; "H"
			retlw	b'00001111'		; "t"
			retlw	b'00001101' 		; "E"
					;	.84 Uut
			retlw	.4				; symbol иas nбbмhu v min. +1
			retlw	b'10001101'		; "C"
			retlw	b'00010001'        		; "A"
			retlw	b'00100101' 		; "5"
					;	.88 Tel
			retlw	.4				;инslo telefonu+1
			retlw	b'00001111' 		; "t"
			retlw	b'00001101' 		; "E"
			retlw	b'10001111'		; "L"
					;	.92 Вкл/Выкл
			retlw	.4				; symbol regulace +1
			retlw	b'01011111' 		; "r"
			retlw	b'00001101' 		; "E"
			retlw	b'00000101'		; "g"
					;	.96 нет выхода на режим
			retlw	.9				; количество команд - retlw в подпрограмме
			retlw	b'01010111'		; "n"
			retlw	b'01000111'		; "o"
			retlw	b'11111111'		; " "
			retlw	b'01010111'		; "m"
			retlw	b'01010111'		; "m"
			retlw	b'01000111'		; "o"
			retlw	b'01000011'		; "d"
			retlw	b'00001101' 		; "E"
;============================================================================================
;============================================================================================
;============================================================================================
; очистка памяти данных
main		movlw	0x5				; 
			movwf	FSR				; 
ClfMem		clrf	INDF			; 
			incf	FSR,f			; 
			movlw	0x7B			;
			subwf	FSR,w			;
			BNZ 	ClfMem			;
;============================================================================================
;инициализация процессора
			clrwdt					; сброс сторожевого таймера++++++
			movlw	0x07			; 0x07 код
			movwf	CMCON			; отключить компараторы
			BANKSEL OPTION_REG		; выбрать банк регистра OPTION_REG
			movlw	b'00001111'		; загрузить константу (включить подтяг. резисторы, предделитель на WDT, коэф. 1:128)
			movwf	OPTION_REG		; 
			clrf	TRISB			; настройка порта В все на выход
			movlw	b'00010000'		; настройка порта A RA4, RA3 на вход, остальные на выход
			movwf	TRISA			; 
			BANKSEL PORTA			; выбрать банк портов
			clrf	PORTA			; очистить порты
			clrf	PORTB			; 
		;	bsf		BEEP			; выключить пищалку

		; настройка таймера	TMP1	; 
			BANKSEL T1CON			; выбрать банк 0
			movlw	b'00110001'		; таймер включен, предделитель 4 мг = 1:8 - 125 000 гц
			movwf	T1CON			;
		; настройка модуля CCP1		; 
			movlw	b'00001011'		; 
			movwf	CCP1CON			; бит CCP1IF в регистре PIR1
			movlw	0x01			; константа для регистров ставнения ст. байт  (выход 10 гц)
			movwf	CCPR1H			; справка (16m-195/80,20m-224/36   -10гц
			movlw	0xa0			; константа для регистров ставнения мл. байт
			movwf	CCPR1L			; 4 M - 01/a0 - 300 gc
;============================================================================================
;============================================================================================
			call	vost_data		; востановление настроек после включения питания
;============================================================================================
		; инициализация переменных
			movlw	.120			; 
			movwf	uskor			; 
			
			movlw	.2				; счетчик 10 гц выход 1 секунда
			movwf	cher300_10		; 
			movwf	cher02			; 
			movwf	cher05			; 
			movwf	chet_10			; счетчик делитель длительности до 1 Гц
			movwf	cher60m			; счетчик делитель длительности до 1 мин
			
			bcf		KL_U			; настройка битов клавиш направлений
			bsf		KL_D			;
			movfw	V_avk			; время задежки автоконтроля при включении питания
			movwf	td_kon			; 
			bcf		RAKTD			; заблокировать работу автоконтроля
;============================================================================================
		; настройка прерываний
			movlw	b'11000000'		;
			movwf	INTCON			; разрешить прерывания от переферийных устройств
			BANKSEL	PIE1			; 
			bsf		PIE1,CCP1IE		; разрешить прерывния от CCP1
			bcf		STATUS,RP0		; выбор банка 0
			bcf		STATUS,RP1		; 
;			bsf		TP				; разрешить измерение температуры
;============================================================================================
			BANKSEL	TRISB			; Аварийный вход в систему
			movlw	b'00001110'		; и настроить порты кнопок на ввод
			movwf	TRISB			; 			
			BANKSEL	PORTB			; 

			btfss	KLAV_D			; вход через рестарт регулятора 
		goto	vos_data			; 

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
;============================================================================================
;============================================================================================
		; операции индикации состояния и температуры задания регулятора
			movlw	.0				; 
			call	big_str			; бегущая строка CG-8010
			movlw	.68				; 
			call	big_str			; бегущая строка Уст
			call 	och_left		; очистка индикатора
			
			movfw	T_zad_hi		; сохранить в переменной текущей температуры
			movwf	binh			; и в переменной bin
			movfw	T_zad_lo		; сохранить в переменной текущей температуры
			movwf	binl			; и в переменной bin	
			bsf		BTE				; 
			call	bin_dec			; конвертировать двоичную bin в двоичнодесятичную
			call	conv_tb			; дешифрирование чисел  (буфер)
			call	zam_left		; 
			call	mig_u			; мигание дисплея
			btfsc	ON_OFF			; индикации состояния режима ON_OFF
			goto	$+4				; 
			movlw	.54				; 
			call	big_str			; бегущая строка регулятор отключен
			goto	$+3				; 
			movlw	.50				; 
			call	big_str			; бегущая строка регулятор включен
			call	mig_u			; мигание дисплея
			call 	och_left		; очистка индикатора
			movfw	T_izm_hi		; сохранить в переменной текущей температуры
			movwf	binh			; и в переменной bin
			movfw	T_izm_lo		; сохранить в переменной текущей температуры
			movwf	binl			; и в переменной bin	
			bsf		BTE				; 
			call	bin_dec			; конвертировать двоичную bin в двоичнодесятичную
			call	conv_tb			; дешифрирование чисел  (буфер)
			call	och_ring		; очиска индикатора в право			
			call	zam_ring		; подпрограмма вывода на индикатор буфера выезд -> (справо налево)
;============================================================================================
ind
			clrwdt					; сброс сторожевого таймера++++++
;			;==============			;		

			movfw	T_izm_hi			; сохранить в переменной текущей температуры
			movwf	binh				; и в переменной bin
			movfw	T_izm_lo			; сохранить в переменной текущей температуры
			movwf	binl				; и в переменной bin	
			bsf		BTE
			call	bin_dec			; конвертировать двоичную bin в двоичнодесятичную
			call	conv_t			; конвертирование температуры в знаки индикатора

			;==============			; индикация
			movlw	.120			;
			movwf	b_zad_ind		;
			call	ind_zad			;
			;==============			;
			btfss	ON_OFF			; индикации состояния режима ON_OFF
		goto	contr
			bcf		RELE1			; линия реле 
			bcf		RELE2			; линия реле 			
		goto	KLAV_alm			; пропустить управление если режим работы отключено	
			;==============			;
contr			call	kondosdata 		; контроль достоверности данных	 
			;==============			;
			call	con_sre			; контроль поведения параметра регулируемой среды
									; выход за допуспимые пределы и времени входа в заданные параметры
			;==============			;								
			btfsc	ERROR_D			; пропустить управление нагревателем если авария температуры
			goto	KLAV_alm		;							
			;==============			;			
			btfsc	oh_te			; пропустить управление нагревателем если авария температуры
			goto	KLAV_alm		;
			;==============			;	
			call	upravl			; управление испольнительным устройством (нагреватель/компрессор)
			;==============			;
KLAV_alm	call	klava			; 
;--------------------------------------------				
kontr		btfss	UST				; выбор режима работы
			goto	ind				; режим индикации и регулирования/режим установки
;--------------------------------------------
nast	
			btfsc	kl_no			; 
			goto	$+4				; 
			movlw	.120			; инициализация длительности свечения
			movwf	uskor			; 
			goto	$+5				; 
			decf	uskor,w			; проверка достижения переменной величины 1
			SKPNZ					; 
			goto	$+2				; 
			decf	uskor,f			; 
			movfw	uskor			;
			movwf	b_zad_ind		;			
			call	ind_zad			; 			
			call	klava			; 
			call	upravl			; 
			clrwdt					; сброс сторожевого таймера++++++
			goto	kontr			; 
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
;============================================================================================
kondosdata			; контроль достоверности данных
		;контроль велицины температуры задания
			movf	T_zad_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_zad_hi,w			;
			movwf	peAsh				;			
			movlw	Tmax_lo				;+ 100
			movwf	peBsl				; загрузка данных
			movlw	Tmax_hi				; 
			movwf	peBsh				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL					; если больше авария
			goto	vos_data			;

			movf	T_zad_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_zad_hi,w			;
			movwf	peAsh				;			
			movlw	Tmin_lo				;- 25.0
			movwf	peBsl				; загрузка данных
			movlw	Tmin_hi				; 
			movwf	peBsh				; загрузка данных
 			call    sravnenie			;
			btfsc	MEN					; если меньше авария
			goto	vos_data			;

		;контроль велицины гистерезиса только на превышение величины
			movf	Gis_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			clrf	peAsh				;			
			movlw	G_MAX				;+ 25,0
			movwf	peBsl				; загрузка данных
			clrf	peBsh				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL					; если больше авария
			goto	vos_data			;

		;контроль велицины T_dop
			movf	T_dop,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			clrf	peAsh				;			
			movlw	D_MAX				;+ 25,0
			movwf	peBsl				; загрузка данных
			clrf	peBsh				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL					; если больше авария
			goto	vos_data			;

		;контроль велицины V_avk
			movf	V_avk,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			clrf	peAsh				;			
			movlw	K_MAX				;+ 25,0
			movwf	peBsl				; загрузка данных
			clrf	peBsh				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL					; если больше авария
			goto	vos_data			;
	return	

vos_data	
			; инциализация данных в результате сбоя и сохранения в EEPROM
			
			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 

			movlw	b'00001001'			; 			
			movwf	flag_0				; 
			
			clrf	T_zad_hi			;*температура задания
			movlw	T_ZAV				;
			movwf	T_zad_lo			;*

			movlw	G_ZAV				; 10.0	
			movwf	Gis_lo				;

			movlw	D_ZAV				;*время задежки автоконтроля отклонения температуры в часах
			movwf	T_dop				; 

			movlw	K_ZAV				;*величина гистерезиса для управления ветилятором
			movwf	V_avk				; 
			
			call	zap_eeprom			; записать в память заводские установки 
alr_d
			
			bcf		RELE1			; линия реле 
			bsf		RELE2			; линия реле 		
			bsf		TOCHKA3			; выключить точку 3
			bsf		TOCHKA2			; выключить точку 3
			bsf		TOCHKA1			; выключить точку 3			
			
			movlw	.40				; 
			call	big_str			;бегущая строка авария данных

			goto	alr_d
;============================================================================================
;============================================================================================
upravl									;программа управления работой контроллера
;============================================================================================
;============================================================================================
;======================================= режим регулирования
			clrf	peBsh				; 
			movf	T_izm_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_izm_hi,w			;
			movwf	peAsh				;			
			movf	Gis_lo,w			; добавить значение гистерезиса к температуре установки
			addwf	T_zad_lo,w			;
			movwf	peBsl				; загрузка данных
			btfsc	STATUS,C			; 
			incf	peBsh,f				; 
			movf	T_zad_hi,w			;
			addwf	peBsh,f				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL_RAV				; измерение  больше задания включить вентилятор
			goto	off_re				;
				
			clrf	peBsh				; 
			movf	T_izm_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_izm_hi,w			;
			movwf	peAsh				;			
			movf	T_zad_hi,w			;
			movwf	peBsh				; загрузка данных			
			movf	Gis_lo,w			; добавить значение гистерезиса к температуре установки
			subwf	T_zad_lo,w			;
			movwf	peBsl				; загрузка данных
			btfss	STATUS,C			; 
			decf	peBsh,f				; 
 			call    sravnenie			;
			btfss	MEN_RAV				; измерение  больше задания включить вентилятор
		goto		end_regre			;
			bcf		RELE1				; выключить
		goto		end_regre			;
off_re		bsf		RELE1				; включить
end_regre							; 
	return								; 
;============================================================================================
con_sre		; контроль поведения параметра регулируемой среды
			; выход за допуспимые пределы и времени входа в заданные параметры

			btfss	RAKTD			; проверить разрешение на проведение контроля
	return							; нет - выход
			movf	T_dop,f			; если T_dop = нулю фунция отключена
			SKPNZ	
	return							; функция деактивирована

			movfw	T_izm_hi			; сравнение данных на превышение максим	
			movwf	peAsh				; измеряемая температура не должна превышать T_zad + Gis_lo + T_dop
			movfw	T_izm_lo			; 
			movwf	peAsl				;
			movf	T_zad_hi,w			;
			movwf	peBsh				;
			movf	T_zad_lo,w			;
			movwf	peBsl				;
			movfw	Gis_lo				; +Gis_lo
			addwf	peBsl,f				;
			BNC		$+2					;			
			incf	peBsh,f				;
			movfw	T_dop				; +T_dop
			addwf	peBsl,f				;
			BNC		$+2					;			
			incf	peBsh,f				;
			call	sravnenie			;
			btfss	MEN					;
		goto	alr_d2					;
			
			movfw	T_izm_hi			; сравнение данных на превышение максим	
			movwf	peAsh				; измеряемая температура не должна превышать T_zad - Gis_lo - T_dop
			movfw	T_izm_lo			; 
			movwf	peAsl				;
			movf	T_zad_hi,w			;
			movwf	peBsh				;
			movf	T_zad_lo,w			;
			movwf	peBsl				;
			movfw	Gis_lo				; -Gis_lo
			subwf	peBsl,f				;
			BC		$+2					;			
			decf	peBsh,f				;
			movfw	T_dop				; -T_dop
			subwf	peBsl,f				;
			BC		$+2					;			
			decf	peBsh,f				;
			call	sravnenie			;
			btfsc	BOL					;
	return								; 
alr_d2
			bcf		RELE1				; отключить реле авария
			bsf		RELE2				; включить реле аварии
		;	bcf		BEEP				; включить "бипер"
			
			movlw	.96 				; 
			call	big_str				; бегущая строка - нет выхода на режим
			call	klava				; 
			btfss	RAKTD				; проверить разрешение на проведение контроля
	return								; 
			goto	alr_d2				; 
	return								; 				
;============================================================================================

;============================================================================================
klava		; программа обработки нажатия клавиш
			BANKSEL	TRISB			; выбрать TRISB
			movlw	b'00001110'		; и настроить порты кнопок на ввод
			movwf	TRISB			; 
			BANKSEL	PORTB			; 
			bcf		kl_no			; сбросить бит нажатия клавиши
			
;====================== обработка клавиши функции
			btfsc	KLAV_F			; 
		goto	k_U					; 
i_re		btfss	vp_rp			; протестировать бит режима настройки
			goto	$+3				; 	
			bcf		vp_rp			; включить режим выбора параметра
			goto	$+2				; 
			bsf		vp_rp			; включить режим коррекции параметра
			bsf		kl_no			; бит нажатия клавиши			
			call	vybor_reg		; выбирать параметр
			goto	end_klava		; 			
;======================
k_U			btfsc	KLAV_U			; 
		goto	k_D					; 
			btfsc	vp_rp			; протестировать бит режима настройки		
		goto	tesvp				;	
			bsf		KL_U			;
			bcf		KL_D			;
		goto	tesvp				;			 
;======================			
k_D			btfsc	KLAV_D			; 
		goto	end_klava			;
			btfsc	vp_rp			; протестировать бит режима настройки	
			goto	tesvp			;	
			bsf		KL_D			;
			bcf		KL_U			;
tesvp		btfss	vp_rp			; протестировать бит режима настройки
			goto	$+3				;
			call	ustanov			; корректировать параметр
			goto	end_klava		; 			
			call	vybor_reg		; выбирать параметр
end_klava
			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	return												
;============================================================================================
;============================================================================================						
vybor_reg
			bcf		RAKTD			; заблокировать работу автоконтроля
			bcf		RELE2			; отключить реле аварии
		;	bcf		BEEP			; включить "бипер"
			bsf		kl_no			; бит клавиша нажата

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
			bsf		TOCHKA1			; выключить индикацию точки	в режиме настройки
			bsf		TOCHKA2			; выключить индикацию точки	в режиме настройки				
			bsf		TOCHKA3			; выключить индикацию точки	в режиме настройки	
			bsf		UST				; 
			movlw	DIND			; перезагрузить пепеременную автовыхода
			movwf	avtovyh			; 

			btfss	vp_rp			; если сброшен индицировать назавание параметра
			goto	pr_pr			; если установлен его значение			
			btfsc	ONF				; 
			goto	ONF_f
			btfsc	TUM				; 
			goto	TUM_f			
			btfsc	UGZ				; 
			goto	UGZ_f			
			btfsc	TDO				; 
			goto	TDO_f			
			btfsc	VAK				; 
			goto	VAK_f			
			btfsc	IZG				; 
			goto	IZG_f			
			goto	ONF_f						
pr_pr			
			btfsc		KL_U		;
		goto	prev		 
next		btfsc	ONF				; циклический переключатель флагов
			goto	TUM_f			; 
			btfsc	TUM				; 
			goto	UGZ_f			; 
			btfsc	UGZ				; 
			goto	TDO_f			; 
			btfsc	TDO				; 
			goto	VAK_f			; 
			btfsc	VAK				; 
			goto	IZG_f			; 			
			goto	ONF_f			; настройки температуры задания


prev		btfsc	ONF				; циклический переключатель флагов
			goto	IZG_f			; 
			btfsc	IZG				; 
			goto	VAK_f			; 
			btfsc	VAK				; 
			goto	TDO_f			; 
			btfsc	TDO				; 
			goto	UGZ_f			; 
			btfsc	UGZ				; 
			goto	TUM_f			; 			
			goto	ONF_f			; настройки температуры задания
;===============================================
	; Телефон изготовителя
IZG_f		movlw	b'00100000'		; 
			movwf	flag_2			; настройки времени включения режима автоконтроля (10-60)
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	IZG_d			; если установлен его значение
			movlw	.88				; тел. изготовителя
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor			; 
IZG_d		movlw	.24				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка
			movlw	.88				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка	
		goto	end_vybor			; 
;===============================================
	; Время автоконтроля
VAK_f		movlw	b'00010000'		; 
			movwf	flag_2			; настройки времени включения режима автоконтроля (10-60)
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	VAK_d			; если установлен его значение
			movlw	.84				; Uut
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor			; 		
VAK_d		movfw	V_avk			; 
			movwf	binl			; 
			clrf	binh			; 
			call    bin_dec			; 
			call	conv_ch			; 
		;	call	ind_zad			; 
		goto	end_vybor			;
;===============================================
	; Допуск на отклонение температуры от задания	 
TDO_f		movlw	b'00001000'		; 
			movwf	flag_2			; НАСТРОЙКИ температуры автоконтроля отклонения от задания 
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	TDO_d			; если установлен его значение
			movlw	.80				; dot
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor			; 
TDO_d		movfw	T_dop			; 
			movwf	binl			; 
			clrf	binh			; 
			bsf		BTE				; 
			call    bin_dec			; 
			call	conv_t			; 
	;		call	ind_zad			; 
		goto	end_vybor			; 
;===============================================
	; гистерезис
UGZ_f		movlw	b'00000100'		; 
			movwf	flag_2			; настройки гистерезиса задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	UGZ_d			; если установлен его значение
			movlw	.76				; qic
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor			; 
UGZ_d		movfw	Gis_lo			; 
			movwf	binl			; 
			clrf	binh			; 
			bsf		BTE				; 
			call    bin_dec			; 
			call	conv_t			; 
		;	call	ind_zad			; 
		goto	end_vybor			; 
;===============================================
		; температура задания
TUM_f		movlw	b'00000010'
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	TUM_d			; если установлен его значение
			movlw	.72				; tuc
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor
TUM_d		
			movfw	T_zad_hi		; 
			movwf	binh			; 
			movfw	T_zad_lo		; 
			movwf	binl			; 
			bsf		BTE				; 
			call    bin_dec			; 
			call	conv_t			; 
		;	call	ind_zad			; 
		goto	end_vybor			; 
;===============================================
ONF_f		movlw	b'00000001'		; 
			movwf	flag_2			; индикация состояния регулятора вкл. выкл.
			
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	ONF_d			; если установлен его значение
			movlw	.92				; 		
			btfsc	KL_D			; 
			call	big_str			; подпрограмма бегущая строка
			btfsc	KL_U			; 
			call	big_str_re		; подпрограмма бегущая строка
		goto	end_vybor
ONF_d		btfsc	ON_OFF			; 
			goto	ioff			; 
			clrf	ind_1			;
			movlw	b'10111000'		; символ o
			movwf	ind_2			;			
			movlw	b'10101000'		; символ n
			movwf	ind_3			;
			goto	end_vybor		; 
ioff		movlw	b'10111000'		; символ o
			movwf	ind_1			;
			movlw	b'11100010'		; символ F
			movwf	ind_2			;
			movlw	b'11100010'		; символ F
			movwf	ind_3			;
		;	call	ind_zad			; 
end_vybor	
			bcf		KL_F			; 
		;	bsf		BEEP			; выключить "бипер"	
	return	
;============================================================================================
ustanov	
;	return
			bsf		kl_no			; бит клавиша нажата
		;	bcf		BEEP			; включить "бипер"
		;	bsf		TOCHKA1			; выключить индикацию точки	в режиме настройки	
		;	bsf		TOCHKA2			; выключить индикацию точки	в режиме настройки				
		;	bsf		TOCHKA3			; выключить индикацию точки	в режиме настройки	
			movlw	DIND			; инициализация счетчика задежки
			movwf	avtovyh			; автовыхода из установки

			btfsc	TUM				; 
			goto	u_TUM			; 
			btfsc	UGZ				; 
			goto	u_UGZ			; 
			btfsc	TDO				; 
			goto	u_TDO			; 
			btfsc	VAK				; 
			goto	u_VAK			; 
			btfsc	ONF				; 
			goto	u_ONF			;
	return			 
u_TUM	;------------------------------------------------------
;====================================
n_TEMP			;задается температура регулировки
			btfsc	KLAV_D					; + тем
		goto	kk_TEMP					;
			movlw	Tmax_hi				; максимальная температура задания должна быть не больше
			movwf	peAsh				;Тав_мах-Г2-5грд.
			movlw	Tmax_lo				;
			movwf	peAsl				;		
			movlw	.50					;
			subwf	peAsl,f				;			
			BC		$+2					;			
			decf	peAsh,f				;
			movfw	Gis_lo				;
			subwf	peAsl,f				;
			BC		$+2					;			
			decf	peAsh,f				;

			movf	T_zad_hi,w			;
			movwf	peBsh				;
			movf	T_zad_lo,w			;
			movwf	peBsl				;
			call	sravnenie			;
			btfss	BOL					;
		goto	kk_TEMP					;
			btfss	TOCHKA3
		goto	umde			
			movlw	.1					;
			addwf	T_zad_lo,f			;
			btfsc	STATUS,C			;
			incf	T_zad_hi,f			;
	goto	end_TEMP					; 
umde		movlw	.10					;
			addwf	T_zad_lo,f			;
			btfsc	STATUS,C			;
			incf	T_zad_hi,f			;
	goto	end_TEMP					; 

kk_TEMP									; 
			btfsc	KLAV_U					; - тем
	goto	end_TEMP					; 
			clrf	peAsh				; минимальная температура задания должна быть не меньше			
			movlw	.50					; 
			movwf	peAsl				; Тавр + 5 грд + Г1+Г2
			movlw	Tmin_lo				;
			addwf	peAsl,f				;
			BNC		$+2					;
			incf	peAsh,f				;
			movfw	Gis_lo				;
			addwf	peAsl,f				;
			BNC		$+2					;
			incf	peAsh,f				;			
			movlw	Tmin_hi				;
			addwf	peAsh,f				;
			movf	T_zad_hi,w
			movwf	peBsh				;
			movf	T_zad_lo,w
			movwf	peBsl				;
			call	sravnenie			;
			btfss	MEN					;
	goto	end_TEMP					; 
			btfss	TOCHKA3
		goto	uvde
			movlw	.1					;
			subwf	T_zad_lo,f			;
			btfss	STATUS,C			;
			decf	T_zad_hi,f			;
	goto	end_TEMP					; 
uvde		movlw	.10					;
			subwf	T_zad_lo,f			;
			btfss	STATUS,C			;
			decf	T_zad_hi,f			;
end_TEMP

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	goto	TUM_d

u_UGZ	;------------------------------------------------------
			btfsc	KLAV_D			; 
			goto	u_U_U			;
			
			movlw	G_MAX			;выбор максимального возможного задания гистерезиса
			subwf	Gis_lo,w			;
			SKPZ					;	
			incf	Gis_lo,f			;
			goto	$+.7			;
			
u_U_U		btfsc	KLAV_U			; 
			goto	$+5				;
			movlw	G_MIN			;
			subwf	Gis_lo,w			;
			SKPZ					;
			decf	Gis_lo,f			;
			

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	goto	UGZ_d
u_TDO	;------------------------------------------------------
			btfsc	KLAV_D			; 
			goto	$+6				;
			movlw	D_MAX			;
			subwf	T_dop,w			;
			SKPZ					;	
			incf	T_dop,f			;
			goto	$+.7			;
			
			btfsc	KLAV_U			; 
			goto	$+5				;
			movlw	D_MIN			;
			subwf	T_dop,w			;
			SKPZ					;
			decf	T_dop,f			;

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	goto	TDO_d
u_VAK	;------------------------------------------------------
			btfsc	KLAV_D			; 
			goto	$+6				;
			movlw	K_MAX			;
			subwf	V_avk,w			;
			SKPZ					;	
			incf	V_avk,f			;
			goto	$+.7			;
			
			btfsc	KLAV_U			; 
			goto	$+5				;
			movlw	K_MIN			;
			subwf	V_avk,w			;
			SKPZ					;
			decf	V_avk,f			;
			
			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	goto	VAK_d
u_ONF	;------------------------------------------------------						
			btfsc	KLAV_U			; 
			goto	$+2				;
			bsf		ON_OFF			;	
			
			btfsc	KLAV_D			; 
			goto	$+2				;
			bcf		ON_OFF			;		

			BANKSEL	TRISB			; выбрать TRISB
			clrf	TRISB			; и настроить все линии порта на вывод 
			BANKSEL	PORTB			; 
	goto	ONF_d
;============================================================================================
;============================================================================================						

;============================================================================================
;********************цикл задержки процессора************************************************
zaderj
			clrwdt					; сброс сторожевого таймера++++++
			movfw 	per_zad			; вызов текущей длительности
			movwf	zaderj1			; загрузка первой переменной цикла
cycle1		movfw 	per_zad			; вызов текущей длительности
			movwf	zaderj2			; загрузка второй переменной цикла
cycle2		decfsz 	zaderj2,f		; цикл 2 (уменьшение до нуля)
			goto 	$-1				;
			decfsz 	zaderj1,f		; цикл 1 (уменьшение до нуля)
			goto 	$-5				;
		return
;********************************************************************************************
;********************режим мигания индикатора************************************************
mig_u								; подпрограмма мигания индикатора

	;		movlw	.150			;
	;		movwf	b_zad_ind		;
	;		call	ind_zad			;
			
			btfsc	B_MIG
			goto	$-1
		bsf		RAZR1				; бит мигания разряда индикатора
		bsf		RAZR2				; 0 - горит постоянно
		bsf		RAZR3				; 1 - мигает с частотой 2 гц.
			;==============			; индикация
			movlw	.255			;
			movwf	b_zad_ind		;			
			call	ind_zad			;
			movlw	.255			;
			movwf	b_zad_ind		;			
			call	ind_zad			;
			movlw	.255			;
			movwf	b_zad_ind		;			
			call	ind_zad			;
			;==============			;
		btfsc	B_MIG
		goto	$-1
		bcf		RAZR1				; бит мигания разряда индикатора
		bcf		RAZR2				; 0 - горит постоянно
		bcf		RAZR3				; 1 - мигает с частотой 2 гц.
			movlw	.255			;
			movwf	b_zad_ind		;
			call	ind_zad			;
	return

;******************** цикл индикации *************************************************************
									; задежка вывода индикации
ind_zad								;
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.60				;
			movwf	b_zad_ind		;
		return						; 					; 
;*************************************************************************************************
big_str								; подпрограмма бегущая строка
			movwf	perem2			; 		
			bsf		TOCHKA1			; выключить индикацию точки				
			bsf		TOCHKA2			; выключить индикацию точки				
			bsf		TOCHKA3			; выключить индикацию точки
			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	.60				;
			movwf	b_zad_ind		;
			goto	infch			; повтор очистки
;*************************************************************************************************
big_str_re							; подпрограмма бегущая строка с лево на право
			movwf	perem2			; 		
			bsf		TOCHKA1			; выключить индикацию точки				
			bsf		TOCHKA2			; выключить индикацию точки				
			bsf		TOCHKA3			; выключить индикацию точки
			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	.60				;
			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	.60				;
			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	.60				;
			movwf	b_zad_ind		;
			goto	dec_ring		; 	повтор очистки
;******************** цикл индикации *************************************************************
c_ind 		clrwdt					; сброс сторожевого таймера++++++
			movlw	.60
			movwf	b_zad_ind
			call	ind_zad			; цикл индикации
	return
;*************************************************************************************************

;==================Индикация=================================================================
indic								; программа развертки индикацией
;=========================
			btfss	TOCHKA1			; загрузка десятичной точки
			bsf		ind_1,0			; 
			btfss	TOCHKA2			; 
			bsf		ind_2,0			; 
			btfss	TOCHKA3			; 
			bsf		ind_3,0			; 

;=============================================	
i1ry		btfss	reg_ind,0
		goto	i2ry	
			bsf		EDI				; гашение индикации единиц
			movfw	ind_1			; вызов кода индикации первого знакоместа (левого)
			movwf	PORTB			; загрузка порта В
			btfss	RAZR1			; 
			goto	ir1t			; индикация разряда постоянна
;=========================	
			btfss	B_MIG			; мигание
			goto	ir1t			; если бит 0 знакоместо горит
			movlw	b'00000001'
			andwf	PORTB,f			; если бит 1 знакоместо погащено
			goto	ir1t			; 
;=========================			
ir1t		btfss	TOCHm1			; 
			goto	ir1				; точка не мигает
;=========================	
			btfss	B_MIG			; мигание точки
			bcf		PORTB,0			; если бит 0 точка горит
;=========================
ir1			bcf		SOT				; включение индикации тысяч
			clrf	reg_ind
			bsf		reg_ind,1
	return
;=============================================	
i2ry		btfss	reg_ind,1
		goto	i3ry		
			bsf		SOT				; гашение индикации тысяч
			movfw	ind_2			; вызов кода индикации второго знакоместка (среднего)
			movwf	PORTB			; загрузка порта В
			btfss	RAZR2			; 
			goto	ir2t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir2t			; если бит 0 знакоместо горит
			movlw	b'00000001'
			andwf	PORTB,f			; если бит 1 знакоместо погащено
			goto	ir2t			; 
;=========================			
ir2t		btfss	TOCHm2			; 
			goto	ir2				; точка не мигает
;=========================	
			btfss	B_MIG			; мигание точки
			bcf		PORTB,0			; если бит 0 точка горит
;=========================
ir2			bcf		DES				; включение индикации сотен				
			clrf	reg_ind
			bsf		reg_ind,2
	return
;=============================================	
i3ry		bsf		DES				; гашение индикации единиц
			movfw	ind_3			; вызов кода индикации третьего знакоместка (правого)
			movwf	PORTB			; загрузка порта В
			btfss	RAZR3			; 
			goto	ir3t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir3t			; если бит 0 знакоместо горит
			movlw	b'00000001'
			andwf	PORTB,f			; если бит 1 знакоместо погащено
			goto	ir3t			; 
;=========================			
ir3t		btfss	TOCHm3			; 
			goto	ir3				; точка не мигает
;=========================	
			btfss	B_MIG			; мигание точки
			bcf		PORTB,0			; если бит 0 точка горит
;=========================
ir3			bcf		EDI				; включение индикации десятков	
			clrf	reg_ind
			bsf		reg_ind,0
	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			; выставить нулевой адрес
			bsf		EECON1,RD		; начать чтение с  EEPROM
			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	
			banksel	chtteep
			movwf	chtteep				; 
			banksel	flag_0
			movlw	flag_0
			movwf	FSR					; загрузка начала блока данных
			clrf	adr_e				; 			

povch1		
			banksel	flag_0
			movf	INDF,w				; загрузить в ОЗУ и увеличить указатель
			call	zap_2byt_eeprom		;
			incf	FSR,f
			incf	adr_e,f				; увеличить адрес EEPROM
			banksel	chtteep
			decfsz	chtteep,f				; уменьшить счетчик и проверить на ноль
			goto	povch1				; повториь если не ноль
			banksel	perem5
			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				; 
			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								;
;********************************************************************************************
;********************************************************************************************
zam_left
			; вывод на индикатор с право на лево "<-"

			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_1			; загрузка в знакоместо
			movfw	ind_3			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_1
			movwf	ind_3			; очистить 3 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++

			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_1			; загрузка в знакоместо
			movfw	ind_3			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_2
			movwf	ind_3			; очистить 3 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++
			
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_1			; загрузка в знакоместо
			movfw	ind_3			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_3
			movwf	ind_3			; очистить 3 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++
	return
;********************************************************************************************
zam_ring
			; вывод на индикатор с право на лево "->"

			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_3			; загрузка в знакоместо
			movfw	ind_1			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_3
			movwf	ind_1			; загрузить 1 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++

			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_3			; загрузка в знакоместо
			movfw	ind_1			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_2
			movwf	ind_1			; загрузить 1 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++
			
			movfw	ind_2			; данные 2 ЗМ в 1 ЗМ
			movwf	ind_3			; загрузка в знакоместо
			movfw	ind_1			; данные 3 ЗМ в 2 ЗМ
			movwf	ind_2			; загрузка в знакоместо
			movfw	buf_ind_1
			movwf	ind_1			; загрузить 1 знакрместо
			call	c_ind			; цикл индикации
			clrwdt					; сброс сторожевого таймера++++++
	return
;********************************************************************************************************
conv_ch								; конвертирование целой части в три младших разрядов
			movfw	edin				; 
			movwf	ind_3			; 
			movfw	dest				; 
			movwf	ind_2			; 
			movfw	sotn				; 
			movwf	ind_1			; 
	return
;********************************************************************************************************
conv_tb
			movf	binh,w			; ПРОВЕРИТЬ ТЕМП ИЗМ <100
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0x03			;
			movwf	peBsh			;
			movlw	0xE8			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	MEN				;
		goto	obindf				;	
			movf	binh,w			; ПРОВЕРИТЬ ТЕМП ИЗМ >-10
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0xFF			;
			movwf	peBsh			;
			movlw	0x9c			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	BOL				;
		goto	obindf				;

			movfw	edin			; 
			movwf	buf_ind_3		; 
			movfw	dest			; 
			movwf	buf_ind_2		; 
			bsf		buf_ind_2,0
			movfw	sotn			; 
			movwf	buf_ind_1		; 				
		return						; 

obindf
			movfw	dest			; 
			movwf	buf_ind_3		; 
			bsf		buf_ind_3,0
			movfw	sotn			; 
			movwf	buf_ind_2		; 
			movfw	tysc			; 
			movwf	buf_ind_1		; 				
		return						;
;********************************************************************************************************
conv_t								; конвертирование значения температуры
			bcf		oh_te			; сбросить бит ошибки температуры
			btfsc	ERROR_D			; проверка исправности датчика температуры
		goto	Erro				; 
				
				; проверка на диапазон индикации -55 + 125 С грд
			movf	binh,w			;ПРОВЕРИТЬ ТЕМП ИЗМ >125
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0x04			;
			movwf	peBsh			;
			movlw	0xE2			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	BOL				;
		goto	nam55				;
			movlw	.62  			; 
			call	big_str			; бегущая строка - горячо
			call 	och_left		; очистка индикатора
			bsf		oh_te			; ошибка темпер.
	return	
nam55			
			movf	binh,w			;ПРОВЕРИТЬ ТЕМП ИЗМ -55
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0xfd			;
			movwf	peBsh			;
			movlw	0xda			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	MEN				;
		goto	p_ind_r				;
			movlw	.57  			; 
			call	big_str			; бегущая строка - холодно
			call 	och_left		; очистка индикатора
			bsf		oh_te			; ошибка темпер.
	return						
;				вид индикации
p_ind_r
			movf	binh,w			; ПРОВЕРИТЬ ТЕМП ИЗМ <100.0
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0x03			;
			movwf	peBsh			;
			movlw	0xE8			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	MEN				;
		goto	obind				;	
	
			movf	binh,w			;ПРОВЕРИТЬ ТЕМП ИЗМ >-10.0
			movwf	peAsh			;			
			movf	binl,w			;
			movwf	peAsl			;
			movlw	0xFF			;
			movwf	peBsh			;
			movlw	0x9c			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	BOL				;
		goto	obind				;

			btfss	RELE1			; цикл управления прерывистой индикацией
			goto	$+3				;
			bsf		TOCHm2			;
			goto	$+2				;
			bcf		TOCHm2			;
			bcf		TOCHm3			;			
			bsf		TOCHKA3			;
			bcf		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			;
			bcf		TOCHKA3
			bsf		TOCHKA2
			movfw	dest			; 
			movwf	ind_3			; 
			movfw	sotn			; 
			movwf	ind_2			; 
			movfw	tysc			; 
			movwf	ind_1			; 				
		return						;

Erro			
			bcf		RELE1			; отключить управление
			bsf		RELE2			; включить сигнал аварии		
			movlw	.12				; код ошибка датчика
			call	big_str			; подпрограмма бегущая строка
			call 	och_left		; очистка индикатора
		return						; 
;********************************************************************************************************
;============================================================================================

sravnenie								;
			clrf	flag_srv			; очистка флагов сравнения
			clrf	regsr				; очистить переменную определения знаков
			
			btfss	B24					; сравнение 24 или 16 бит
			goto	sr16z				; 16
			
			btfsc	peAsu,7				; проверить 7 бит если 0 положит
			bsf		regsr,0				; если 1 отриц. записать 1 в 0 раз.
			btfsc	peBsu,7				; проверить 7 бит если 0 положит
			bsf		regsr,1				; если 1 отриц. записать 1 в 1 раз.
			goto		uzs


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										;
			btfss	B24					; сравнение 24 или 16 бит
			goto	sr16				; 16
			bcf		B24					; 
			movf	peAsu,w				; сравнение целых частей
			subwf	peBsu,w				; 24 (пропустить если равно)
			btfss	STATUS,Z
			goto	$+2					; числа не равны
			goto	sr16				; числа равны проверить след биты
			movf	peAsu,w				; 
			subwf	peBsu,w				; пропустить если меньше
			btfsc	STATUS,C
			goto	$+4					;
			bsf		BOL					; peAsh>peBsh сравнение млад неиграет роли
			bsf		BOL_RAV				;
		return							; 
			bsf		MEN					; peAsh<peBsh сравнение млад неиграет роли 			
			bsf		MEN_RAV				;
		return							;
sr16		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							;
;============================================================================================
;********************************************************************************************
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;***подпрограма преобразования 24/16 битного двоичного в 7 байта двоично десятичного ****************
										; входные данный binl, binh, binu
										; выходные edin,dest,sotn,tysc,dtys,stys,mlon
										; B24 0 преобразоваание 16 бит, 1- 24 (16 по умолчанию)
										; BTE бит преобразования вида 00 или 0
bin_dec
				movfw	binu
				movwf	bu_binu
				movfw	binh
				movwf	bu_binh
				movfw	binl
				movwf	bu_binl
				
				clrf	mlon			; очистка буфера 
				clrf	stys			; очистка буфера
				clrf	dtys			; очистка буфера
				clrf	tysc			; очистка буфера
				clrf	sotn			; очистка буфера 
				clrf	dest			; очистка буфера 
				clrf	edin			; очистка буфера
				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 битных чисел

				btfss	binl,0			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi1				; обработка бита с весом 1
				movlw	.1
				call	pere_edi
bi1				btfss	binl,1			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi2				; обработка бита с весом 2
				movlw	.2
				call	pere_edi
bi2				btfss	binl,2			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi3				; обработка бита с весом 4
				movlw	.4
				call	pere_edi
bi3				btfss	binl,3			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi4				; обработка бита с весом 8
				movlw	.8
				call	pere_edi
bi4				btfss	binl,4			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi5				; обработка бита с весом 16
				movlw	.6
				call	pere_edi
				movlw	.1
				call	pere_des
bi5				btfss	binl,5			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi6				; обработка бита с весом 32
				movlw	.2
				call	pere_edi
				movlw	.3
				call	pere_des
bi6				btfss	binl,6			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi7				; обработка бита с весом 64
				movlw	.4
				call	pere_edi
				movlw	.6
				call	pere_des
bi7				btfss	binl,7			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi10			; обработка бита с весом 128
				movlw	.8
				call	pere_edi
				movlw	.2
				call	pere_des
				movlw	.1
				call	pere_sot
bi10			btfss	binh,0			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi11			; обработка бита с весом 256
				movlw	.6
				call	pere_edi
				movlw	.5
				call	pere_des
				movlw	.2
				call	pere_sot
bi11			btfss	binh,1			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi12			; обработка бита с весом 512
				movlw	.2
				call	pere_edi
				movlw	.1
				call	pere_des
				movlw	.5
				call	pere_sot
bi12			btfss	binh,2			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi13			; обработка бита с весом 1024
				movlw	.4
				call	pere_edi
				movlw	.2
				call	pere_des
				;0-операция пропускается
				movlw	.1
				call	pere_tys
bi13			btfss	binh,3			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi14			; обработка бита с весом 2048
				movlw	.8
				call	pere_edi
				movlw	.4
				call	pere_des
				;0-операция пропускается
				movlw	.2
				call	pere_tys
bi14			btfss	binh,4			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi15			; обработка бита с весом 4096
				movlw	.6
				call	pere_edi
				movlw	.9
				call	pere_des
				;0-операция пропускается
				movlw	.4
				call	pere_tys
bi15			btfss	binh,5			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi16			; обработка бита с весом 8192
				movlw	.2
				call	pere_edi
				movlw	.9
				call	pere_des
				movlw	.1
				call	pere_sot
				movlw	.8
				call	pere_tys
bi16			btfss	binh,6			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi17			; обработка бита с весом 16384
				movlw	.4
				call	pere_edi
				movlw	.8
				call	pere_des
				movlw	.3
				call	pere_sot
				movlw	.6
				call	pere_tys
				movlw	.1
				call	pere_dtys
bi17			btfss	binh,7			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi20			; обработка бита с весом 32768
				movlw	.8
				call	pere_edi
				movlw	.6
				call	pere_des
				movlw	.7
				call	pere_sot
				movlw	.2
				call	pere_tys
				movlw	.3
				call	pere_dtys				

bi20			btfss	binu,0			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi21			; обработка бита с весом 65536
				movlw	.6
				call	pere_edi
				movlw	.3
				call	pere_des
				movlw	.5
				call	pere_sot
				movlw	.5
				call	pere_tys
				movlw	.6
				call	pere_dtys				
bi21			btfss	binu,1			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi22			; обработка бита с весом 131072
				movlw	.2
				call	pere_edi
				movlw	.7
				call	pere_des
			;	movlw	.0
			;	call	pere_sot
				movlw	.1
				call	pere_tys
				movlw	.3
				call	pere_dtys
				movlw	.1
				call	pere_stys
bi22			btfss	binu,2			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi23			; обработка бита с весом 262144
				movlw	.4
				call	pere_edi
				movlw	.4
				call	pere_des
				movlw	.1
				call	pere_sot
				movlw	.2
				call	pere_tys
				movlw	.6
				call	pere_dtys
				movlw	.2
				call	pere_stys
bi23			btfss	binu,3			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi24			; обработка бита с весом 524288
				movlw	.8
				call	pere_edi
				movlw	.8
				call	pere_des
				movlw	.2
				call	pere_sot
				movlw	.4
				call	pere_tys
				movlw	.2
				call	pere_dtys
				movlw	.5
				call	pere_stys				
bi24			btfss	binu,4			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi25			; обработка бита с весом 1048576
				movlw	.6
				call	pere_edi
				movlw	.7
				call	pere_des
				movlw	.5
				call	pere_sot
				movlw	.8
				call	pere_tys
				movlw	.4
				call	pere_dtys
			;	movlw	.0
			;	call	pere_stys				
				movlw	.1
				call	pere_mil	
bi25			btfss	binu,5			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	bi26			; обработка бита с весом 2097152
				movlw	.2
				call	pere_edi
				movlw	.5
				call	pere_des
				movlw	.1
				call	pere_sot
				movlw	.7
				call	pere_tys
				movlw	.9
				call	pere_dtys
			;	movlw	.0
			;	call	pere_stys				
				movlw	.2
				call	pere_mil
bi26			btfss	binu,6			; проверить бит если равен 1, то переход, если нет пропуск след. команды
				goto	gnn				; обработка бита с весом 4194304
				movlw	.4
				call	pere_edi
			;	movlw	.0
			;	call	pere_des
				movlw	.3
				call	pere_sot
				movlw	.4
				call	pere_tys
				movlw	.9
				call	pere_dtys
				movlw	.1
				call	pere_stys				
				movlw	.4
				call	pere_mil

		; программа гашения незначащих нулей		
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			
				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			; 
			;	pagesel	deshif			;
				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	bu_binu
				movwf	binu
				movfw	bu_binh
				movwf	binh
				movfw	bu_binl
				movwf	binl

			return	

;*********обработка переноса
pere_edi		addwf	edin,f			; суммировать сначение в аккумуляторе с содержимым sot_dro
				movlw	.10				; константа десятичной системы исчисления
				subwf	edin,w			; проверка на десятичный перенос
				BC		mtk1			;
			return						; переноса нет
mtk1			movlw	.10				; обработка переноса в единицах
				subwf	edin,f
				movlw	.1
pere_des		addwf	dest,f
				movlw	.10
				subwf	dest,w
				BC		mtk2			;
			return
mtk2			movlw	.10				; обработка переноса в десятках
				subwf	dest,f
				movlw	.1
pere_sot		addwf	sotn,f
				movlw	.10
				subwf	sotn,w
				BC		mtk3			;
			return
mtk3			movlw	.10				; обработка переноса в сотнях
				subwf	sotn,f
				movlw	.1
pere_tys		addwf	tysc,f
				movlw	.10
				subwf	tysc,w
				BC		mtk4			;
			return
mtk4			movlw	.10				; обработка переноса в дес.сотнях
				subwf	tysc,f
				movlw	.1
pere_dtys		addwf	dtys,f
				movlw	.10
				subwf	dtys,w
				BC		mtk5			;
			return
mtk5			movlw	.10				; обработка переноса в сет.сотнен
				subwf	dtys,f
				movlw	.1
pere_stys		addwf	stys,f
				movlw	.10
				subwf	stys,w
				BC		mtk6			;
			return
mtk6			movlw	.10				; обработка переноса в сет.сотнен
				subwf	stys,f
				movlw	.1
pere_mil		addwf	mlon,f
				movlw	.10
				subwf	mlon,w
		return
;============================================================================================

;============================================================================================
;********************************************************************************************
;********************************************************************************************
;DALLAS подпрограммы (работа с обычным питанием 3 жилы, Vdd, Vss, QD)
;********************************************************************************************
;********************************************************************************************
;********************************************************************************************
RESET_DALLAS				; формирование импульса сброса и тестирование присутствия датчика
			CALL 	DOUT_LOW 			; сформировать импульс сброса 480-960 mks
			
 			movlw	.160				; дли 480 мка
 			movwf	TEMP0				;
DSD_re 		DECFSZ 	TEMP0,F				; 
 			GOTO 	DSD_re				;
			
			CALL 	DOUT_HIGH 			; установить высокий уровень

			clrf	TEMP0				; ожидания импульса ответа от датчика температуры
GT_1  		clrwdt						; сброс сторожевого таймера++++++
			decfsz	TEMP0,f				; 
			goto	kip_1				; 

neitdtt		bsf		ERROR_D				; датчик неисправен
		return							; 
kip_1		
			BTFSC 	DALLAS 				; ожидать импульс присутствия
			GOTO 	GT_1				;
			clrf	TEMP0				; 

GT_2  		clrwdt						; сброс сторожевого таймера++++++			
			decfsz	TEMP0,f				; 
			goto	kip_2				; 
			goto	neitdtt				; 
kip_2
			btfss 	DALLAS 				; ожидать окончания импульс присутствия
			GOTO 	GT_2				; 

end_fu		bcf		ERROR_D				; датчик исправен
		return							; 
;********************************************************************************************
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину,
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень
DOUT_HIGH
 			bsf		DALLAS				; установить высокий уровень на шине
			MOVLW 	.1					;задежка необходимвя для увеличения длины кабеля
			MOVWF 	TEMP0				; 
DCD_1p 		DECFSZ 	TEMP0,F				; 
			GOTO 	DCD_1p				;
			
 			BANKSEL	TRISDAL				; выбрать банк 1
 			bsf		TRISDAL,LINE		; настроить порт на ввод (имитация открытого коллектора)
 			BANKSEL	PORTDAL				; выбрать банк 0
		retlw	.0						; 
;********************************************************************************************
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа  на  вывод и устанавливает на ней "0"
DOUT_LOW
 			BANKSEL	TRISDAL				; выбрать банк 1
 			bcf		TRISDAL,LINE		; настроить порт на выход
 			BANKSEL	PORTDAL				; выбрать банк 0
 			bcf		DALLAS				; установить низкий уровень на шине
			
			MOVLW 	.1					;задежка необходимвя для увеличения длины кабеля
			MOVWF 	TEMP0				; 
DCD_1x 		DECFSZ 	TEMP0,F				; 
			GOTO 	DCD_1x				; 
		retlw	.0						; 
;********************************************************************************************

; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных.
; Вызывается из программы: 		DSEND	; 
; Используется регистр: 		TEMP0	; 
; используемые подпрограммы: 	НЕТ		; 
DLIT_WR									; 
			MOVLW 	.20					;	.5.40
			MOVWF 	TEMP0				; 
DSD_1 		DECFSZ 	TEMP0,F				; 
			GOTO 	DSD_1				; 
DLIT_WR_END								; 
		RETLW H'00'						; 
;********************************************************************************************
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
DRECEIVE
			MOVLW 	H'08' 				; Количество получаемых бит
			MOVWF 	TEMP1				; Загрузка регистра счетчика
C_DRECEIVE	CALL 	DOUT_LOW 			; старт чтения бита установить низкий уровень)
			CALL 	DOUT_HIGH 			; начать чтение
			btfss 	DALLAS 				; проверить уровень на линии DALLAS1			
			bcf 	STATUS,C 			; установить С в "0" 
			btfsc 	DALLAS 				; проверить уровень на линии DALLAS1			
			bsf 	STATUS,C			; нет установить С в "1" 
			RRF 	COM_REG,F 			; сдвиг вправо для записи в регистре COM_REG
			CALL 	DLIT_WR 			; ожидать для окончания формирование далласом бита
			DECFSZ 	TEMP1,F				; 
			GOTO 	C_DRECEIVE			; 
DRECEIVE_END							; 
		RETLW 	H'00'					; 
;********************************************************************************************
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
; Вызывается из программы: 		GET_TEMPERATURE
; Используемые регистры: 		COM_REG, GPIO, STATUS, TEMP1
; Используемые подпрограммы: 	DOUT_HIGH, DOUT_LOW, DLIT_WR
DSEND
 			MOVWF 	COM_REG 			; Загрузка бофера команд для пересылки
 			MOVLW 	H'08' 				; Количество битов для пересылки
 			MOVWF 	TEMP1				; 
C_DSEND		CALL 	DOUT_LOW 			; Start the write slot
 			RRF 	COM_REG,F 			; Сдвиг вправо, чтобы определить через бит С превый бит для пересылки
			btfss 	STATUS,C 			; Смотреть бит С == 1 
 		goto 	SEND0					; 
 			CALL 	DOUT_HIGH 			; Установить динию в "1" если бит С == 1
 		goto 	DS_1					; 
SEND0 		CALL 	DOUT_LOW       	 	; Установить линию в "0", если бит С == 0
DS_1 		CALL 	DLIT_WR 			; Ожидать 60uS, чтобы позволить DS1820 выполнить выборку
 			CALL 	DOUT_HIGH 			; Установить шину в "1"
 			DECFSZ 	TEMP1,F 			; Уменьшить счетчик переданных битов и проверить достигнут ли ноль
 			goto 	C_DSEND				; Повторить передачу бита
DSEND_END								; 
		RETLW H'00'						; 
;********************************************************************************************
	
;********************************************************************************************
										; чтение температуры из термометра
celsio									; 
;			btfsc	ALRM				; пропустить цикл измерения
;		return							; 
;========================================
; измерение температуры					; 
 			clrwdt						; сброс сторожевого таймера++++++
			btfsc	CT					; флаг конвертирования установлен
			goto	test_konv			; Да перейти на отсчет времени задежки
			call	RESET_DALLAS		; 
			btfsc	ERROR_D				;
		return				; датчик неисправен прервать конвертирование температуры
;========================================
			MOVLW 	H'CC' 				; послать команду Пропустить ROM
			CALL 	DSEND				;
			MOVLW 	H'44' 				; послать команду Конвертировать температуру
			CALL 	DSEND				;
			bsf		CT					; установить флаг - > режим чтение информации
			movlw	.2					; 6 для нормального питания, 7 - 8 для паразитного - загрузить константу длительности импульса
			movwf	vr_konvert			; формирования времени конвертирования
			bsf		RSF					; установить бит "период конвертирования"
		return							; 
;========================================							; 
;========================================; тестирования окончания конвертирования температуры
test_konv	btfsc	RSF					; проверить конвертирование авполнено		
		return							; если "1" еще идет
;========================================
			call	RESET_DALLAS		; 
			btfsc	ERROR_D				;
		return				;
			MOVLW 	H'CC' 				; послать команду Пропустить ROM
			CALL 	DSEND				;
			MOVLW 	H'BE' 				; послать команду чтения памяти
			CALL 	DSEND				;
			CALL 	DRECEIVE 			; читать 1 байт
			MOVF 	COM_REG,W			;
			MOVWF 	TEMP_LO				;
			CALL 	DRECEIVE 			; читать 2 байт
			MOVF 	COM_REG,W			;
			MOVWF 	TEMP_HI				;
			bcf		CT					; сбросить флаг - > режим конвертировани
;========================================
		; преобразование данных датчика в температуру
		; вормат температуры двоичное число два байта, где в нем младший десятичный разряд после преобразования десятые доли градуса
			bcf		MINUS_d				; сбросить флаг отрицательной температуры
			btfss	TEMP_HI,7			; проверить температура отрицательная
			goto	qwe					; нет (преобразование кода долей градуса)
			bsf		MINUS_d				; ДА установить бит отрицательной температуры
qwe			movlw	b'00001111'			; константа очистки старщего байта
			andwf	TEMP_LO,w			; очистка старшего полубайта
			btfss	MINUS_d				; 
			goto	konv				; 
			movwf	TEMP0				; 
			decf	TEMP0,f				; 
			comf	TEMP0,w				; 
			andlw	b'00001111'			; 
konv		call	con_dro				; в значение температуры в десятые доли
			
			movwf	t_binl
			
			swapf	TEMP_HI,f			; преобразование целой части
			movlw	b'11110000'			; константа очистки младшего байта
			andwf	TEMP_HI,f			; очистка младшего полубайта
			movlw	b'11110000'			; константа очистки младшего байта
			andwf	TEMP_LO,f			; очистка младшего полубайта
			swapf	TEMP_LO,w			; 
			iorwf	TEMP_HI,w			; 			
			
			movwf	t_binh				; 			
			
			btfss	MINUS_d				; 
		goto		vdt1				; 
			comf	t_binh,f			;
			incf 	t_binh,f			; 
vdt1			
			btfss	MINUS_d				; 
		goto		vdt6				; 
			movf	t_binl,f			; 
			BZ		vdt6				; 
			decf	t_binh,f			; 
vdt6		
			; умножение на десять
			movf	t_binh,w			;
			movwf	TEMP0				; сохранить занчение binh

			clrf	t_binu
			bcf		STATUS,C			; 
			rlf		t_binh,f			; x2
			rlf		t_binu,f			;			
			rlf		t_binh,f			; x2
			rlf		t_binu,f			;
			rlf		t_binh,f			; x2 (8)
			rlf		t_binu,f			;
			
			movf	TEMP0,w				;+9
			addwf	t_binh,f			; 
			btfsc	STATUS,C			;			
			incf	t_binu,f			; 

			movf	TEMP0,w				;+10
			addwf	t_binh,f			; 
			btfsc	STATUS,C			;			
			incf	t_binu,f			; 
	;кoнец программы умножения на 10			

			movf	t_binl,w			; 
			addwf	t_binh,f			; 
			btfsc	STATUS,C			; 		
			incf	t_binu,f			; 
			
			movf	t_binh,w			; 
			movwf	t_binl				; 
			movf	t_binu,w			; 
			movwf	t_binh				; 
			clrf	t_binu				; 
			
			btfss	MINUS_d				; 
		goto		vdt4				; 
		  	comf	t_binl,F   			; дополнение bin
			incf    t_binl,F	     	;
			btfsc   STATUS,Z     		;
			decf    t_binh,F     		;
			comf    t_binh,F     		;
vdt4			
			movf	t_binl,w
			movwf	T_izm_lo			; сохранить в переменной текущей температуры
			movf	t_binh,w
			movwf	T_izm_hi			; сохранить в переменной текущей температуры
		return							;
;********************************************************************************************













;********************************************************************************************
				FILL(goto 0x00),0x800-$   ; заполнить все оставшееся место кодом








	END                       ; directive 'end of program'

