;**********************************************************************
;                                                                     *
;    Filename:	    CH_K3000_TER_-15i.asm                              *
;    Date:                                                            *
;    File Version:  верисия перенесеная на3000                        *
;                                                                     *
;    Author:     Гена Чернов                                          *
;    Company:     Магетэкс                                            *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;                                                                     *
;    Files required:  Универсальный терморегулятор                    *
;                          конструктор                                *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:  итоговая версия универсального терморегулятора           *
;    01a - оптимизирована программа индикации                         *
;    01b - оптимизирована программа измерения температуры гарантия 100м *
;    13i - итоговая  !!! (тест дачика 300 м)                          *
;    14i - опримизация модуля настроки параметров                     *
;**********************************************************************
;	list      p=16f648A           		; list directive to define processor
;	#include <p16F648A.inc>       		; processor specific variable definitions
             	
	list      p=16f628A           		; list directive to define processor
	#include <p16F628A.inc>       		; processor specific variable definitions

	errorlevel  2            			; suppress message 302 from list file

	__CONFIG   _CP_ON & DATA_CP_ON & _LVP_OFF & _BOREN_ON & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 
;=======================================================================================================
#define		yarcost		0	; выбор типа индикации 0 - обычная/ 1 - с транзисторными ключами увеличенная яркость
;=======================================================================================================
	cblock	0x020
;================================	
r_PORTB							; виртуальные регистры портов
d_PORTB							;	
d_PORTA							;

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

perem1							; 
perem2							; 
perem5							; 

reg_ind							; регистр индикации выбора знакоместа
b_zad_ind						; переменная длительности индикации
;================================
cher300_10						; 
cher02							; 
;cher05							; 
;chet_10						; счетчик делитель длительности до 1 Гц
;cher60m						; счетчик делитель длительности до 1 мин
;================================
flag_i1							; флаги индикации
flag_i2							; флаги индикации
flag_1							; флаги управления
flag_2							; флаг выбора параметров настройки регулятора
flag_3							; флаги управления
flag_4							; флаги управления
flag_5
;================================
;period							; период измерения давления
avtovyh							; переменная автовыхода из режима настройки
;================================
adr_e							; переменные для работы с EEPROM
data_e							; 
chtteep						    ; счетчик программы работы с EEPROM
;================================
uskor                     		; переменные обработки скорости автоповтора нажатия клавиш
uskor_1                     	;
;========================================
;================================
;переменные сохраняемые в памяти EEPROM
;========================================
flag_0							;* флаги состояния работы контроллера
Te_zad_hi,Te_zad_lo				;* Задание уровня температуры
Gi_zad_lo						;* Зона ГИСТЕРЕЗИСА
Up_alr_hi,Up_alr_lo				;* Верхний аварийный уровень
Dn_alr_hi,Dn_alr_lo				;* Нижний аварийный уровень
Vr_zak_hi,Vr_zak_lo				;* Время задежки автоконтроля параметров среды с момента включения или смены параметра
Vr_pov_hi,Vr_pov_lo				;* Время задержки повторного запуска компрессора

end_stek						;*
;========================================
Vr_cak_hi,Vr_cak_lo				; Счетчик задежки автоконтроля параметров среды с момента включения или смены параметра
Vr_cpo_hi,Vr_cpo_lo				; Счетчик задежки 
;========================================
; регистры программы десятичного преобразования
;========================================
; служебные
flag_s							; 
count							; 
temp							; 
R3								; 
R2								; 
R1								; 
R0								; 
; входные
binu							; 
binh							; 
binl							; 
; выходные
edin							; единицы
dest							; десятки
sotn							; сотни
tysc							; тысячи
dtys							; дестки тысяч
stys							; сотни тысяц
mlon							; милионы
;========================================
;========================================
; переменные программы сравнения 16 битных чисел
peAsh							; число_А 
peAsl							; 
peBsh							; число_Б 
peBsl							; 
regsr							; 
flag_srv						; 
;========================================

;========================================
schet_sim1						; счетчик цикла вывода
schet_sim2						; счетчик выбора символа
;===================================
TEMP_HI
TEMP_LO
COM_REG
TEMP0 
TEMP1
t_binu
t_binh
t_binl
T_izm_hi					   	; измерянная температура
T_izm_lo					  	;
;========================================
T_min_hi					   	; минимальная температура
T_min_lo					  	;
T_max_hi					   	; максимальная температура
T_max_lo					  	;
;========================================
timerv					  		; таймер задежки в хода в режим настройки
;========================================
	endc
;========================================
	cblock	0x07d	
;================================
w_temp                     		; variable used for context saving 
status_temp                		; variable used for context saving
pclath_temp        	  			; variable used for context saving
;=================================
	endc
;========================================
	cblock	0x0A0
	endc	
;========================================


;===========================================================================================
;===========================================================================================
; описание портов подключения датчиков (датчики должны быть подключены к одному порту)
#define		TRISDAL	TRISA		; регистр управления порта ДАЛЛАСА
#define		PORTDAL	PORTA		; регистр данных порта ДАЛЛАСА
#define		LINE	3			; линия порта ДАЛЛАСА1
#define		DALLAS	PORTA,3		; шина связи с ДАЛЛАСОМ1
;===========================================================================================
; описание портов индикации
#define		S_A		d_PORTB,1	; сегмент А
#define		S_B		d_PORTB,2	; сегмент B
#define		S_C		d_PORTB,3	; сегмент C	
#define		S_D		d_PORTB,4	; сегмент D
#define		S_E		d_PORTB,5	; сегмент E 
#define		S_F		d_PORTB,6	; сегмент F
#define		S_G		d_PORTB,7	; сегмент G
#define		S_H		d_PORTA,6	; сегмент H

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

	if yarcost == 0
; упраляющие байты для работы программы индикации
; порт А
#define		CL_PA	b'00011001'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PA	b'10000110'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
; порт В
#define		CL_PB	b'00000001'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PB	b'00000000'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
	else
; упраляющие байты для работы программы индикации
; порт А
#define		CL_PA	b'00011001'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PA	b'00000000'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
; порт В
#define		CL_PB	b'00000001'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PB	b'00000000'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
;//---------------------------------------------
; для работы с транзисторными ключами #define	SE_PA	b'00000000'	; биты управления разрядами в "0"
; для работы с транзисторными ключами SOT/DES/EDI биты управления разрядами в "1" (в программе индикации)
;===========================================================================================
	endif
; описание портов клавиатуры
#define		RB_1	PORTB,1		; клавиша функция

#define		RB_2	PORTB,2		; клавиша функция (главная)
#define		RB_3	PORTB,3		; клавиша меньше
#define		RB_4	PORTB,4		; клавиша больше
#define		RB_5	PORTB,7		; клавиша функция (управление ручной режим и сброс максим)

#define		RB_6	PORTB,6		; клавиша функция

#define		PORTKN	b'11111110'	; описание расположения портов кнопок

;===========================================================================================
;===========================================================================================
#define		INDK	flag_0,0	; режим "Индикатор температуры"
#define		NAGR	flag_0,1	; режим "Нагреватель"
#define		HOLD	flag_0,2	; режим "Охладитель"
#define		RUCH	flag_0,3	; режим "Ручной режим работы"
;=================================
#define		B_MIG	flag_1,0	; бит мигания (1 потушен, 0 горит)
#define		UST		flag_1,1	; бит режима настройки регулятора
#define		vp_rp	flag_1,2	; бит режима 0-выбор параметра, 1-коррекция параметра
#define		LE_RI	flag_1,3	; бит направления сдвига
#define		CON		flag_1,4	; бит цикл конвертирования температуры
#define		GAIN	flag_1,5	; бит гашения индикации
#define		BOJID	flag_1,6	; бит
;=================================
; биты программы настройки регулятора
#define		REGRA	flag_2,0	; бит выбора режима работы регулятора
#define		TMZAD	flag_2,1	; бит задания температуры регулирования
#define		GIZAD	flag_2,2	; бит задания гистерезиса
#define		HIALR	flag_2,3	; бит настройки вернего уровня автокконтроля температуры
#define		LOALR	flag_2,4	; бит настройки нижнего уровня автокконтроля температуры
#define		VRZDR	flag_2,5	; бит задежки включения режима автоконтроля
#define		VRPZK	flag_2,6	; бит времени повторного запуска компрессора
#define		PROIZ	flag_2,7	; данные о изготовителе
;=================================
#define		kl_no	flag_3,0	; бит удержания клавиши
#define		RELE1	flag_3,1	; линия реле 
#define		RELE2	flag_3,2	; линия реле 
#define		E_data	flag_3,3	; флаг ошибки данных
#define		MINUS	flag_3,4	; бит измерения отрицательных температур
#define		ERROR_D	flag_3,5	; авария датчика температуры
#define		oh_te	flag_3,6	; показания датчика температуры выходят за разрешенные пределы
;=================================
#define		MINUS_d	flag_4,0	; бит измерения отрицательных температур
#define		B24		flag_4,1	;
#define		BTE		flag_4,2	; бит гашения первых нулей до 00
#define		BTE0_00	flag_4,3	;
#define		BRACON	flag_4,4	; бит разрешения автоконтроля
#define		zad_op	flag_4,5	; бит разрешения 
#define		Ind_MIN	flag_4,6	; индикация минимальной температуры
#define		Ind_MAX	flag_4,7	; индикация максимальной температуры
;=================================
#define		f_RB_2	flag_5,0	;
#define		f_RB_4	flag_5,1	;
#define		f_RB_3	flag_5,2	;
#define		f_RB_5	flag_5,3	;
;=================================
; биты программы индикации
#define		TOCHKA1	flag_i2,0	; бит индикации десятичной точки
#define		TOCHKA2	flag_i1,1	; 
#define		TOCHKA3	flag_i1,2	; 
#define		TOCHm1	flag_i1,3	; бит мигания десятичной точки
#define		TOCHm2	flag_i1,4	; 1 - мигает с частотой 2 гц.
#define		TOCHm3	flag_i1,5	; 0 - горит постоянно
#define		RAZR1	flag_i1,6	; бит мигания разряда индикатора
#define		RAZR2	flag_i1,7	; 0 - горит постоянно
#define		RAZR3	flag_i1,0	; 1 - мигает с частотой 2 гц.
;=================================
; биты программы сравнения
#define		RAV		flag_srv,0		; бит сравнения =
#define		BOL		flag_srv,1		; бит сравнения >
#define		MEN		flag_srv,2		; бит сравнения <
#define		BOL_RAV	flag_srv,3		; бит сравнения >=
#define		MEN_RAV	flag_srv,4		; бит сравнения <=
;=================================

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

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

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

			clrf	STATUS				; выбор банка 0
;===============================================
			bcf		T1CON,TMR1ON		; таймер выключен,
			bcf		PIR1,TMR1IF			; сбросить флаг прерывания от модуля TMR1
			movlw	0xfe				; делитель до 300 Гц
			movwf	TMR1H				; неоюходимо предустановить счетчик
			movlw	0x5e				; для дополнительного деления до 300 гц
			movwf	TMR1L				; (65535 - ((4 000 000/4)/8)/300) 
;============== период 	300 Гц	
;========================================================================== 
;==============	программа формирования задежки индикации символов
			movf	b_zad_ind,f			; проверить время задежки вышло
			BZ		$+2					;
			decf	b_zad_ind,f			; 
;==============	программа обслуживания работы индикатора
			call	indic				;
;========================================================================== 
			decfsz	cher300_10,f		; счетчик делитель длительности до 10 Гц 
			goto	end_pr				; 
			movlw	.150				; .30 если достигнут ноль востановить счетчик
			movwf	cher300_10			;
;========================================================================== 
;======== период 	10 Гц		
;========================================================================== 
;			decfsz	cher05,f			; счетчик делитель длительности до 2 Гц 
;			goto	end_pr				; 
;			movlw	.5					; если достигнут ноль востановить счетчик
;			movwf	cher05				;
;========================================================================== 
;============== период 	2 Гц
			btfss	B_MIG				; цикл управления прерывистой индикацией
			goto	$+3					;
			bcf		B_MIG				;
			goto	$+2					;
			bsf		B_MIG				;
;========================================================================== 			
			decfsz	cher02,f			; счетчик делитель длительности до 1 Гц 
			goto	end_pr				; 
			movlw	.2					; если достигнут ноль востановить счетчик
			movwf	cher02				; период 1 Гц
;==========================================================================
;============== период 	1 Гц start		;				
			;==============	
			movf	timerv,f		; таймер задежки ввхода в режим программирования
			btfss	STATUS,Z		;
			decf	timerv,f		; 			
			;==============	
			;==============		отсчет времени задекжки атоконтроля	
			movf	Vr_cak_hi,f		; 
			btfss	STATUS,Z		; 
		goto	decfvrem			; 
			movf	Vr_cak_lo,f		; 
			btfss	STATUS,Z		; 
		goto	decfvrem			; 
			bsf		BRACON			; 			
		goto	end_decfvrem	
decfvrem			
			movlw	.1				;
			subwf	Vr_cak_lo,f		;
			btfss	STATUS,C		;
			decf	Vr_cak_hi,f		;			
end_decfvrem
			;==============			
			;==============		отсчет времени повторного пуска	
			movf	Vr_cpo_hi,f		; 
			btfss	STATUS,Z		; 
		goto	decf_open			; 
			movf	Vr_cpo_lo,f		; 
			btfss	STATUS,Z		; 
		goto	decf_open			; 
			bsf		zad_op			; 			
		goto	end_decf_open	
decf_open			
			movlw	.1				;
			subwf	Vr_cpo_lo,f		;
			btfss	STATUS,C		;
			decf	Vr_cpo_hi,f		;			
end_decf_open
			;==============				
			;==============			;
			movf	avtovyh,f		; отсчет времени 
			SKPNZ					;
		goto	chet_1mi_m			;
			decfsz	avtovyh,f		;
		goto 	chet_1mi_m			;
			call	resautoexit
			;==============			;
;===============================================				
chet_1mi_m							;	
;===============================================
;==========================================================================
;============== период 	1 Гц end
;=================================
;=================================
;=================================
;=================================
end_pr
			bsf		T1CON,TMR1ON	; таймер включен,

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

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


;============================================================================================
; очистка памяти данных
main		movlw	0x5				; банк 0
			movwf	FSR				; 
ClfMem		clrf	INDF			; 
			incf	FSR,f			; 
			movlw	0x80			;
			subwf	FSR,w			;
			BNZ 	ClfMem			;
			clrf	INDF			; 			
;============================================================================================
;============================================================================================
;инициализация процессора
			clrwdt					; сброс сторожевого таймера++++++
;====================================
			movlw	0x07			; 0x07 код
			movwf	CMCON			; отключить компараторы
;====================================
			bsf		STATUS,RP0		; выбор банка 1
			movlw	b'00001111'		; загрузить константу (включить подтяг. резисторы, предделитель на WDT, коэф. 1:128)
			movwf	OPTION_REG		; 
;====================================
			movlw	b'00001000'		;  настройка портов A и В R0 на вход, остальные на выход
			movwf	TRISA			;
;			clrf	TRISA			; 
			clrf	TRISB			; 

;==================================== 			
		; настройка таймера	TMP1	; 
			bcf		STATUS,RP0		; выбрать банк 0
			movlw	b'00110001'		; таймер включен, предделитель 4 мг = 1:8 - 125 000 гц
			movwf	T1CON			;
;============================================================================================
			call	vost_data		; востановление настроек после включения питания
;============================================================================================
		; инициализация переменных
			movlw	SPUAN			;
			movwf	uskor_1			; 
			movwf	uskor			; 
			
			movlw	.2				; счетчик 10 гц выход 1 секунда
			movwf	cher300_10		; 
			movwf	cher02			; 
;			movwf	cher05			; 
			bsf		REGRA			; установить в ход в температура задания
			bcf		LE_RI			; настройка битов клавиш направлений
			bsf		vp_rp			; бит режима 0-выбор параметра
			call	res_init		;
;============================================================================================
		; настройка прерываний
			movlw	b'11000000'		;
			movwf	INTCON			; разрешить прерывания от переферийных устройств
			bsf		STATUS,RP0		; выбор банка 1
			bsf		PIE1,TMR1IE		; разрешить прерывания от TIMER1
			bcf		STATUS,RP0		; выбор банка 0
;============================================================================================
;============================================================================================
	; вход через рестарт регулятора
			bsf		STATUS,RP0			; выбрать банк 1
			movlw	PORTKN				; и настроить порты кнопок на ввод
			movwf	TRISB				; 
			bcf		STATUS,RP0			; выбрать банк 0			

			btfsc	RB_3				;  вход через рестарт регулятора 
		goto	endres					; 
			call	zaderj				; вызов подпрограммы задержки
			btfss	RB_3				; 			
		goto	vos_data				; 
endres			
			bsf		STATUS,RP0			; выбрать банк 1
			clrf	TRISB				; и настроить все линии порта на вывод 
			bcf		STATUS,RP0			; выбрать банк 0
;============================================================================================			
;============================================================================================
		; операции индикации состояния и задания регулятора
			call	celsio				;
			;==============				;
			movlw	.0					; 
			call	big_str				; бегущая строка CH-25xx
			call 	och_left			; очистка индикатора
	
			call	celsio				;
			bsf		Ind_MIN				;
			bsf		Ind_MAX				;
			call	restem				; сбос минимаксов к текущей температуре
;============================================================================================

;============================================================================================
; цикл работы регулятора
ind			clrwdt						; сброс сторожевого таймера++++++
			;==============				;
			call	kondosdata			; 
			;==============				;		
			bcf	INTCON,GIE
			call	celsio				; измерение температуры
			bsf	INTCON,GIE
			;==============				;
;========================================
			movf	T_izm_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_izm_hi,w			;
			movwf	peAsh				;			
			movf	T_max_lo,w			;
			movwf	peBsl				; сравнение данных на превышение максим	
			movf	T_max_hi,w			;
			movwf	peBsh				;			
 			call    sravnenie			;
			btfss	BOL					; измерение  больше задания включить вентилятор
		goto	$+.5					;
			movf	T_izm_lo,w			; 
			movwf	T_max_lo			; сохранить в переменной текущей температуры
			movf	T_izm_hi,w			; 
			movwf	T_max_hi			; сохранить в переменной текущей температуры
;========================================
			movf	T_min_lo,w			;
			movwf	peBsl				; сравнение данных на превышение максим	
			movf	T_min_hi,w			;
			movwf	peBsh				;			
 			call    sravnenie			;
			btfss	MEN					; измерение  больше задания включить вентилятор
		goto	$+.5					;
			movf	T_izm_lo,w			; 
			movwf	T_min_lo			; сохранить в переменной текущей температуры
			movf	T_izm_hi,w			; 
			movwf	T_min_hi			; сохранить в переменной текущей температуры			
;========================================
			btfsc	Ind_MIN				; 
		goto	immi					; 
			btfsc	Ind_MAX				; 		
		goto	imma					; 
			movfw	T_izm_hi			; 			
			movwf	binh				; 
			movfw	T_izm_lo			; 				
		goto	itegc			
immi		movfw	T_min_hi			; 			
			movwf	binh				; 
			movfw	T_min_lo			; 				
		goto	itegc			
imma		movfw	T_max_hi			; 			
			movwf	binh				; 
			movfw	T_max_lo			; 				
itegc		movwf	binl				;
			
			bsf		BTE					;
			call	bin_dec				;
			call	conv_t				;
;========================================			
			call	ind_zad				;
			;==============				;
			movlw	.20					;
			movwf	b_zad_ind			;
			;==============				;
			call	upravlenie			;	(измениться длительность индикации)		
			;==============				;
			call	klava				; 
;--------------------------------------------				
kontr		btfss	UST					; выбор режима работы
			goto	ind					; режим индикации и регулирования/режим установки
;--------------------------------------------
; цикл настройки регулятора
nast	
			;==============				;		
			bcf	INTCON,GIE
			call	celsio				; измерение температуры
			bsf	INTCON,GIE
			;==============				; 
			clrwdt						; сброс сторожевого таймера++++++
			call	upravlenie			;
			movfw	uskor				;
			movwf	b_zad_ind			;
			call	ind_zad				; 			
			call	klava				; 
		goto	kontr					; 
;============================================================================================


;============================================================================================
restem				; сбос минимаксов к текущей температуре
			btfss	Ind_MIN				; 
		goto	$+.6					; 
			movf	T_izm_lo,w			; 
			movwf	T_min_lo			; 
			movf	T_izm_hi,w			; 
			movwf	T_min_hi			;
			bcf		Ind_MIN				;
			
			btfss	Ind_MAX				; 
	return								; 
			movf	T_izm_lo,w			; 
			movwf	T_max_lo			;
			movf	T_izm_hi,w			; 
			movwf	T_max_hi			;
			bcf		Ind_MAX				;
	return
;============================================================================================
upravlenie								;программа управления работой контроллера
;============================================================================================
;============================================================================================
;======================================= режим регулирования
			btfsc	ERROR_D				; проверка исправности датчика температуры
		return							;
;			btfsc	UST
;		return			
			btfsc	NAGR				; работать только в режимах нагревателя или холодильника.
		goto	upra					; 
			btfsc	HOLD				; 
		goto	upra					; 
			btfsc	RUCH
		return							; 
			bcf	RELE1					; 
			bcf	RELE2					; 
		return							; 			
;======================================= 
upra		clrf	peBsh				; 
			movf	T_izm_lo,w			;
			movwf	peAsl				; сравнение данных на превышение максим	
			movf	T_izm_hi,w			;
			movwf	peAsh				;			
			movf	Gi_zad_lo,w			; добавить значение гистерезиса к температуре установки
			addwf	Te_zad_lo,w			;
			movwf	peBsl				; загрузка данных
			btfsc	STATUS,C			; 
			incf	peBsh,f				; 
			movf	Te_zad_hi,w			;
			addwf	peBsh,f				; загрузка данных
 			call    sravnenie			;
			btfsc	BOL_RAV				; измерение  больше задания включить вентилятор
		goto	off_re					;
				
			movf	Te_zad_hi,w			;
			movwf	peBsh				; загрузка данных			
			movf	Gi_zad_lo,w			; добавить значение гистерезиса к температуре установки
			subwf	Te_zad_lo,w			;
			movwf	peBsl				; загрузка данных
			btfss	STATUS,C			; 
			decf	peBsh,f				; 
 			call    sravnenie			;
			btfss	MEN_RAV				; измерение  больше задания включить вентилятор
		goto	control					; 
			btfsc	HOLD				;			
		goto	bcre					; 
bsre		bsf		RELE1				; включить
rein		bcf	RAZR1					; 
			bcf	RAZR2					; 
			bcf	RAZR3					; 
		goto	control					; 
off_re									; 
			btfss	HOLD				;
		goto	bcre					; 
			btfsc	zad_op				; 
		goto	bsre					; 	
			btfsc	UST					; отключить мигание индикатора в режиме настройки		
		goto	rein					; 
			bsf	RAZR1					; 
			bsf	RAZR2					; 
			bsf	RAZR3					; 
		goto	control					; 
bcre		btfss	RELE1				; 
		goto	rein					; 
			bcf		RELE1				; выключить;
			bcf		zad_op				; 	
			movfw	Vr_pov_hi			;
			movwf	Vr_cpo_hi			; 
			movfw	Vr_pov_lo			;
			movwf	Vr_cpo_lo			; 			
;	return								; 
;============================================================================================
control		; контроль поведения параметра регулируемой среды
			; выход за допуспимые пределы и времени входа в заданные параметры
			movf	Vr_zak_hi,f			; 
			btfss	STATUS,Z			; 
		goto	rong					; 
			movf	Vr_zak_lo,f			; 
			btfss	STATUS,Z			; 
		goto	rong					; 
	return								; функция деактивирована
;========================================
rong
			btfss		BRACON			; 	
	return								; время задежки не вышло
;========================================
			movfw	T_izm_hi			; сравнение данных на превышение максим	
			movwf	peAsh				; измеряемая температура не должна превышать
			movfw	T_izm_lo			; 
			movwf	peAsl				;
			
			movfw	Up_alr_hi			;
			movwf	peBsh				; 
			movfw	Up_alr_lo			; 
			movwf	peBsl				;
			call	sravnenie			;
			btfss	MEN					;
		goto	alr_d2					;

			movfw	Dn_alr_hi			;
			movwf	peBsh				; 
			movfw	Dn_alr_lo			; 
			movwf	peBsl				;
			call	sravnenie			;
			btfss	BOL					;
		goto	alr_d2					;
			bcf		RELE2				; otключить реле аварии
	return								; 
alr_d2
			bsf		RELE2				; включить реле аварии
			btfsc	UST
		return	
			movlw	.48 				; 
			call	big_str				; температура вне допустимой зоны
			call 	och_left			; очистка индикатора
			movlw	.255				; увеличенная задежка индикации
			movwf	b_zad_ind			;
	return								; 				
;============================================================================================
;============================================================================================
klava		; программа обработки нажатия клавиш
			bsf		STATUS,RP0			; выбор банка 1
			movlw	PORTKN				; и настроить порты кнопок на ввод
			movwf	TRISB				; 
			bcf		STATUS,RP0			; выбор банка 0
;==================================== !!!!!!!!
;			call	zaderj				; вызов подпрограммы задержки
										; необходимая для установки уровней сигналов на входах
;====================================
			btfsc	RB_2				; клавиша функция 
		goto	t_PB3					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_2				; для гашения дребезга контактов			
		goto	end_kl_call				; 
			bcf		f_RB_2				;
;====================
			btfss	UST					;
		goto	ojidan					;
			btfsc		vp_rp			; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf			vp_rp			; установить режим коррекции параметров для кнопок < >
		goto	$+2						; 
			bcf			vp_rp			; установить режим вывора функций для кнопок < >
vyb_re	
			call	vyb_fun				; 
		goto	end_kl_call				; 
;====================
ojidan		btfsc	BOJID				; таймер ожидания режима настройки
		goto	ojidan2					; 
			bsf		BOJID				; инициализация режима задержки
			movlw	ZADVH				; входа в режим настройки
			movwf	timerv				; 
			bcf		RELE2				; (сброс сигнал аварии ДТ)
		goto	end_kl_call				; 			
ojidan2
			movf	timerv,f			; проверка таймера
			btfss	STATUS,Z			; 
		goto	end_kl_call				; 
			bsf		UST					; если клавиша удерживается более 10 сек
		goto	end_kl_call				; перейти в режим настройки регулятора
;====================================		
t_PB3		btfsc	RB_3				; клавиша меньше 
		goto	t_PB2					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_3				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_3				;
;====================
			btfss	UST					;
		goto	in_temin				;
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bcf		LE_RI				; выбор направления вывора функций. только когда настроена выбор функции
	goto	vyb_re						; 
			call	ustanov				; 
		goto	end_kl_call				; 
;====================================	
t_PB2		btfsc	RB_4					; клавиша больше 
		goto	t_PB4					;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_4					; 			
		goto	end_kl_call				; 			
			bcf		f_RB_4				;
;====================			
			btfss	UST					;
		goto	in_temax				;
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf		LE_RI				; выбор направления вывора функций
		goto	vyb_re					; 
			call	ustanov				; 
		goto	end_kl_call				; 
;====================================
;====================================
t_PB4		btfsc	RB_5					; клавиша больше 
		goto	end_klava				;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_5					; 			
		goto	end_kl_call				; 			
			bcf		f_RB_5				;
;====================			
			btfsc	Ind_MAX				; если индикация минимакса функция ресета 
		goto	trote					; 
			btfsc	Ind_MIN				; 			
		goto	trote					; 
			btfss	RUCH				; если ручной режим управление реле
		goto	trote					; 
			btfsc	kl_no			
		goto	vyh						;
			btfss	RELE1				; 
		goto	$+4						; 
			bcf		RELE1				; 
			bsf		kl_no				; бит клавиша нажата
		goto	end_kl_call				; 
			bsf		RELE1				; 								
			bsf		kl_no				; бит клавиша нажата
		goto	end_kl_call				; 			
trote		call	restem				; сбос минимаксов к текущей температуре 
			bsf		kl_no				; бит клавиша нажата
		goto	end_kl_call				; 
;====================================
in_temin	bcf		Ind_MAX				; 
			bsf		Ind_MIN				; 
			movlw	b'00010000'			; "_" 
		goto	inhre					; 
;====================================
in_temax	bcf		Ind_MIN				; 	
			bsf		Ind_MAX				; 

			movlw	b'00000010'			; "-" 
inhre		movwf	ind_2				; 
			movlw	b'00000000'			; "" 
			movwf	ind_3				; 
			movlw	ct 					; 
			movwf	ind_1				; 

			clrf	flag_i2				; 
			clrf	flag_i1				; 
			bsf		STATUS,RP0			; выбор банка 1
			clrf	TRISB				; и настроить все линии порта на вывод 
			bcf		STATUS,RP0			; выбор банка 0

			movlw	.255				;
			movwf	b_zad_ind			;
			call	ind_zad				;
			movlw	DIND				; перезагрузить пепеременную автовыхода
			movwf	avtovyh				; 
		goto	end_kl_call				; 
;====================================
end_klava
			bcf		BOJID				;
			bcf		kl_no				; сбросить бит нажатия клавиши			
			movlw	SPUAN				; инициализация длительности свечения
			movwf	uskor_1				; 
			movwf	uskor				;
		goto	end_kl_call				; 
;====================================
vyh		;	нажатия двойные
			btfss	UST					;
		goto	end_kl_call				; 
			btfsc	vp_rp				; проверить система находится в режиме выбора функции
		goto	end_vyh1				; 
			btfsc	RB_5				; если удерживаю PB3+PB1		
		goto	end_vyh1				; 
			btfsc	RB_2				; 
		goto	end_vyh1				; 			
			;==============				; принудительный выход из режима настройки
			clrf	avtovyh				; 
			call	resautoexit
			;==============				;
		goto	end_kl_call				; 
;====================================
end_vyh1
			movlw	.5					; 
			subwf	uskor_1,w			; проверка достижения переменной величины 1
			BZ		end_vyh2			;	
			decfsz	uskor,f				; 
		goto	end_kl_call				; 
			decf	uskor_1,f			; 
			movfw	uskor_1				; 
			movwf	uskor				; 
end_vyh2								;			
			bcf		kl_no				;				
end_kl_call								;	
			movlw	0xff				;
			movwf	flag_5				; сброс флагов кнопок (уст в "1")
						
			bsf		STATUS,RP0			; выбор банка 1
			clrf	TRISB				; и настроить все линии порта на вывод 
			bcf		STATUS,RP0			; выбор банка 0
	return								;
;============================================================================================
resautoexit
			btfsc	Ind_MIN				;
		goto	res_init0				;
			btfsc	Ind_MAX				;		
		goto	res_init0				;

			bsf		GAIN				; гашение индикации
			call	indic				; 
			call	zap_eeprom			; записать в память заводские установки
			bcf		GAIN				; включить индикацию
		
			bcf		UST					; бит режима настройки регулятора
			clrf	flag_2				; очистить флаг выбора параметра			
			bsf		REGRA				; установить в ход в температура задания
			bsf		vp_rp				; бит режима 0-выбор параметра		
			bcf		LE_RI				; настройка битов направлений
res_init	movfw	Vr_zak_hi			;
			movwf	Vr_cak_hi			; 
			movfw	Vr_zak_lo			;
			movwf	Vr_cak_lo			; 
			movfw	Vr_pov_hi			;
			movwf	Vr_cpo_hi			; 
			movfw	Vr_pov_lo			;
			movwf	Vr_cpo_lo			;
			bcf		zad_op				;			
			bcf		BRACON				; 
res_init0			
			bcf		Ind_MIN				; 
			bcf		Ind_MAX				; 
	return								; 
;============================================================================================
zaderj				; вызов подпрограммы задержки
			movlw	.50					;	.50	.200
			movwf	TEMP0				; 
			decfsz	TEMP0,f				; 
			goto	$-1					; 		
		return							; 		
;============================================================================================
;============================================================================================						
; выбор функции настройки регулятора
vyb_fun
;====================================
			bsf		STATUS,RP0		; выбор банка 1
			clrf	TRISB			; и настроить все линии порта на вывод 
			bcf		STATUS,RP0		; выбор банка 0
			
			bsf		kl_no			; бит клавиша нажата
			bsf		UST				; 
			
			clrf	flag_i1			; сброс спец индикации 	
			
			bcf		Ind_MIN			; 
			bcf		Ind_MAX			; 
			
			movlw	DIND			; перезагрузить пепеременную автовыхода
			movwf	avtovyh			; 
;====================================
			btfss	vp_rp			; если сброшен индицировать назавание параметра
		goto	pr_pr				; если установлен его значение			
			btfsc	REGRA			; режим работы регулятора 1-включен 0-выключен (индикатор давления) 
		goto	REGRA_f				; 
			btfsc	TMZAD			; Задание величины давления регулирования
		goto	TMZAD_f				; 
			btfsc	GIZAD			; Задание зоны пропорциональности
		goto	GIZAD_f				; 
			btfsc	HIALR			; Задание периода подстройки точности давления  
		goto	HIALR_f				; 			
			btfsc	LOALR			; Задание коэффициентов
		goto	LOALR_f				; 
			btfsc	VRZDR			; 
		goto	VRZDR_f				; 
			btfsc	VRPZK			; 
		goto	VRPZK_f				; 			
			btfsc	PROIZ			; Индикация телефона изготовителя
		goto	PROIZ_f				; 			
		goto	REGRA_f				; 						
;=================================
pr_pr								; 		
			btfsc	LE_RI			;
		goto	prev				; 	 
			btfsc	REGRA			; циклический переключатель флагов
		goto	TMZAD_f				; 
			btfsc	TMZAD			; 
		goto	GIZAD_f				; 
			btfsc	GIZAD			; 
		goto	HIALR_f				; 
			btfsc	HIALR			; 
		goto	LOALR_f				; 
			btfsc	LOALR			; 
		goto	VRZDR_f				; 
			btfsc	VRZDR			; 
		goto	VRPZK_f				; 
			btfsc	VRPZK			; 
		goto	PROIZ_f				; 			
		goto	REGRA_f				; настройки температуры задания
;=================================
prev		btfsc	REGRA			; циклический переключатель флагов
		goto	PROIZ_f				; 
			btfsc	PROIZ			; 
		goto	VRPZK_f				; 
			btfsc	VRPZK			; 
		goto	VRZDR_f				; 
			btfsc	VRZDR			; 
		goto	LOALR_f				; 
			btfsc	LOALR			; 
		goto	HIALR_f				; 
			btfsc	HIALR			; 
		goto	GIZAD_f				; 
			btfsc	GIZAD			; 
		goto	TMZAD_f				; 			
		goto	REGRA_f				; настройки температуры задания
;===============================================
	; данные о изготовителе
PROIZ_f		movlw	b'10000000'		; 
			movwf	flag_2			;
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	PROIZ_d				; если установлен его значение
			movlw	.69				; тел. изготовителя
		goto	end_vybor_f			; 
PROIZ_d		movlw	.19				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка
			movlw	.69				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка	
	return							; 
;===============================================
;===============================================
		; бит времени повторного запуска компрессора
VRPZK_f		movlw	b'01000000'
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	VRPZK_d				; если установлен его значение
			movlw	.81				;  Uco ---
		goto	end_vybor_f			; 
VRPZK_d		
			movfw	Vr_pov_hi		; 
			movwf	binh			; 
			movfw	Vr_pov_lo		; 
;			movwf	binl			;  
		goto	frfr			 			
;===============================================
;===============================================
		;бит задежки включения режима автоконтроля
VRZDR_f		movlw	b'00100000'
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	VRZDR_d				; если установлен его значение
			movlw	.77				;  UAc ---
		goto	end_vybor_f			; 
VRZDR_d		
			movf	Vr_zak_hi,f		; 
			btfss	STATUS,Z		; 
		goto	infzn				; 
			movf	Vr_zak_lo,f		; 
			btfss	STATUS,Z		; 
		goto	infzn				; 
			movlw	c0				; символ O
			movwf	ind_1			;
			movlw	cF				; символ F
			movwf	ind_2			;			
			movlw	cF				; символ F
			movwf	ind_3			;
	return							; 
					
infzn		movfw	Vr_zak_hi		; 
			movwf	binh			; 
			movfw	Vr_zak_lo		; 
frfr		movwf	binl			; 
			bcf		TOCHKA2			;
			bcf		BTE				; индикация без нулей впереди
			call    bin_dec			; 

			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
			movwf	ind_1			;
	return							; 
;===============================================
;===============================================
		; бит настройки нижнего уровня автоконтроля температуры
LOALR_f		movlw	b'00010000'
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	LOALR_d				; если установлен его значение
			movlw	.65				; t__ ---
		goto	end_vybor_f			; 
LOALR_d		
			movfw	Dn_alr_hi		; 
			movwf	binh			; 
			movfw	Dn_alr_lo		; 
		goto	ind_tena			; 
;===============================================
	; бит настройки вернего уровня автоконтроля температуры	 
HIALR_f		movlw	b'00001000'		; 
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	HIALR_d				; если установлен его значение
			movlw	.61				; t--
		goto	end_vybor_f			; 
HIALR_d		
			movfw	Up_alr_hi		; 
			movwf	binh			; 
			movfw	Up_alr_lo		; 
		goto	ind_tena			; 
;===============================================
	; бит задания гистерезиса
GIZAD_f		movlw	b'00000100'		; 
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	GIZAD_d				; если установлен его значение
			movlw	.57				; gic
		goto	end_vybor_f			; 
GIZAD_d		
			clrf	binh			; 
			movfw	Gi_zad_lo		; 
		goto	ind_tena			; 
;===============================================
		; бит задания температуры регулирования
TMZAD_f		movlw	b'00000010'		; 
			movwf	flag_2			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	TMZAD_d			; если установлен его значение
			movlw	.53				; tuc
		goto	end_vybor_f			; 
TMZAD_d		
			movfw	Te_zad_hi		; 
			movwf	binh			; 
			movfw	Te_zad_lo		; 
ind_tena	movwf	binl			; 
			bsf		BTE				; 
			call    bin_dec			; 
			bsf		TOCHKA2			;
		goto	p_ind_r1			; 
;===============================================
		; бит выбора режима работы регулятора
REGRA_f		movlw	b'00000001'		; 
			movwf	flag_2			; индикация режима работы регулятора
			btfsc	vp_rp			; если сброшен индицировать название параметра
		goto	REGRA_d				; если установлен его значение
			movlw	.73				; 		
		goto	end_vybor_f			; 
REGRA_d		btfss	INDK			; индикатор температуры
		goto	i_NAGR				; 
			movlw	ci				; символ i 
			movwf	ind_1			;
			movlw	cn				; символ n
			movwf	ind_2			;			
			movlw	cd				; символ d
		goto	vin3				; 
i_NAGR		btfss	NAGR			; регулятор нагреватель 
		goto	i_HOLD
			movlw	cH				; символ H
			movwf	ind_1			;
			movlw	co				; символ o
			movwf	ind_2			;			
			movlw	cr				; символ r
		goto	vin3				;  
i_HOLD		btfss	HOLD			; регулятор охладитель
		goto	i_RUCH
			movlw	cF				; символ F
			movwf	ind_1			;
			movlw	cr				; символ r
			movwf	ind_2			;			
			movlw	ci				; символ i
		goto	vin3				;  
i_RUCH								; ручной режим работы
			movlw	cr				; символ r
			movwf	ind_1			;
			movlw	cY				; символ Y
			movwf	ind_2			;			
			movlw	cc				; символ c
vin3		movwf	ind_3			;
	return							; 
;===============================================
; общие программы режима индикации функций
;===============================================
end_vybor_f							; 
			btfsc	LE_RI			; 
		goto	$+3
			call	big_str			; подпрограмма бегущая строка
	return							;   
			call	big_str_re		; подпрограмма бегущая строка
	return							;  
;============================================================================================
;============================================================================================






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

			btfsc	REGRA			; выбор режима работы регулятора
			goto	u_REGRA			;
						
			btfsc	TMZAD			; задание температуры регулирования
			goto	u_TMZAD			; 
			
			btfsc	GIZAD			; задание гистерезиса
			goto	u_GIZAD			; 
			
			btfsc	HIALR			; настройка вернего уровня автокконтроля температуры
			goto	u_HIALR			; 

			btfsc	LOALR			; настройка нижнего уровня автокконтроля температуры
			goto	u_LOALR			; 
			
			btfsc	VRZDR			; задежка включения режима автоконтроля
			goto	u_VRZDR			; 
			
			btfsc	VRPZK			; время повторного запуска компрессора
			goto	u_VRPZK			; 
	return		
 
;====================================
;выбор режима работы регулятора	
u_REGRA				
			btfsc	f_RB_3			; 
		goto	kk_REGRA			;
			btfss	INDK			;
		goto	$+.4				;
			bcf		INDK			;
			bsf		NAGR			;
	goto	REGRA_d					;
			btfss	NAGR			;
		goto	$+.4				;
			bcf		NAGR			;
			bsf		HOLD			;
	goto	REGRA_d					;				
			btfss	HOLD			;
		goto	$+.4				;
			bcf		HOLD			;
			bsf		RUCH			;
	goto	REGRA_d					;
			btfss	RUCH			;
		goto	$+.4				;
			bcf		RUCH			;
			bsf		INDK			;
	goto	REGRA_d					;

kk_REGRA	btfsc	f_RB_4			; 
	goto	REGRA_d					;	
			btfss	INDK			;
		goto	$+.4				;
			bcf		INDK			;
			bsf		RUCH			;
	goto	REGRA_d					;
			btfss	NAGR			;
		goto	$+.4				;
			bcf		NAGR			;
			bsf		INDK			;
	goto	REGRA_d					;				
			btfss	HOLD			;
		goto	$+.4				;
			bcf		HOLD			;
			bsf		NAGR			;
	goto	REGRA_d					;
			btfss	RUCH			;
		goto	$+.4				;
			bcf		RUCH			;
			bsf		HOLD			;
	goto	REGRA_d					;		
;====================================
; задание температуры регулирования
u_TMZAD
			btfsc	f_RB_4			; + увеличение
		goto	kk_TMZAD			;
			movfw	Up_alr_hi		; tavr veh
			movwf	peAsh			;
			movfw	Up_alr_lo		;
			movwf	peAsl			;
			movfw	Gi_zad_lo		;
			subwf	peAsl			;
			btfss	STATUS,C		;
			decf	peAsh,f			;
			movlw	.10				;
			subwf	peAsl			;
			btfss	STATUS,C		;
			decf	peAsh,f			;			
			
			movf	Te_zad_hi,w		;
			movwf	peBsh			;
			movf	Te_zad_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	TMZAD_d					;
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	umde_TMZAD			;			
			movlw	.1				;
			addwf	Te_zad_lo,f		;
			btfsc	STATUS,C		;
			incf	Te_zad_hi,f		;
	goto	TMZAD_d					;
umde_TMZAD	movlw	.10				;
			addwf	Te_zad_lo,f		;
			btfsc	STATUS,C		;
			incf	Te_zad_hi,f		;
	goto	TMZAD_d					;
kk_TMZAD							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	TMZAD_d					; 
			movfw	Dn_alr_hi		; tavr niz
			movwf	peAsh			;		
			movfw	Dn_alr_lo		;
			movwf	peAsl			;
			movfw	Gi_zad_lo		;
			addwf	peAsl,f			;
			btfsc	STATUS,C		;
			incf	peAsh,f			;
			movlw	.10				;
			addwf	peAsl,f			;
			btfsc	STATUS,C		;
			incf	peAsh,f			;
			
			movf	Te_zad_hi,w		;
			movwf	peBsh			;
			movf	Te_zad_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	TMZAD_d					;
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	uvde_TMZAD			;
			movlw	.1				;
			subwf	Te_zad_lo,f		;
			btfss	STATUS,C		;
			decf	Te_zad_hi,f		;
	goto	TMZAD_d					;
uvde_TMZAD	movlw	.10				;
			subwf	Te_zad_lo,f		;
			btfss	STATUS,C		;
			decf	Te_zad_hi,f		;
	goto	TMZAD_d					;
;====================================
; задание гистерезиса (0 - 5.0)
u_GIZAD
			btfsc	f_RB_4			; + увеличение
		goto	kk_GIZAD			;


			movfw	Te_zad_hi		; tavr veh
			movwf	peAsh			;
			movfw	Te_zad_lo		;
			movwf	peAsl			;
			movfw	Dn_alr_lo		;
			subwf	peAsl,f			;
			btfss	STATUS,C		;
			decf	peAsh,f			;
			movfw	Dn_alr_hi		;
			subwf	peAsh,f			;
			movlw	.10				;
			subwf	peAsl,f			;
			btfss	STATUS,C		;
			decf	peAsh,f			;

			movfw	Up_alr_hi		; tavr veh
			movwf	peBsh			;
			movfw	Up_alr_lo		;
			movwf	peBsl			;
			movfw	Te_zad_lo		;
			subwf	peBsl,f			;
			btfss	STATUS,C		;
			decf	peBsh,f			;
			movfw	Te_zad_hi		;
			subwf	peBsh,f			;
			movlw	.10				;
			subwf	peBsl,f			;
			btfss	STATUS,C		;
			decf	peBsh,f			;

			call	sravnenie		;
			btfsc	MEN_RAV			;
		goto	$+.5
			movfw	peBsh			;
			movwf	peAsh			;			
			movfw	peBsl			;
			movwf	peAsl			;
			
			clrf	peBsh			;
			movlw	0xC8			; +20.0
			movwf	peBsl			;
			
			call	sravnenie		;
			btfsc	MEN_RAV			;
		goto	igis
			clrf	peAsh			;
			movlw	0xC8			; +20.0
			movwf	peAsl			;
			
igis		clrf	peBsh			;			
			movf	Gi_zad_lo,w		;
			movwf	peBsl			;

			call	sravnenie		;
			btfss	BOL				;
	goto	GIZAD_d					;
			movlw	.1				;
			addwf	Gi_zad_lo,f		;
	goto	GIZAD_d					; 
kk_GIZAD							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	GIZAD_d					;
			clrf	peAsh			;		
			clrf	peAsl			;
			clrf	peBsh			;
			movf	Gi_zad_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	GIZAD_d					;
			movlw	.1				;
			subwf	Gi_zad_lo,f		;
	goto	GIZAD_d					;
;=========================================
;=========================================
; настройка вернего уровня автоконтроля температуры
u_HIALR
			btfsc	f_RB_4			; + увеличение
		goto	kk_HIALR			;
			movlw	0x04			; +125,0
			movwf	peAsh			;
			movlw	0xe2			;
			movwf	peAsl			;
			
			movf	Up_alr_hi,w		;
			movwf	peBsh			;
			movf	Up_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	HIALR_d					;
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	umde_HIALR			;			
			movlw	.1				;
			addwf	Up_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Up_alr_hi,f		;
	goto	HIALR_d					;
umde_HIALR	movlw	.10				;
			addwf	Up_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Up_alr_hi,f		;
	goto	HIALR_d					;
kk_HIALR							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	HIALR_d					; 
			movfw	Te_zad_hi		; должна быть не ниже Тзад+Тгис+1,0
			movwf	peAsh			;		
			movfw	Te_zad_lo		;
			movwf	peAsl			;
			movfw	Gi_zad_lo		;
			addwf	peAsl,f			;
			btfsc	STATUS,C		;
			incf	peAsh			;
			movlw	.10				; + 1 грд
			addwf	peAsl,f			;
			btfsc	STATUS,C		;
			incf	peAsh,f			;
			
			movf	Up_alr_hi,w		;
			movwf	peBsh			;
			movf	Up_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	HIALR_d					; 
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	uvde_HIALR			;
			movlw	.1				;
			subwf	Up_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Up_alr_hi,f		;
	goto	HIALR_d					;
uvde_HIALR	movlw	.10				;
			subwf	Up_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Up_alr_hi,f		;
	goto	HIALR_d					;
;=========================================
;=========================================
; настройка нижнего уровня автокконтроля температуры
u_LOALR
			btfsc	f_RB_4			; + увеличение
		goto	kk_LOALR			;
			movfw	Te_zad_hi		; ограничение по заданию максимального значения
			movwf	peAsh			; должна быть не выше Тзад-Тгис-1,0
			movfw	Te_zad_lo		; Задание уровня температуры
			movwf	peAsl			;
			movfw	Gi_zad_lo		; отнять гистерезис
			subwf	peAsl,f			;
			btfss	STATUS,C		;
			decf	peAsh,f			;
			
			movlw	.10				; отнять 1 грд
			subwf	peAsl,f			;
			btfss	STATUS,C		;
			decf	peAsh,f			;
			
			movf	Dn_alr_hi,w		;
			movwf	peBsh			;
			movf	Dn_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	LOALR_d					;
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	umde_LOALR			;			
			movlw	.1				;
			addwf	Dn_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Dn_alr_hi,f		;
	goto	LOALR_d					;
umde_LOALR	movlw	.10			;
			addwf	Dn_alr_lo,f		;
			btfsc	STATUS,C		;
			incf	Dn_alr_hi,f		;
	goto	LOALR_d					; 
kk_LOALR							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	LOALR_d					; 
			movlw	0xfd			; -50,0
			movwf	peAsh			;		
			movlw	0xda			;
			movwf	peAsl			;
			movf	Dn_alr_hi,w		;
			movwf	peBsh			;
			movf	Dn_alr_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	LOALR_d					;
			btfsc	TOCHKA3			; переключение набора в зависимости от вида индикации
		goto	uvde_LOALR			;
			movlw	.1				;
			subwf	Dn_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Dn_alr_hi,f		;
	goto	LOALR_d					;
uvde_LOALR	movlw	.10				;
			subwf	Dn_alr_lo,f		;
			btfss	STATUS,C		;
			decf	Dn_alr_hi,f		;
	goto	LOALR_d					;
;=========================================
;=========================================
u_VRZDR	; бит задежки включения режима автоконтроля
			btfsc	f_RB_4			; + увеличение
		goto	kk_VRZDR			;
			movlw	0x03			; 900 cer
			movwf	peAsh			;
			movlw	0x84			;
			movwf	peAsl			;
			
			movf	Vr_zak_hi,w		;
			movwf	peBsh			;
			movf	Vr_zak_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	VRZDR_d					;
			movlw	.1				;
			addwf	Vr_zak_lo,f		;
			btfsc	STATUS,C		;
			incf	Vr_zak_hi,f		;
	goto	VRZDR_d					;
kk_VRZDR							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	VRZDR_d					;
			clrf	peAsh			; 0 cek	- OFF	
			clrf	peAsl			;

			movf	Vr_zak_hi,w		;
			movwf	peBsh			;
			movf	Vr_zak_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	VRZDR_d					;
			movlw	.1				;
			subwf	Vr_zak_lo,f		;
			btfss	STATUS,C		;
			decf	Vr_zak_hi,f		;
	goto	VRZDR_d					;
;=========================================
;=========================================
u_VRPZK	; Время задержки повторного запуска компрессора
			btfsc	f_RB_4			; + увеличение
		goto	kk_VRPZK			;
			movlw	0x03			; 900 cer
			movwf	peAsh			;
			movlw	0x84			;
			movwf	peAsl			;
			
			movf	Vr_pov_hi,w		;
			movwf	peBsh			;
			movf	Vr_pov_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	VRPZK_d					;
			movlw	.1				;
			addwf	Vr_pov_lo,f		;
			btfsc	STATUS,C		;
			incf	Vr_pov_hi,f		;
	goto	VRPZK_d					; 

kk_VRPZK							; 
;			btfsc	f_RB_3			; - уменьшение
;	goto	VRPZK_d					; 
			clrf	peAsh			; 0 cek		
			clrf	peAsl			;
	
			movf	Vr_pov_hi,w		;
			movwf	peBsh			;
			movf	Vr_pov_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	MEN				;
	goto	VRPZK_d					;
			movlw	.1				;
			subwf	Vr_pov_lo,f		;
			btfss	STATUS,C		;
			decf	Vr_pov_hi,f		;
	goto	VRPZK_d					;
;=========================================
;=========================================











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

			movlw	CL_PB			; очистка порта B
			andwf	d_PORTB,f		;			
			movlw	SE_PB			; установка битов разрядов индикации в off
			iorwf	d_PORTB,f		; 
;====================================			
			movfw	d_PORTA			; отключение индикации
			movwf	PORTA			; 
			movfw	d_PORTB			; 
			movwf	PORTB			;   
;====================================
			btfsc	GAIN			; бит гашения индикации
		goto	endgain				; 
			btfsc	r_PORTB,0		; дешифрация символа
			bsf		S_H				; в состояние портов
			btfsc	r_PORTB,1		;
			bsf		S_A				;			
			btfsc	r_PORTB,2		;
			bsf		S_B				;
			btfsc	r_PORTB,3		;
			bsf		S_C				;
			btfsc	r_PORTB,4		;
			bsf		S_D				;
			btfsc	r_PORTB,5		;
			bsf		S_E				;
			btfsc	r_PORTB,6		;
			bsf		S_F				;
			btfsc	r_PORTB,7		;
			bsf		S_G				;			
endgain
	if yarcost == 0
			btfsc	reg_ind,1		; выбор индикации разряда
			bcf		SOT				; 
			btfsc	reg_ind,2		; 
			bcf		DES				; 
			btfsc	reg_ind,0		; 
			bcf		EDI				; 
	else
			btfsc	reg_ind,1		; выбор индикации разряда
			bsf		SOT				; с тразисторами повышанная яркость
			btfsc	reg_ind,2		; 
			bsf		DES				; 
			btfsc	reg_ind,0		; 
			bsf		EDI				; 
	endif
;=====================================
			btfsc	RELE1			; управлением реле нагревателя
		goto	$+3					; 
			bcf		d_PORTB,0		; 
		goto	$+2					; 
			bsf		d_PORTB,0		; 			
;=====================================			
			btfsc	RELE2			; управление реле аварии
		goto	$+3					; 
			bcf		d_PORTA,0		; 
		goto	$+2					; 
			bsf		d_PORTA,0		; 			
;=====================================			
;			btfsc	RELE3			; управление реле аварии
;		goto	$+3					; 
;			bcf		d_PORTA,4		; 
;		goto	$+2					; 
;			bsf		d_PORTA,4		; 
;=====================================
			movfw	d_PORTA			; загрузка портов
			movwf	PORTA			; 
			movfw	d_PORTB			; 
			movwf	PORTB			; 
	return							; 
;============================================================================================	
;******************** цикл индикации *************************************************************
ind_zad								; задежка вывода индикации
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.60				;
			movwf	b_zad_ind		;
		return						; 					; 
;*************************************************************************************************
;============================================================================================
;********************востановление данных*********************************************************
vost_data								; 
			movlw	(end_stek-flag_0)+1	; 
			movwf	chtteep				; 
			movlw	flag_0
			movwf	FSR				;  загрузка начала блока данных
			clrf	adr_e				; 			
povch			
			call	prov_eep			; сосчитать данные с EEPROM
			movwf	INDF				; загрузить в ОЗУ и увеличить указатель
			incf	FSR,f			
			incf	adr_e,f				; увеличить адрес EEPROM
			decfsz	chtteep,f				; уменьшить счетчик и проверить на ноль
			goto	povch				; повториь если не ноль
	return								; 
;********************
;=================================================================================================
prov_eep	call	rd_eeprom			; вызвать данные
			movf	data_e,w
			movwf	perem1				; 
			incf	adr_e,f				; адрес для EEPROM
			call	rd_eeprom			; вызвать данные (копия)
			movf	data_e,w			;
			subwf	perem1,w			; сравнить на равенство данных в EEPROM
			btfss	STATUS,Z			; 
			goto	$+3					; 
			movf	data_e,w			; данные равны
		return							; 
			btfss	STATUS,C			; 
			goto	$+3					; 
			movf	data_e,w			; 
			goto	$+2					; 
			movf	perem1,w			; 
			bsf		E_data				; ошибка в EEPROM
		return							; 
;=================================================================================================
rd_eeprom	movfw	adr_e			; загрузить значение адреса чтения
			bsf		STATUS,RP0		; выбор банка 1
			movwf	EEADR			; выставить нулевой адрес
			bsf		EECON1,RD		; начать чтение с  EEPROM
			movfw	EEDATA			; сосчитать данные
			bcf		STATUS,RP0		; выбор банка 0
			movwf	data_e			; сохранить в переменной
	return
;=================================================================================================
zap_eeprom								; запись в EEPROM
			movf	INTCON,w
			movwf	perem5				; сохранить значение регистра INTCON			
			bcf		INTCON,GIE			; запретить все прерывания			

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

povch1		
			movf	INDF,w				; загрузить в ОЗУ и увеличить указатель
			call	zap_2byt_eeprom		;
			incf	FSR,f
			incf	adr_e,f				; увеличить адрес EEPROM
			decfsz	chtteep,f				; уменьшить счетчик и проверить на ноль
			goto	povch1				; повториь если не ноль
			
;				запрет записи в EEPROM
stop_wr_e		
			bsf		STATUS,RP0		; выбрать банк 1
			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
			goto	$-1
			bcf		EECON1,WREN		; запретить запись			
			bcf		STATUS,RP0		; выбрать банк 0

			
			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		
			bsf		STATUS,RP0		; выбор банка 1
			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
		goto	$-1					; 
			bsf		EECON1,WREN		; разрешить запись
			bcf		STATUS,RP0		; выбор банка 0
			movfw	adr_e			; загрузить адрес
			bsf		STATUS,RP0		; выбор банка 1
			movwf	EEADR			; установка адреса 1
			bcf		STATUS,RP0		; выбор банка 0
			movfw	data_e			; и вызов переменой состояния для сохранения
			bsf		STATUS,RP0		; выбор банка 1
			movwf	EEDATA			; в EEPROM
			movlw	0x55			; активация цикла записи в EEPROM
			movwf	EECON2			;
			movlw	0xAA			;
			movwf	EECON2			;
			bsf		EECON1,WR		; начать запись
			bcf		STATUS,RP0		; выбрать банк 0
	return
;********************************************************************************************
;********************************************************************************************

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


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

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

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

;============================================================================================
kondosdata			; контроль достоверности данных
;		;контроль велицины Задание уровня температуры
			movf	Te_zad_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			movf	Te_zad_hi,w		;
			movwf	peAsh			;			
			movlw	0x04			; 
			movwf	peBsh			; загрузка данных			
			movlw	0xeC			; + 126.0
			movwf	peBsl			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
;		;контроль велицины Верхний аварийный уровень
			movf	Up_alr_hi,w		;
			movwf	peAsh			; сравнение данных на превышение максим				
			movf	Up_alr_lo,w		;
			movwf	peAsl			;
;			; peBsh/peBsl используются данные предыдущие
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
;		;контроль велицины Нижний аварийный уровень
			movf	Dn_alr_hi,w		; сравнение данных на превышение максим	
			movwf	peAsh			;			
			movf	Dn_alr_lo,w		;
			movwf	peAsl			;
;			; peBsh/peBsl используются данные предыдущие
			call    sravnenie		;
			btfss	BOL				; если больше авария
;		;контроль велицины Зона ГИСТЕРЕЗИСА
			movf	Gi_zad_lo,w		;
			movwf	peAsl			; сравнение данных на превышение максим	
			clrf	peAsh			;			
			movlw	0xC8			; + 20.0
			movwf	peBsl			; загрузка данных
			clrf	peBsh			; загрузка данных
			call    sravnenie		;
			btfsc	BOL				; если больше авария
		goto	vos_data			;
	return	
;====================================
vos_data	
			; инциализация данных в результате сбоя и сохранения в EEPROM
			bsf		STATUS,RP0		; выбрать банк 1
			clrf	TRISB			; и настроить все линии порта на вывод 
			bcf		STATUS,RP0		; выбрать банк 0
						
			movlw	0x01			;		
			movwf	flag_0			; 
			movwf	Te_zad_hi			;* 	30,0 г	
			movlw	0x2c				;
			movwf	Te_zad_lo			;*
			
			movlw	0x0a				;	 1,0 г
			movwf	Gi_zad_lo			;*

			movlw	0x04				;	125,0 г		
			movwf	Up_alr_hi			;* 
			movlw	0xe2				;
			movwf	Up_alr_lo			;*

			movlw	0xfd				;		
			movwf	Dn_alr_hi			;* -55,0 г
			movlw	0xda				;
			movwf	Dn_alr_lo			;*
			
			clrf	Vr_zak_hi			;* 
			clrf	Vr_zak_lo			;*

			clrf	Vr_pov_hi			;* 
			movlw	0xb4				;
			movwf	Vr_pov_lo			;*
			
			call	zap_eeprom			; записать в память заводские установки 
alr_d
			
			bcf		RELE1				; линия реле 
			bcf		RELE2				; линия реле 		
			clrf	flag_i1				; 
			
			movlw	.34					; 
			call	big_str				;бегущая строка авария данных
		goto	alr_d					; 
;============================================================================================
;============================================================================================
;============================================================================================
;DALLAS подпрограммы (работа с обычным питанием 3 жилы, Vdd, Vss, QD)
;============================================================================================
;============================================================================================
;============================================================================================
RESET_DALLAS				; формирование импульса сброса и тестирование присутствия датчика
			call 	DOUT_LOW 			; сформировать импульс сброса 480-960 mks
			
 			movlw	.180				; формирует импульс сброса.152
 			movwf	TEMP0				; 152-481 мкc
 			decfsz 	TEMP0,F				;
 			goto 	$-.1				;
			
			call 	DOUT_HIGH 			; установить высокий уровень

			clrf	TEMP0				; ожидания импульса ответа от датчика температуры
GT_1  		clrwdt						; сброс сторожевого таймера++++++
			decfsz	TEMP0,f				; 
			goto	kip_1				; 

neitdtt		bsf		ERROR_D				; датчик неисправен
			bcf		CON					; сбросить бит конвертирования, для корректного считывания, при подключении датчика
		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				; датчик исправен
 			movlw	.180					; 70-200
 			movwf	TEMP0				; 152-481
 			decfsz 	TEMP0,F				; 152-481
 			goto 	$-.1				;.152

		return							; 
;============================================================================================
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину,
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень
DOUT_HIGH
			bsf		DALLAS				; задежка для длинных линий для  формирования импульса восстановления 
			nop
			nop
			nop
			nop
			bsf		STATUS,RP0			; выбрать банк 1
 			bsf		TRISDAL,LINE		; настроить порт на ввод (имитация открытого коллектора)
			bcf		STATUS,RP0			; выбрать банк 0
		retlw	.0						; 
;============================================================================================
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа  на  вывод и устанавливает на ней "0"
DOUT_LOW
			bsf		STATUS,RP0			; выбрать банк 1
 			bcf		TRISDAL,LINE		; настроить порт на выход
			bcf		STATUS,RP0			; выбрать банк 0
 			bcf		DALLAS				; установить низкий уровень на шине			
			nop
		;	movlw 	.1					;задежка необходимвя для увеличения длины кабеля
		;	movwf 	TEMP0				; 4-18
	 	;	decfsz 	TEMP0,F				; 
		;	goto 	$-.1				; 
		retlw	.0						; 
;============================================================================================
; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных.
DLIT_WR									; 
			movlw 	.14					;.20 - 60mks
			movwf 	TEMP0				; 16+4mks (включая импульс "0")
	 		decfsz 	TEMP0,F				; 
 			goto 	$-.1				;
		retlw H'00'						; 
;============================================================================================
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
DRECEIVE
			bcf		INTCON,GIE		; запретить прерывания
			movlw 	.8 					; Количество получаемых бит
			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			; 
			bsf		INTCON,GIE		; разрещить прерывания	
		retlw 	H'00'					; 
;============================================================================================
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
DSEND
			bcf		INTCON,GIE		; запретить прерывания
 			movwf 	COM_REG 			; Загрузка бофера команд для пересылки
			movlw 	.8 					; Количество битов для пересылки
 			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				; Повторить передачу бита
			bsf		INTCON,GIE		; разрещить прерывания	
		retlw H'00'						; 
;============================================================================================
;============================================================================================
										; чтение температуры из термометра
celsio									; 
;========================================
; измерение температуры					; 
			CALL 	DOUT_LOW 			; слот чтения для контроля 
			CALL 	DOUT_HIGH 			; окончания конвертирования
			btfss	DALLAS 				; 
		return  						;
			btfsc	CON					; проверим бит режима работы 0 - надо конвертировать
		goto	chtenie					; 1 - конвертирование идет
			call	RESET_DALLAS		; 
			btfsc	ERROR_D				;
		return				; датчик неисправен прервать конвертирование температуры
;========================================
			MOVLW 	H'CC' 				; послать команду Пропустить ROM
			CALL 	DSEND				;
			MOVLW 	H'44' 				; послать команду Конвертировать температуру
			CALL 	DSEND				;
;========================================
			bsf		CON					; идет конвертирование
		return							; 
;========================================
chtenie									; чтение температуры
			bcf		CON					; конвертирование выполнено
;========================================
			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		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							;
;============================================================================================
;============================================================================================


;============================================================================================
;============================================================================================
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	nam_55				;
			movlw	.40  			; 
			call	big_str			; бегущая строка - горячо
		goto	ochinoh
nam_55			
			movlw	0xfd			;ПРОВЕРИТЬ ТЕМП ИЗМ -55
			movwf	peBsh			;
			movlw	0xda			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	MEN				;
		goto	p_ind_r1			;
			movlw	.44  			; 
			call	big_str			; бегущая строка - холодно
ochinoh			
			call 	och_left		; очистка индикатора
			bsf		oh_te			; ошибка темпер.
	return						
;				вид индикации
p_ind_r1
			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				;	
			movlw	0xFF			;ПРОВЕРИТЬ ТЕМП ИЗМ >-10.0
			movwf	peBsh			;
			movlw	0x9c			;
			movwf	peBsl			;
			call    sravnenie		;
			btfss	BOL				;
		goto	obind				;

			btfss	RELE1			; цикл управления прерывистой индикацией
			goto	$+3				;
			bsf		TOCHm2			;
			goto	$+2				;
			bcf		TOCHm2			;
			bcf		TOCHm3			;			
			
			bcf		TOCHKA3			;
			bsf		TOCHKA2			;
			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
		goto	fing

obind
			btfss	RELE1			; цикл управления прерывистой индикацией
			goto	$+3				;
			bsf		TOCHm3			;
			goto	$+2				;
			bcf		TOCHm3			;
			bcf		TOCHm2			;
			
			bsf		TOCHKA3
			bcf		TOCHKA2
			movfw	dest			; 
			movwf	ind_3			; 
			movfw	sotn			; 
			movwf	ind_2			; 
			movfw	tysc			; 
fing		movwf	ind_1			; 				
		return						;

Erro			
			bcf		CON				; сбросить бит конвертирования, для корректного считывания, при подключении датчика
			bcf		RELE1			; отключить управление
			bsf		RELE2			; включить сигнал аварии		
			btfsc	UST
		return	
			movlw	.13				; код ошибка датчика
			call	big_str			; подпрограмма бегущая строка
			call 	och_left		; очистка индикатора
;			clrf 	flag_i2			; 
;			clrf 	flag_i1			; 
;			movlw	cE				; 
;			movwf	ind_1			; 
;			movlw	cr				; 
;			movwf	ind_2			; 
;			movlw	ct				; 
;			movwf	ind_3			; 
		return						; 
;********************************************************************************************************


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

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

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











; initialize eeprom locations
;============================================================================================										
;++++++++++++++++++++++++++Данные для записи в EEPROM +++++++++++++++++++++++++++++++++++++++
			ORG		0x2100						; 							
			DE		.01,.01 					;flag_0							* флаги состояния работы контроллера
			DE		0x01,0x01,0x2c,0x2c			;Te_zad_hi,Te_zad_lo	30,0 г	* Задание уровня температуры
			DE		0x0a,0x0a					;Gi_zad_lo	 			 1,0 г	* Зона ГИСТЕРЕЗИСА
			DE		0x04,0x04,0xe2,0xe2			;Up_alr_hi,Up_alr_lo	125,0 г	* Верхний аварийный уровень
			DE		0xfd,0xfd,0xda,0xda			;Dn_alr_hi,Dn_alr_lo 	-55,0 г	* Нижний аварийный уровень
			DE		0x00,0x00,0x00,0x00			;Vr_zak_hi,Vr_zak_lo	 0 cek - 10 мин	* Время задежки автоконтроля параметров среды с момента включения или смены параметра
			DE		0x00,0x00,0xb4,0xb4			;Vr_pov_hi,Vr_pov_lo	 180 cek -  3 мин	* Время задержки повторного запуска компрессора
			DE		.0,.0						; 							
;============================================================================================

	END                       ; directive 'end of program'

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