;==========================================================================
;                                                                     *
;    Filename:	    CH-с3310-04.asm                                   *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:  Gena Chernov - Catcatcat                                *
;    Company: Magetex-Voron                                           *
;                                                                     *
;                                                                     *
;==========================================================================
;                                                                     *
;                                                                     *
;    Files required:  Спидометр                                       *
;                     конструктор       		                        *
;                                                                     *
;==========================================================================
;                                                                     *
;    Notes:                                                           *
;         6 импульсов на 1 метр длины                                 *
;      1км-1000м=6000 имп                                             *
;      скорость 1 км/ч=1,666666.....67 им/сек	=1,7 Гц               *
;      скорость 10 км/ч=16,66666.....67 им/сек	=16,7 Гц              *
;      скорость 60 км/ч=100 им/сек	=100 Гц               *
;      скорость 100 км/ч=166,6666.....67 им/сек	=167 Гц               *
;                                                                     *
;      функция клавиш в режиме  << настройки >>   	| <<работа>>      *
;               BP1                 функция         | переход в режим настройки/возврат к индикации скорости    *
;               BP2             пред.функция/меньше | время в пути/сброс                                        *
;               BP3             след.функция/больше	| пройденный путь/сброс                                     *
;               BP4                                	| средняя скорость											*
;               BP5                                	| пиковая скорость/сброс									*
;               BP6                                	| переключение компаратора Город/Трасса                     *
;==========================================================================
;	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
	__idlocs  0x0af   		    		; 
	errorlevel  2            			; suppress message 302 from list file

	__CONFIG   _CP_ON & DATA_CP_ON & _LVP_OFF & _BOREN_ON & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

;=======================================================================================================
#define		yarcost		1	; выбор типа индикации 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
cher300_10						; 
cher02							; 
cher05							; 
;chet_10						; счетчик делитель длительности до 1 Гц
;cher60m						; счетчик делитель длительности до 1 мин
;================================
flag_i1							; флаги индикации
flag_i2							; флаги индикации
flag_1							; флаги управления
flag_2							; флаг выбора параметров настройки регулятора
flag_3							; флаги управления
flag_4							; флаги управления
flag_4a							; 
flag_5
;================================
avtovyh							; переменная автовыхода из режима настройки
;================================
adr_e							; переменные для работы с EEPROM
data_e							; 
chtteep						    ; счетчик программы работы с EEPROM
;================================
uskor                     		; переменные обработки скорости автоповтора нажатия клавиш
uskor_1                     	;
;========================================
;переменные сохраняемые в памяти EEPROM
;========================================
flag_0							;* флаги состояния работы контроллера
comG_hi,comG_lo					;* установки компаратора город
comT_hi,comT_lo					;* установки компаратора трасса
coli_hi,coli_lo					;* калибровочная величина для коррекции показаний спидометра
end_stek						;*
;========================================
Put_hi,Put_lo,PutS_up,PutS_hi,PutS_lo	; пройденный путь
delodom							; промежуточный счетчик одометра
SPEED_max_hi,SPEED_max_lo		; максимальная скорость движения
SP_sred_hi,SP_sred_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						; счетчик выбора символа
;========================================
TEMP0 							;
t_binu							;
t_binh							;
t_binl							;
;========================================
tekob_h,tekob_l					; текущая скорость
;========================================
compens							;
itegind							; индикатор интегратора
ti_of_in						; таймер гащения индикации при отключении дополнительного питания
zad_CONPI						; 
	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
dlih_u,dlih_h,dlih_l			;
shiftU,shiftH,shiftL			;
BCount							;
rez_u,rez_h,rez_l				;
ost_u,ost_h,ost_l				;

izm_u,izm_h,izm_l				;	
izm1_h,izm1_l					;	
izm2_h,izm2_l					;	
izm3_h,izm3_l					;	
izm4_h,izm4_l					;
izm5_h,izm5_l					;
izm6_h,izm6_l					;
izm7_h,izm7_l					;
izm8_h,izm8_l					;

clock_h,clock_l,clockS_u,clockS_h,clockS_l	; значение в сеундах, мах значение 18 часов, 12 минут, 15 сек.
sign							;
cekundy							;
minuny_h,minuny_l				;
chasy_h,chasy_l					;
temp1							;
izm_fh,izm_fl					;
del_36
	endc	
;==========================================================================
;==========================================================================
; описание портов индикации
#define		S_A		d_PORTB,1		; сегмент А
#define		S_B		d_PORTB,2		; сегмент B
#define		S_C		d_PORTA,0		; сегмент 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'00111000'		; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PA	b'10000110'		; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
; порт В
#define		CL_PB	b'00001001'		; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PB	b'00000000'		; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
	else
; упраляющие байты для работы программы индикации
; порт А
#define		CL_PA	b'00111000'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PA	b'00000000'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
; порт В
#define		CL_PB	b'00001001'	; в этом байте "0" устанавливаются те биты которые необходимо очистить, "1" те биты состояние которых не должно меняться при смене индикации 
#define		SE_PB	b'00000000'	; в этом байте установить в "1" биты если они совпадают с управляющими портами разрядов индикаторов
;//---------------------------------------------
; для работы с транзисторными ключами #define	SE_PA	b'00000000'	; биты управления разрядами в "0"
; для работы с транзисторными ключами SOT/DES/EDI биты управления разрядами в "1" (в программе индикации)
;===========================================================================================
	endif
;==========================================================================
#define		CONPI	PORTA,5			; контроль питания
;==========================================================================
; описание портов клавиатуры

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

#define		PORTKN	b'11111110'		; описание расположения портов кнопок
#define		INITB	b'00001000'		; инициализация порта В
;==========================================================================
#define		INDK	flag_0,0		; бит функция кнопки время/макс_скорость
#define		FGDS	flag_0,1		; функция гашения дисплея
#define		FRES	flag_0,2		; функция рестарта системы при подаче доп.питания (включения двигателя)
;=================================
#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		NAPR	flag_1,4			; бит направление изменения скорости

#define		GAIN	flag_1,5 		; бит гашения индикации
;=================================
; биты программы настройки регулятора
#define		COMGO	flag_2,1		; настройка компаратора Город
#define		COMTR	flag_2,2		; настройка компаратора Трасса
#define		CALIB	flag_2,3		; калибровка спидометра
#define		GASHN	flag_2,4		; фунцкия гашения дисплея
#define		FURES	flag_2,5		; функция рестарта системы при включении
#define		PROIZ	flag_2,6		; данные о изготовителе
;=================================
#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		INDODOM	flag_3,5		; индикация одометра (пройденого пути)
#define		MAXSPEED	flag_3,6	; индикация максимальной скорости
#define		COMPAR	flag_3,7		; индикация выбора компаратора скорости  
;=================================
#define		SSTOOP	flag_4,0		;
#define		B24		flag_4,1		;
#define		BTE		flag_4,2		; бит гашения первых нулей до 00
#define		BTE0_00	flag_4,3		;
#define		AveSPEED	flag_4,4		; бит индикации средней скорости
#define		INTIME	flag_4,5		; индикация времни работы

#define		CONPI_p	flag_4,6		;
#define		CONPIF	flag_4,7		;
#define		CONPIFp	flag_4a,0		;


;=================================
#define		f_RB_1	flag_5,0		;
#define		f_RB_2	flag_5,1		;
#define		f_RB_3	flag_5,2		;
#define		f_RB_4	flag_5,3		;
#define		f_RB_5	flag_5,4		;
#define		f_RB_6	flag_5,5		;

;=================================
; биты программы индикации
#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		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
		goto	main           			; go to beginning of program
;==========================================================================
		ORG     0x004             			; interrupt vector location
		goto	preryv
;==========================================================================
;============================================================================================
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"-"минус"				
;============================================================================================
;============================================================================================
text_1		addwf	PCL,f			; тип устройства (счет строк с 0)
			retlw	.12				; количество команд - retlw в подпрограмме
			retlw	cc				;
			retlw	ch				;
			retlw	cM				;
			retlw	cC				; 
			retlw	c3				;
			retlw	c3				;
			retlw	c1				;
			retlw	c0				;
			retlw   cM				;				
			retlw	c0				;
			retlw	c4				;

					;	.12 компаратор город
			retlw	.4				; количество команд - retlw в подпрограмме
			retlw	cc		;
			retlw	cg		;
			retlw	co		;
			
					;	.16 компаратор трасса
			retlw	.4				; количество команд - retlw в подпрограмме
			retlw	cc		;
			retlw	ct		;
			retlw	cr		;
					;	.20 калибровка спидометра
			retlw	.4		; количество команд - retlw в подпрограмме
			retlw	cc		;
			retlw	co		;
			retlw	cL		;
					;	.24 телефон изготовителя
			retlw	.14				; количество команд - retlw в подпрограмме
			retlw	b'01111110'		; "0"
			retlw	b'11011010'		; "5"
			retlw	b'11111010'		; "6"
			retlw	b'10000000'		; "-"
			retlw	b'10011110'		; 3-3
			retlw	b'00001110'		; 7-7				
			retlw	b'11001100'		; "4"
			retlw	b'10000000'		; "-"
			retlw	b'01111110'		; "0"
			retlw	b'11001100'		; "4"					
			retlw	b'10000000'		; "-"
			retlw	b'01111110'		; "0"					
			retlw	b'11011010'		; "5"				
					;	.38 функция гашения дисплея
			retlw	.4		; количество команд - retlw в подпрограмме
			retlw	cg		;
			retlw	cA		;
			retlw	cc		;
					;	.42 сброс счетчиков
			retlw	.4		; количество команд - retlw в подпрограмме
			retlw	ci		;
			retlw	cn		;
			retlw	ct		;
					;	.46 Tel
			retlw	.4		; количество команд - retlw в подпрограмме
			retlw	b'11110000'		; "t"
			retlw	b'11110010'		; "E"
			retlw	b'01110000'		; "L"
					;	.50 все очищено
			retlw	.6				; количество команд - retlw в подпрограмме
			retlw	cA				; "A"
			retlw	b'01110001'		; "L."
			retlw	b'00000000'		; " "
			retlw	cc				; "c"
			retlw	b'01110001'		; "L."

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


;============================================================================================
preryv
			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
;==========================================================================
			btfss	PIR1,TMR1IF			;
		goto	end_T0IF				;
			bcf		PIR1,TMR1IF			; сбросить флаг прерывания от модуля TMR1

			bsf		STATUS,RP0			; выбрать банк 1
			clrf	izm_fh				;
			clrf	izm_fl				;
			bcf		STATUS,RP0			; выбор банка 0	
			bcf		NAPR				; 0-настройка режима компаратора - нарастание скорости
;------------------------------------------			
			clrf	CCP1CON				; рестарт CCP1 модуля для коректности формирования длительности
			movlw	b'00000110'			; Каждый 4-й передний фронт сигнала на входе CCPx;
			movwf	CCP1CON				; 
			clrf	T1CON				; выключить таймер
			bsf		SSTOOP				; пропуск первого цикла измерений при начале движения 
			clrf	TMR1H				; очистка таймера
			clrf	TMR1L				;
			clrf	CCPR1H				;
			clrf	CCPR1L				;
end_T0IF								;
;===============================================
			btfss	PIR1,CCP1IF			; Флаг прерывания CCP1IF
		goto	end_INTF				;
			bcf		PIR1,CCP1IF			;
			clrf	TMR1H				; очистка таймера
			clrf	TMR1L				;

			btfsc	T1CON,0				; таймер выключен?
		goto	$+.3					;
			movlw	b'00110001'			; таймер включен, предделитель 4 мг = 1:8 - 125 000 гц
			movwf	T1CON				;

			btfsc	SSTOOP				; пропуск первого измерения после остановки
		goto	eeet					; 
			movfw	CCPR1H				; значения таймера
			bsf		STATUS,RP0			; выбор банка 1
			movwf	izm_fh				;
			bcf		STATUS,RP0			; выбор банка 0
			movfw	CCPR1L				;			
			bsf		STATUS,RP0			; выбор банка 1
			movwf	izm_fl				;
			bcf		STATUS,RP0			; выбор банка 0
eeet
			bcf		SSTOOP			
;------------------------------------------	
; счетчик одометра
; датчик выдает 6 импульсов на метр
; модуль прерывается от каждых 4 импульсов
; 3 прерывания-12 импульсов - 2 метра пути
; 150 прерывания- 600 импульсов - 100 метров пути

			decfsz	delodom,f			; младший разряд 100 метров пути
		goto	end_pr1					;
			movlw	.150				; 
			movwf	delodom				;
			
			movlw	.1					;здесь идет счет по 100 метрам за единцу
			addwf	Put_lo,f			;максимальное растояние 6 535.5 кМетров
			btfsc	STATUS,C			;
			incf	Put_hi,f			;

			movlw	.100				;
			addwf	PutS_lo,f			; путь для вычисление средней скорости
			btfss	STATUS,C			;максимальное растояние 16 777 кМетров
		goto	end_put					;
			movlw	.1					;
			addwf	PutS_hi,f			; путь для вычисление средней скорости
			btfss	STATUS,C			;
		goto	end_put					;	
			movlw	.1					;
			addwf	PutS_up,f			; путь для вычисление средней скорости
			btfss	STATUS,Z			;
		goto	end_put					;	
			clrf	PutS_up				; сброс пути при переполнении счетчика пути
			clrf	PutS_hi				; 
			clrf	PutS_lo				;
			bsf		STATUS,RP0			; выбор банка 1	
			clrf	clockS_u			; сброс времени при переполнении счетчика пути
			clrf	clockS_h			; 
			clrf	clockS_l			;
			bcf		STATUS,RP0			; выбор банка 0
end_put
		goto	end_pr1					;
end_INTF
;============================================================================================
;============================================================================================
ob_TMR1IF
			btfss	INTCON,T0IF			;Флаг прерывания по переполнению TMR0
		goto	end_pr1					;
			bcf		INTCON,T0IF			;
;========================================================================== 
			decfsz	cher300,f			; счетчик делитель длительности до 10 Гц 
			goto	end_pr				; 
			movlw	.13					; если достигнут ноль востановить счетчик
			movwf	cher300				;
;========================================================================== 
;============== период 	300 Гц	
;========================================================================== 
;==============	программа формирования задежки индикации символов
			movf	b_zad_ind,f			; проверить время задежки вышло
			BZ		$+2					;
			decf	b_zad_ind,f			; 
;==============	программа обслуживания работы индикатора
			call	indic				;
;========================================================================== 
			decfsz	cher300_10,f		; счетчик делитель длительности до 10 Гц 
			goto	end_pr				; 
			movlw	.30					; если достигнут ноль востановить счетчик
			movwf	cher300_10			;
;========================================================================== 
;======== период 	10 Гц		
;---------------------------------------- 
			movf	zad_CONPI,f			; фильтр входа дополнительного питания
			btfss	STATUS,Z			; 
			decf	zad_CONPI,f			;
;---------------------------------------- 
			bsf		STATUS,RP0			; выбор банка 1
			decfsz	del_36,f			; счетчик делитель длительности до 10 Гц 
		goto	endti					; 
			movlw	.36					; 1 импульс равен 3,6 секунды 
			movwf	del_36				;
			
			incf	clockS_l			; счетчик времени средней скорости
			movf	clockS_l,f			; 
			btfss	STATUS,Z			; 
		goto	endti					; 
			incf	clockS_h			; 
			movf	clockS_h,f			; 
			btfsc	STATUS,Z			; 
			incf	clockS_u			; 
		
endti		bcf		STATUS,RP0			; выбор банка 0
;---------------------------------------- 
			movf	itegind,f			; интегратор индикатора
			btfsc	STATUS,Z			;
		goto	$+.2					;
			decf	itegind,f			;	
;========================================================================== 
			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	avtovyh,f			; программа автовыхода из режима настройки  
			SKPNZ						; и возврата к основной индикации
		goto	chet_1mi_m				;
			decfsz	avtovyh,f			;
		goto 	chet_1mi_m				;
			call	resautoexit			; 
chet_1mi_m
;---------------------------------------- 
			bsf		STATUS,RP0			; выбор банка 1
			incf	clock_l				; счетчик времени работы двигателя
			movf	clock_l,f			; может использваться как счетчик времни
			btfsc	STATUS,Z			; для проезда
			incf	clock_h				; 		
			bcf		STATUS,RP0			; выбор банка 0

;---------------------------------------- 
			; таймер гащения индикации при отключении дополнительного питания
			btfss	FGDS				; 
		goto	onind 				; 		
			btfsc	CONPIF				; 
		goto	onind 				; 
			movf	ti_of_in,f			; 	
			btfsc	STATUS,Z
		goto	end_FGDS				; 
			decfsz	ti_of_in,f			; счетчик делитель длительности до 1 Гц 
			goto	onind2				; 
			bsf		GAIN				; 
		goto	end_FGDS 			; 
onind		movlw	.90					; если достигнут ноль востановить счетчик (90 секунд время отключения)
			movwf	ti_of_in			; период 1 Гц
onind2		bcf		GAIN				; 
end_FGDS			
;---------------------------------------- 
;==========================================================================
;============== период 	1 Гц end
end_pr
;==========================================================================
end_pr1
;==========================================================================
			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
;=======================================================================================================




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

			movlw	INITB			; и настроить порты кнопок на ввод
			movwf	TRISB			; 

			movlw	.36					; если достигнут ноль востановить счетчик
			movwf	del_36			;

;==================================== 			
		; настройка таймера	TMP1	; 
			bcf		STATUS,RP0		; выбрать банк 0
			movlw	b'00110001'		; таймер включен, предделитель 4 мг = 1:8 - 125 000 гц
			movwf	T1CON			;
		;	movlw	b'00000101'		; Режим захвата
			movlw	b'00000110'		; Каждый 4-й передний фронт сигнала на входе CCPx;
			movwf	CCP1CON			; 
;============================================================================================
			call	vost_data		; востановление настроек после включения питания
;============================================================================================
		; инициализация переменных
			movlw	SPUAN			;
			movwf	uskor_1			; 
			movwf	uskor			; 
			
			movlw	.1				; счетчик 10 гц выход 1 секунда
			movwf	cher300_10		; 
			movwf	cher02			; 
			movwf	cher05			; 
			bsf		vp_rp			; 
			bcf		LE_RI			; настройка битов клавиш направлений
			movlw	.150			; 
			movwf	delodom			;
			movlw	.90				; 
			movwf	ti_of_in		;
			
			call	res_init		;
;============================================================================================
		; настройка прерываний
			movlw	b'11100000'		; от таймера T0IE:
			movwf	INTCON			; разрешить прерывания от переферийных устройств
			bsf		STATUS,RP0		; выбор банка 1
			bsf		PIE1,CCP1IE		; разрешить прерывания от CCP1IE
			bcf		STATUS,RP0		; выбор банка 0

;============================================================================================
			bsf		STATUS,RP0		; выбрать банк 1
			movlw	PORTKN			; и настроить порты кнопок на ввод
			movwf	TRISB			; 
			bcf		STATUS,RP0		; выбрать банк 0			
			
			btfsc	RB_6			; очистка памяти
			goto	nores2			; 
		goto	cleardt				; 
nores2			

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

;============================================================================================
			movlw	.0				; 
			call	big_str			; бегущая строка CH-25xx
			call 	och_left		; очистка индикатора
			call	och_ring		; очиска индикатора в право			
;============================================================================================







;============================================================================================
#define		const 	.2965000			; 	.2965000 расчетная/	.3380000 корретироваванная для таврии
;#define		const 	.3014000			; +1км -    49000 1км
;#define		const 	.2916000			; -1км -    49000 1км
#define		constkm .4950				; 
;============================================================================================
; цикл работы регулятора
ind
			clrwdt						; сброс сторожевого таймера++++++
			;==============				;
;============================================================================================
			call	condid				; фильт входного сигнала	
;============================================================================================
			call	hotstart			; функция горячего запуска	
;============================================================================================
; обработка измерений	
			bsf		STATUS,RP0			; выбор банка 1
;----------------------------------------
; загрузка делимого
; вычисление скорости с учетом константы коректировки скорости
; для программы берем констану 4900 и используем умножение на коэффициент поправки 0-200 (где 10 это 1 км)
			movlw	upper 	constkm		; 
			movwf	shiftU				;
			movlw	high 	constkm		; контроль превышения	
			movwf	shiftH				; максимального значение
			movlw	low 	constkm		; индикации оборотов
			movwf	shiftL				;
			
			bcf		STATUS,RP0			; преобразование отрицательного числа
			btfsc	coli_hi,7			; 16 бит к 24 битам
		goto	$+.4					; 
			bsf		STATUS,RP0			;
			clrf	dlih_u				;			
		goto	$+.4					; 
			bsf		STATUS,RP0			;
			movlw	0xFF				; 
			movwf	dlih_u				; 	
			
			bcf		STATUS,RP0			; выбор банка 0			
			movfw	coli_hi				;
			bsf		STATUS,RP0			; выбор банка 1
			movwf	dlih_h				;
			bcf		STATUS,RP0			; выбор банка 0	
			movfw	coli_lo				;
			bsf		STATUS,RP0			; выбор банка 1
			movwf	dlih_l				;

			call	D_mpyS				; Умножение

			movlw	upper 	const		; 
			movwf	shiftU				;
			movlw	high 	const		;	
			movwf	shiftH				;
			movlw	low 	const		;
			movwf	shiftL				;

			movfw	rez_l				;
			addwf	shiftL,f			;
			btfsc	STATUS,C			;
			incf	shiftH,f			;
			movfw	rez_h				;
			addwf	shiftH,f			;
			btfsc	STATUS,C			;
			incf	shiftU,f			;
			movfw	dlih_l				;
			addwf	shiftU,f			;
			
;----------------------------------------
; загрузка делителя	
			bcf		INTCON,GIE			;
			movfw	izm_fh				; загрузка нового значения
			movwf	dlih_h				; буфера
			movfw	izm_fl				; запрещены прерывания от
			movwf	dlih_l				; некоректного формирования
			bsf		INTCON,GIE			; переноса данных
			clrf	dlih_u				;

			call	divizn				; деление
;----------------------------------------
			btfss	rez_h,7				; проверка деления на ноль
		goto	$+.3					;
			clrf	rez_h				; 			
			clrf	rez_l				; 				
;----------------------------------------
; программа вывода на индикатор текущей скорости
; подавляет мигание последней цифра на пороге переклюсения
#define		coninteg	.5				; фильтр от мигания индикатора	

			movf	rez_h,w				;
			bcf		STATUS,RP0			; выбор банка 0
			movwf	peAsh				;			
			bsf		STATUS,RP0			; выбор банка 1
			movf	rez_l,w				;
			bcf		STATUS,RP0			; выбор банка 0
			movwf	peAsl				; сравнение данных на превышение максим	

			movf	tekob_h,w			; значение после интегратора
			movwf	peBsh				;			
			movf	tekob_l,w			;
			movwf	peBsl				; сравнение данных на превышение максим	
			call    sravnenie			;
			btfsc	RAV					;		
	goto	eeINDOB						; пропустить интегратор
			btfss	BOL					; скорость увеличивается
		goto	umensh					; 
			btfss	NAPR				; 0-нарастание
		goto	$+.4	
			movf	itegind,f			;
			btfss	STATUS,Z			;
	goto	eeINDOB						; пропустить интегратор
			bcf		NAPR				;
		goto	ravno					;
umensh		btfsc	NAPR				; 1-уменьшение
		goto	$+.4					;
			movf	itegind,f			;
			btfss	STATUS,Z			;
	goto	eeINDOB						; пропустить интегратор
			bsf		NAPR				;
ravno		movlw	coninteg			;
			movwf	itegind				;

			bsf		STATUS,RP0			; выбор банка 1
;----------------------------------------
;интегратор измерений
			movfw	izm4_h				;
			movwf	izm5_h				;
			movfw	izm4_l				;
			movwf	izm5_l				;

			movfw	izm3_h				;
			movwf	izm4_h				;
			movfw	izm3_l				;
			movwf	izm4_l				;
			
			movfw	izm2_h				;
			movwf	izm3_h				;
			movfw	izm2_l				;
			movwf	izm3_l				;			

			movfw	izm1_h				;
			movwf	izm2_h				;
			movfw	izm1_l				;
			movwf	izm2_l				;			
;----------------------------------------
			movfw	rez_h				; загрузка нового значения
			movwf	izm1_h				;
			movfw	rez_l				;
			movwf	izm1_l				;			
;----------------------------------------
			movf	izm4_l,w			;
			movwf	izm_l				;
			movf	izm4_h,w			;
			movwf	izm_h				;
			clrf	izm_u				;
			
			movf	izm3_l,w			;
			addwf	izm_l,f				;
			btfsc	STATUS,C			;
			incf	izm_h,f				;
			movf	izm3_h,w			;
			addwf	izm_h,f				;
			btfsc	STATUS,C			;
			incf	izm_u,f				;

			movf	izm2_l,w			;
			addwf	izm_l,f				;
			btfsc	STATUS,C			;
			incf	izm_h,f				;
			movf	izm2_h,w			;
			addwf	izm_h,f				;
			btfsc	STATUS,C			;
			incf	izm_u,f				;

			movf	izm1_l,w			;
			addwf	izm_l,f				;
			btfsc	STATUS,C			;
			incf	izm_h,f				;
			movf	izm1_h,w			;
			addwf	izm_h,f				;
			btfsc	STATUS,C			;
			incf	izm_u,f				;

			bcf		STATUS,C			;	
			rrf		izm_u,f				;	
			rrf		izm_h,f				;	
			rrf		izm_l,f				;	
			bcf		STATUS,C			;	
			rrf		izm_u,f				;	
			rrf		izm_h,f				;	
			rrf		izm_l,f				;

			movf	izm_l,w				; повторная загрузка
			movwf	izm1_l				; интегированного значения
			movf	izm_h,w				;
			movwf	izm1_h				;
eeINDOB									; 
			bcf		STATUS,RP0			; выбор банка 0
;============================================================================================
			btfsc	COMPAR
		goto	indCOMPAR
			btfsc	INTIME				; индикация времени работы
		goto	indTIME					; 
			btfsc	INDODOM				; индикация одометра
		goto	indodomr				; 
			btfsc	MAXSPEED			; индикация максимальной скорости
		goto	indmsp					;
			btfsc	AveSPEED		; индикация средней скорости
		goto	indAvSP					;
; индикация скорости			
			bsf		STATUS,RP0			; выбор банка 1
			btfsc	izm_h,7				; 
		goto	indimax					;
			movfw	izm_h				; 			
			bcf		STATUS,RP0			; выбор банка 0
			movwf	peAsh				; 
			movwf	tekob_h				;
			bsf		STATUS,RP0			; выбор банка 1
			movfw	izm_l				; 				
			bcf		STATUS,RP0			; выбор банка 0
			movwf	peAsl				;			
			movwf	tekob_l				;
;---------------------------------------- определение максимума			
; фиксация пиковой скорости

			movf	SPEED_max_hi,w		;
			movwf	peBsh				;			
			movf	SPEED_max_lo,w		;
			movwf	peBsl				; сравнение данных на превышение максим	
			call    sravnenie			;
			btfss	BOL					; измерение  больше задания включить вентилятор
		goto	$+.5					; 
			movf	peAsh,w				; 
			movwf	SPEED_max_hi		; сохранить в переменной текущей температуры			
			movf	peAsl,w				; 
			movwf	SPEED_max_lo		; сохранить в переменной текущей температуры
;---------------------------------------- 
			movlw	high	.3000		; 300.0	км/час контроль превышения	
			movwf	peBsh				; максимального значение скорости
			movlw	low		.3000		; 
			movwf	peBsl				;
			call	sravnenie			;
			btfsc	BOL_RAV				;
		goto	indimax					; максимальная скорость индикация "---"
;---------------------------------------- 
; индикация превышения заданной скорости (компаратор скорости)			
; мигание дисплея
			btfsc	RELE1				;
		goto	$+.5
			bcf		RAZR1				;
			bcf		RAZR2				;
			bcf		RAZR3				;			
		goto	$+.4
			bsf		RAZR1				;
			bsf		RAZR2				;
			bsf		RAZR3				;
		goto	indtex					;
;---------------------------------------- 
indCOMPAR; индикация выбора компаратора скорости  
			btfsc	INDK
		goto	$+.6
			movfw	comG_hi		; 	установки компаратора город		
			movwf	binh				; 
			movfw	comG_lo		; 				
			movwf	binl				;
		goto	iinndte					;
			movfw	comT_hi		; 	установки компаратора трасса		
			movwf	binh				; 
			movfw	comT_lo		; 				
			movwf	binl				;
		goto	iinndte					;
;---------------------------------------- 
;---------------------------------------- 
; индикация максимально - скорости (пиковой)
indmsp
			movfw	SPEED_max_hi		; 			
			movwf	binh				; 
			movfw	SPEED_max_lo		; 				
			movwf	binl				;
		goto	iinndte					;
;---------------------------------------- 
indtex
; индикация текущуй - скорости
			movfw	tekob_h				; 			
			movwf	binh				; 
			movfw	tekob_l				; 				
			movwf	binl				;
iinndte
			bsf		BTE					;
			call	bin_dec				;
			bcf		TOCHKA1				; индикация скорости
			bcf		TOCHKA2				; 
			bcf		TOCHKA3				; 
			movfw	dest				; 
			movwf	ind_3				; 
			movfw	sotn				; 
			movwf	ind_2				; 
			movfw	tysc				; 
			movwf	ind_1				;
		goto	inpro					;
;---------------------------------------- 
indTIME		; преобразование и индикаиция времени работы		
			call	preobrcloc			;
		goto	inpro					; 
;---------------------------------------- 
indAvSP	; индикация средней скорости
			call	preobAvSP			;
		goto	inpro					; 
;---------------------------------------- 
indodomr		; индикация одометра
			movf	Put_lo,w			; 
			movwf	binl				;
			movf	Put_hi,w			; 
			movwf	binh				;

;индикация пути
			bsf		BTE					;
			call	bin_dec				;
		
			movf	dtys,f			 	; определение вида индикации 
			btfss	STATUS,Z			; 
		goto	indidtys			 	; 			
			movf	tysc,f			 	; определение вида индикации 
			btfss	STATUS,Z			; 
		goto	indikedin			 	; 
			bcf		TOCHKA1				; индикация пути > 1000
			bsf		TOCHKA2				; 
			bcf		TOCHKA3				; 
			movfw	edin				; 
			movwf	ind_3				; 
			movfw	dest				; 
			movwf	ind_2				; 
			movfw	sotn				; 
			movwf	ind_1				;
		goto	inpro					;
indikedin	bcf		TOCHKA1				; индикация пути до 1000
			bcf		TOCHKA2				; 
			bsf		TOCHKA3				; 
			movfw	dest				; 
			movwf	ind_3				; 
			movfw	sotn				; 
			movwf	ind_2				; 
			movfw	tysc				; 
			movwf	ind_1				;
		goto	inpro					;
indidtys
			clrf	Put_lo				; 1000 км переполнение одометра сброс
			clrf	Put_hi				;
		goto	inpro					;
indimax		bcf		STATUS,RP0			; превышение допустимого максимума скорости, мигание "---" 
			bsf		RAZR1				;
			bsf		RAZR2				;
			bsf		RAZR3				;	
			bcf		TOCHKA1				;
			bcf		TOCHKA2				; 			
			bcf		TOCHKA3				; 
			movlw	cM					; 
			movwf	ind_3				; 
			movlw	cM					; 
			movwf	ind_2				; 
			movlw	cM					; 
			movwf	ind_1				;
inpro									; 
;----------------------------------------
			;==============				;			
			call	ind_zad				;
			;==============				;
			movlw	.20					;
			movwf	b_zad_ind			;
			;==============				;
			call	upravlenie			;	(измениться длительность индикации)		
			;==============				;
			call	klava				; 
;--------------------------------------------				
kontr		btfss	UST					; выбор режима работы
			goto	ind					; режим индикации и регулирования/режим установки
;--------------------------------------------
; цикл настройки спидометра
nast		clrwdt						; сброс сторожевого таймера++++++
	;		call	upravlenie			;
			movfw	uskor				;
			movwf	b_zad_ind			;
			call	ind_zad				; 			
			call	klava				; 

		goto	kontr					; 
;============================================================================================



;============================================================================================
upravlenie								;программа сигнализации критических оборотов
;============================================================================================
;---------------------------------------- 
			movfw	tekob_h				; 			
			movwf	peAsh				; 
			movfw	tekob_l				; 				
			movwf	peAsl				;			
;---------------------------------------- определение максимума			
			btfsc	INDK
		goto	$+.6
			movf	comG_lo,w			;
			movwf	peBsl				; сравнение данных на превышение установки компаратора город	
			movf	comG_hi,w			;
			movwf	peBsh				;
		goto	spsc
			movf	comT_lo,w			;
			movwf	peBsl				; сравнение данных на превышение установки компаратора трасса
			movf	comT_hi,w			;
			movwf	peBsh				;			
spsc 		call    sravnenie			;
			btfss	BOL					; измерение  больше задания включить вентилятор
		goto	$+.3					; 
			bsf		RELE1				; бит мигания разряда индикатора
	return								; 
			bcf		RELE1				; бит мигания разряда индикатора
	return								; 
;============================================================================================

;============================================================================================
klava		; программа обработки нажатия клавиш
			bsf		STATUS,RP0			; выбор банка 1
			movlw	PORTKN				; и настроить порты кнопок на ввод
			movwf	TRISB				; 
			bcf		STATUS,RP0			; выбор банка 0
;----------------------------------------
	;		call	zaderj				; вызов подпрограммы задержки необходимая для установки уровней сигналов на входах
;----------------------------------------
			btfsc	RB_1				; клавиша функция 
		goto	t_RB_2					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_1				; для гашения дребезга контактов			
		goto	end_kl_call				; 
;----------------------------------------
			btfsc	AveSPEED			;
		goto	cleardi					;
			btfsc	INTIME				; выполнение функции возврат к индикации скорости
		goto	cleardi					; 
			btfsc	INDODOM				; 
		goto	cleardi					; 
			btfsc	MAXSPEED			; 
		goto	cleardi					;
			btfsc	COMPAR				; 
		goto	cleardi					;
			bcf		f_RB_1				;
;====================
			btfsc	GAIN				;
		goto	end_klf					;  
			btfsc		vp_rp			; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf			vp_rp			; установить режим коррекции параметров для кнопок < >
		goto	$+2						; 
			bcf			vp_rp			; установить режим вывора функций для кнопок < >
vyb_re		call	vyb_fun				; 
		goto	end_klf					;  
cleardi		bcf		INTIME				; 
			bcf		INDODOM				; 
			bcf		MAXSPEED			; 
			bcf		AveSPEED			; 
			bcf		COMPAR				; 
			bsf		kl_no				; 
		goto	end_klf					;  
;----------------------------------------	
t_RB_2		btfsc	RB_2				; клавиша меньше 
		goto	t_RB_3					; 
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_2				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_2				;
;====================
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bcf		LE_RI				; выбор направления вывора функций
		goto	vyb_re					; 
			btfsc	UST					; 
		goto	usdb3					;  
;====================
			btfsc	INTIME				; если установлен бит индикации времени
		goto	clti					; выполниять функцию сброса
			bcf		AveSPEED			; 
			bcf		MAXSPEED			; 
			bsf		INTIME				; 
			bcf		INDODOM				; 
			bcf		COMPAR				;
		goto	end_klf					;
clti		bsf		STATUS,RP0			; выбрать банк 1
			clrf	clock_h				; 
			clrf	clock_l				; 
			bcf		STATUS,RP0			; выбрать банк 0
		goto	end_kl_call				; 
usdb3			call	ustanov			; 
		goto	end_kl_call				; 


;----------------------------------------
t_RB_3		btfsc	RB_3				; клавиша больше 
		goto	t_RB_4					;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_3				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_3				;
;====================
			btfsc	vp_rp				; бит уровня выбора параметров функция параметр 1- уровень коррекции параметров
		goto	$+3						; 
			bsf		LE_RI				; выбор направления вывора функций
		goto	vyb_re					; 
			btfsc	UST					; 
		goto	byust					;  
;====================	
			btfsc	INDODOM				; 
		goto	sbrsta					; 
			bcf		AveSPEED			; 
			bcf		MAXSPEED			; 
			bcf		INTIME				; 
			bsf		INDODOM				; 
			bcf		COMPAR				; 
		goto	end_klf					; 
sbrsta		clrf	Put_hi				; 
			clrf	Put_lo				;
		goto	end_kl_call				; 
byust		call	ustanov				; 
		goto	end_kl_call				; 
;----------------------------------------
t_RB_4		btfsc	RB_4				; клавиша больше 
		goto	t_RB_5					;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_4				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_4				;
;====================
			bsf		AveSPEED			; 
			bcf		MAXSPEED			; 
			bcf		INTIME				; 
			bcf		INDODOM				; 
			bcf		COMPAR				; 
		goto	end_klf					;
;----------------------------------------
t_RB_5		btfsc	RB_5				; клавиша больше 
		goto	t_RB_6					;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_5				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_5				;
;====================
			btfsc	MAXSPEED			; если установлен бит индикации времени
		goto	clti2					; выполниять функцию сброса
			bcf		AveSPEED			; 
			bsf		MAXSPEED			; 
			bcf		INTIME				; 
			bcf		INDODOM				; 
			bcf		COMPAR				; 
		goto	end_klf					; 
clti2		movf	tekob_h,w			; 
			movwf	SPEED_max_hi		; сохранить в переменной текущей температуры			
			movf	tekob_l,w			; 
			movwf	SPEED_max_lo		; сохранить в переменной текущей температуры
		goto	end_klf					;  
;----------------------------------------
t_RB_6		btfsc	RB_6				; клавиша больше 
		goto	end_klava				;  
			btfsc	kl_no				; 
		goto	vyh						; 
			call	zaderj				; вызов подпрограммы задержки
			btfsc	RB_6				; 			
		goto	end_kl_call				; 			
			bcf		f_RB_6				;
;====================
			btfsc	INDK				;  
		goto	$+.3					; 
			bsf		INDK				; 
		goto	$+.2					; 
			bcf		INDK				; 			
			bcf		AveSPEED			; 
			bcf		MAXSPEED			; 
			bcf		INTIME				; 
			bcf		INDODOM				; 
			bsf		COMPAR				; 
			clrf	flag_i1				; 
			bsf		kl_no				; бит клавиша нажата
			movlw	.3					; перезагрузить пепеременную автовыхода
			movwf	avtovyh				; 
;----------------------------------------
end_klf
			movlw	.90					; если достигнут ноль востановить счетчик (90 секунд время отключения)
			movwf	ti_of_in			; период 1 Гц
			bcf		GAIN				;
			clrf	flag_i1
			bsf		kl_no				; бит клавиша нажата
			movlw	DIND				; перезагрузить пепеременную автовыхода
			movwf	avtovyh				; 
			bcf		BTE0_00				; устраняет моргание 0 в старшем разряде с перехода индикации времени 
		goto	end_kl_call				; на другие параметры
;----------------------------------------		
end_klava								;
			bcf		kl_no				; сбросить бит нажатия клавиши			
			movlw	SPUAN				; инициализация длительности свечения
			movwf	uskor_1				; 
			movwf	uskor				;
end_kl_call								;
;----------------------------------------
			bsf		STATUS,RP0			; выбор банка 1
			movlw	INITB				; и настроить порты по умолчанию
			movwf	TRISB				; 
			bcf		STATUS,RP0			; выбор банка 0

			movlw	0xFF
			movwf	flag_5
	return								;										
;----------------------------------------
vyh		;	нажатия двойные
			btfss	UST					;
	goto	end_kl_call					; 
			btfsc	vp_rp				; проверить система находится в режиме выбора функции
		goto	end_vyh1				; 
			btfsc	RB_4				; если удерживаю PB3+PB1		
		goto	end_vyh1				; 
			btfsc	RB_1				; 
		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				;				
	goto	end_kl_call					;					
;============================================================================================
resautoexit								; 
			btfsc	AveSPEED		; 
		goto	soig					; 			
			btfsc	MAXSPEED			; 
		goto	soig					; 
			btfsc	INTIME				; 
		goto	soig					; 
			btfsc	INDODOM				; 
		goto	soig					; 
			btfsc	COMPAR				; 
		goto	soig					; 
			bsf		GAIN				; гашение индикации
			call	indic				; 
			call	zap_eeprom			; записать в память заводские установки
			bcf		GAIN				; включить индикацию
;------------------------------------------	
			clrf	CCP1CON				; рестарт CCP1 модуля для коректности формирования длительности
			movlw	b'00000110'			; Каждый 4-й передний фронт сигнала на входе CCPx;
			movwf	CCP1CON				; 
			clrf	T1CON				; выключить таймер
			bsf		SSTOOP				; пропуск следующего 
			clrf	TMR1H				; очистка таймера
			clrf	TMR1L				;
			clrf	CCPR1H				;
			clrf	CCPR1L				;

;------------------------------------------	
soig									; 
			bcf		UST					; бит режима настройки регулятора
			clrf	flag_2				; очистить флаг выбора параметра			
			bsf		vp_rp				; бит режима 0-выбор параметра		
			bcf		LE_RI				; настройка битов направлений
res_init								; 
			bcf		INTIME				; 
			bcf		INDODOM				; 
			bcf		MAXSPEED			; 
			bcf		AveSPEED		; 
			bcf		COMPAR				; 
	return								; 
;============================================================================================
zaderj				; вызов подпрограммы задержки
			movlw	.50					; .200
			movwf	TEMP0				; 
			decfsz	TEMP0,f				; 
			goto	$-1					; 		
		return							; 		
;============================================================================================

;============================================================================================
; выбор функции настройки спидометра
vyb_fun
;====================================
			bsf		STATUS,RP0		; выбор банка 1
			movlw	INITB			; и настроить порты кнопок на ввод
			movwf	TRISB			; 
			bcf		STATUS,RP0		; выбор банка 0
			
			bsf		kl_no			; бит клавиша нажата
			bsf		UST				; 
			clrf	flag_i1			; сброс спец индикации 	
			clrf	flag_i2
			movlw	DIND			; перезагрузить пепеременную автовыхода
			movwf	avtovyh			; 
;====================================
			btfss	vp_rp			; если сброшен индицировать назавание параметра
		goto	pr_pr				; если установлен его значение			
;------------------------------------			
			btfsc	COMGO			; настройка компаратора Город
		goto	COMGO_f				; 
			btfsc	COMTR			; настройка компаратора Трасса
		goto	COMTR_f				; 
			btfsc	CALIB			; калибровка спидометра
		goto	CALIB_f				; 
			btfsc	GASHN			; фунцкия гашения дисплея
		goto	GASHN_f				; 
			btfsc	FURES			; функция рестарта системы при включении
		goto	FURES_f				; 
			btfsc	PROIZ			; Индикация телефона изготовителя
		goto	PROIZ_f				; 			
		goto	COMGO_f				; 						
;=================================
pr_pr		btfsc	LE_RI			; циклический переключатель флагов
		goto	prev				; 	 
;------------------------------------			
			btfsc	COMGO			; настройка компаратора Город
		goto	COMTR_f				; 
			btfsc	COMTR			; настройка компаратора Трасса
		goto	CALIB_f				; 
			btfsc	CALIB			; калибровка спидометра
		goto	GASHN_f				; 
			btfsc	GASHN			; фунцкия гашения дисплея
		goto	FURES_f				; 
			btfsc	FURES			; функция рестарта системы при включении
		goto	PROIZ_f				; 
			btfsc	PROIZ			; Индикация телефона изготовителя
		goto	COMGO_f				; 			
		goto	COMGO_f				; 
;=================================
prev		btfsc	COMGO			; настройка компаратора Город
		goto	PROIZ_f				; 
			btfsc	COMTR			; настройка компаратора Трасса
		goto	COMGO_f				; 
			btfsc	CALIB			; калибровка спидометра
		goto	COMTR_f				; 
			btfsc	GASHN			; фунцкия гашения дисплея
		goto	CALIB_f				; 
			btfsc	FURES			; функция рестарта системы при включении
		goto	GASHN_f				; 
			btfsc	PROIZ			; Индикация телефона изготовителя
		goto	FURES_f				; 			
		goto	COMGO_f				; 
;===============================================
	; данные о изготовителе
PROIZ_f		clrf	flag_2			; 
			bsf		PROIZ			; настройки времени включения режима автоконтроля (10-60)
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
		goto	PROIZ_d				; если установлен его значение
			movlw	.46				; тел. изготовителя
		goto	end_vybor_f			; 
PROIZ_d		movlw	.24				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка
			movlw	.46				; тел. изготовителя
			call	big_str			; подпрограмма бегущая строка	
	return							; 
;===============================================
		; настройка компаратора Город
COMGO_f		clrf	flag_2			; 
			bsf		COMGO			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	COMGO_d			; если установлен его значение
			movlw	.12				; tuc
		goto	end_vybor_f			; 
COMGO_d								; 
			movfw	comG_hi		; 
			movwf	binh			; 
			movfw	comG_lo		; 
		goto	ind_tena			; 
;===============================================
		; настройка компаратора Трасса
COMTR_f		clrf	flag_2			; 
			bsf		COMTR			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	COMTR_d			; если установлен его значение
			movlw	.16				; tuc
		goto	end_vybor_f			; 
COMTR_d								; 
			movfw	comT_hi		; 
			movwf	binh			; 
			movfw	comT_lo		; 
		goto	ind_tena			; 
;===============================================
		; калибровка спидометра
CALIB_f		clrf	flag_2			; 
			bsf		CALIB			; настройки температуры задания
			btfsc	vp_rp			; если сброшен индицировать назавание параметра
			goto	CALIB_d			; если установлен его значение
			movlw	.20				; tuc
		goto	end_vybor_f			; 
CALIB_d								; 
			movfw	coli_hi		; 
			movwf	binh			; 
			movfw	coli_lo		; 
ind_tena	movwf	binl			; 
			bsf		BTE				; 
			call    bin_dec			; 
		goto	indzadobr			; 
;===============================================
		; функция гашения дисплея
GASHN_f		clrf	flag_2			; 3 
			bsf		GASHN			; 
			btfsc	vp_rp			;
		goto	GASHN_d				;
			movlw	.38				; 		
		goto	end_vybor_f			; 
GASHN_d		btfss	FGDS			; функция гашения дисплея 1-включена/0-выключена
		goto	i_GASHN				; 
			movlw	cE				;
			movwf	ind_1			;
			movlw	cn				;
			movwf	ind_2			;			
			movlw	cb				;
			movwf	ind_3			;
	return							; 
i_GASHN		movlw	cd				;
			movwf	ind_1			;
			movlw	ci				;
			movwf	ind_2			;			
			movlw	cc				;
			movwf	ind_3			;
	return							; 
;===============================================
		; функция рестарта системы при включении
FURES_f		clrf	flag_2			; 4
			bsf		FURES			; 
			btfsc	vp_rp			;
		goto	FURES_d				;
			movlw	.42				; 		
		goto	end_vybor_f			; 
FURES_d		btfss	FRES			; функция рестарта системы при включении 1-включена/0-выключена
		goto	i_FURES				; 
			movlw	cE				;
			movwf	ind_1			;
			movlw	cn				;
			movwf	ind_2			;			
			movlw	cb				;
			movwf	ind_3			;
	return							; 
i_FURES		movlw	cd				;
			movwf	ind_1			;
			movlw	ci				;
			movwf	ind_2			;			
			movlw	cc				;
			movwf	ind_3			;
	return							; 
;===============================================
; общие программы режима индикации функций
;===============================================
end_vybor_f						 		; 
			btfsc	LE_RI		 		; 
		goto	$+3				 		; 
			call	big_str		 		; подпрограмма бегущая строка
	return						 		; 
			call	big_str_re	 		; подпрограмма бегущая строка
	return						 		; 
;============================================================================================
indzadobr	bcf		TOCHKA1				; индикация оборотов > 1000
			bcf		TOCHKA2				; 
			bcf		TOCHKA3				; 
			movfw	dest				; 
			movwf	ind_3				; 
			movfw	sotn				; 
			movwf	ind_2				; 
			movfw	tysc				; 
			movwf	ind_1				;
		return							; 
;============================================================================================
preobAvSP								; вычисление средней скорости и ее индикация
										; пройденное расстояние надо разделить на время
; входные 	Put_hi,Put_lo				; пройденный путь								
; clock_h,clock_l						; значение в сеундах, мах значение 18 часов, 12 минут, 15 сек.
; выходные 	SP_sred_hi,SP_sred_lo		; средняя скорость движения

; преобразуем секунды в десятичное значение часов 
			bsf		STATUS,RP0			; выбор банка 1			
; результат:	rez_u  rez_h  rez_l		;
			bcf		STATUS,RP0			; выбор банка 0
			movfw	PutS_up				; пройденного пути
			bsf		STATUS,RP0			; выбор банка 1
			movwf	shiftU				;
			bcf		STATUS,RP0			; выбор банка 0
			movfw	PutS_hi				;
			bsf		STATUS,RP0			; выбор банка 1
			movwf	shiftH				;
			bcf		STATUS,RP0			; выбор банка 0
			movfw	PutS_lo				;
			bsf		STATUS,RP0			; выбор банка 1
			movwf	shiftL				;
			
			
			movfw	clockS_u
			movwf	dlih_u				; время в формате ххх.х секунды
			movfw	clockS_h			; загрузка текущех секунд
			movwf	dlih_h				;
			movfw	clockS_l			;
			movwf	dlih_l				;

			call	divizn				;
			
			btfsc	rez_h,7
		goto	ind0
;			bsf		STATUS,RP0			; выбор банка 1
			movfw	rez_h				; 			
			bcf		STATUS,RP0			; выбор банка 0
			movwf	SP_sred_hi			; 
			movwf	binh				;
			bsf		STATUS,RP0			; выбор банка 1
			movfw	rez_l				; 				
			bcf		STATUS,RP0			; выбор банка 0
			movwf	SP_sred_lo			;
			movwf	binl				;
			
;			bsf		BTE					;
			call	bin_dec				;
			bcf		TOCHKA1				; индикация скорости
			bcf		TOCHKA2				; 
			bcf		TOCHKA3				; 

			movfw	edin				; 
			movwf	ind_3				; 
			movfw	dest				; 
			movwf	ind_2				; 
			movfw	sotn				; 
			movwf	ind_1				;
		return							; 
ind0
			bcf		STATUS,RP0			; выбор банка 0
			bcf		TOCHKA1				; индикация недостаточно данных
			bcf		TOCHKA2				; 
			bcf		TOCHKA3				;
			movlw	cM					; 
			movwf	ind_3				; 
			movlw	cn					; 
			movwf	ind_2				; 
			movlw	cM					; 
			movwf	ind_1				;
		return							; 
;============================================================================================
preobrcloc						; преобразование двоичного времени в двоично десятичное
; входные 	clock_h,clock_l				; значение в сеундах, мах значение 18 часов, 12 минут, 15 сек.
; выходные 	chasy_h,chasy_l				; 
; промежуточные cekundy,minuny_h,minuny_l
; подпрограммы divizn (деление),D_mpyS (умножение) 
			bsf		STATUS,RP0			; выбор банка 1			
			clrf	shiftU				;
			movfw	clock_h				;
			movwf	shiftH				;
			movfw	clock_l				;
			movwf	shiftL				;
			
			clrf	dlih_u				;
			movlw	high	.60			;
			movwf	dlih_h				;
			movlw	low		.60			;
			movwf	dlih_l				;
			call	divizn				;
			
			movfw 	ost_l				; количество секунд
			movwf	cekundy				;
			
			clrf	shiftU				;
			movfw	clock_h				;
			movwf	shiftH				;
			movfw	clock_l				;
			movwf	shiftL				;
			clrf	dlih_u				;
			movlw	high	.3600		;
			movwf	dlih_h				;
			movlw	low		.3600		;
			movwf	dlih_l				;
			call	divizn				;
			
			movfw	rez_h				; количество часов
			movwf	chasy_h				;
			movfw	rez_l				;
			movwf	chasy_l				;
			
			movfw	ost_h				;
			movwf	shiftH				;
			movfw	ost_l				;
			movwf	shiftL				;			
			clrf	dlih_u				;
			movlw	high	.60			;
			movwf	dlih_h				;
			movlw	low		.60			;
			movwf	dlih_l				;
			call	divizn				;

			movfw	rez_h				;
			movwf	shiftH				;
			movfw	rez_l				;
			movwf	shiftL				;
			clrf	dlih_u				;
			movlw	high	.100		;
			movwf	dlih_h				;
			movlw	low		.100		;
			movwf	dlih_l				;
		
			call	D_mpyS				;
			movfw	rez_h				;
			movwf	minuny_h			; количество минут * 100
			movfw	rez_l				;
			movwf	minuny_l			;

			movfw	chasy_h				;
			movwf	shiftH				;
			movfw	chasy_l				;
			movwf	shiftL				;
			clrf	dlih_u				;
			movlw	high	.10000		;
			movwf	dlih_h				;
			movlw	low		.10000		;
			movwf	dlih_l				;
		
			call	D_mpyS				;
			movfw	rez_h				;
			movwf	chasy_h				;
			movfw	rez_l				;
			movwf	chasy_l				;
			
			movfw	minuny_l			;
			addwf	chasy_l,f			;
			btfsc	STATUS,C			;
			incf	chasy_h,f			;
			movfw	minuny_h			;
			addwf	chasy_h,f			;

			movfw	cekundy				; преобразованное значение
			addwf	chasy_l,f			; к виду ЧЧ.ММ.СС
			btfsc	STATUS,C			;
			incf	chasy_h,f			;
			
			bsf		STATUS,RP0			; выбор банка 1
			movfw	chasy_h				; 			
			bcf		STATUS,RP0			; выбор банка 0
			movwf	binh				; 
			bsf		STATUS,RP0			; выбор банка 1
			movfw	chasy_l				; 				
			bcf		STATUS,RP0			; выбор банка 0
			movwf	binl				;
;---------------------------------------- 
			bsf		BTE0_00				;
			call	bin_dec				;
;---------------------------------------- 
			movf	stys,f			 	; определение вида индикации 
			btfss	STATUS,Z			; 
		goto	ti_stys			 	 	;
			movf	dtys,f			 	; определение вида индикации 
			btfss	STATUS,Z			; 
		goto	ti_dtys			 	 	; 			
			movf	tysc,f			 	; определение вида индикации 
			btfss	STATUS,Z			; 
		goto	ti_tysc			 	 	; 
			bsf		TOCHKA1				; индикация М.СС
			bcf		TOCHKA2				; 
			bcf		TOCHKA3				; 
			movfw	edin				; 
			movwf	ind_3				; 
			movfw	dest				; 
			movwf	ind_2				; 
			movfw	sotn				; 
			movwf	ind_1				;
		return							; 
ti_tysc		bcf		TOCHKA1				; индикация ММ.С
			bsf		TOCHKA2				; 
			bcf		TOCHKA3				; 
			movfw	dest				; 
			movwf	ind_3				; 
			movfw	sotn				; 
			movwf	ind_2				; 
			movfw	tysc				; 
			movwf	ind_1				;
		return							; 
ti_dtys		bsf		TOCHKA1				; индикация Ч.ММ.
			bcf		TOCHKA2				; 			
			bsf		TOCHKA3				; 
			movfw	sotn				; 
			movwf	ind_3				; 
			movfw	tysc				; 
			movwf	ind_2				; 
			movfw	dtys				; 
			movwf	ind_1				;
		return							; 
ti_stys		bcf		TOCHKA1				; индикация ЧЧ.М.
			bsf		TOCHKA2				; 			
			bsf		TOCHKA3				; 
			movfw	tysc				; 
			movwf	ind_3				; 
			movfw	dtys				; 
			movwf	ind_2				; 
			movfw	stys				; 
			movwf	ind_1				;
		return							;
;============================================================================================
;============================================================================================
;               Умножение с Двойнай Точностью  ( 16x16 -> 32 )
; входные А и В выходные В и С,; В - старшее слово, С - младшее слово
; входные А		shiftU  shiftH  shiftL	;A
; входные В		dlih_u  dlih_h  dlih_l	;B
; результат:	rez_u  rez_h  rez_l		;C
; остаток:		ost_u  ost_h  ost_l		;D остаток

D_mpyS			movf    shiftH,W
				xorwf   dlih_h,W
				movwf  	sign
				btfss   dlih_h,7        			; if MSB set go & negate ACCb
		goto    $+6
   				comf    dlih_l,F       			; дополнение В
				incf    dlih_l,F
				btfsc   STATUS,Z
				decf    dlih_h,F
				comf    dlih_h,F
		 		btfss   shiftH,7       			; if MSB set go & negate ACCa
		goto	$+6
		  		comf    shiftL,F       			; дополнение А
				incf    shiftL,F	
				btfsc   STATUS,Z
				decf    shiftH,F
				comf    shiftH,F
  				
				movlw   .16            	 		; for 16 shifts
				movwf  	temp1
				movf    dlih_h,W          		;move b to d
				movwf  	ost_h
				movf    dlih_l,W
				movwf  	ost_l
				clrf    dlih_h
				clrf    dlih_l
				
				call	mulMac
				decfsz	temp1,f
				goto	$-2
				
				btfss   sign,7
		retlw   0
				comf    rez_l,F       			; дополение CB ( -CB -> CB )
				comf    rez_h,F
				comf    dlih_l,F
				comf    dlih_h,F
				incf    rez_l,F
				btfsc   STATUS,Z
				incf	rez_h,F
				btfsc   STATUS,Z
				incf	dlih_l,F
				btfsc  	STATUS,Z
				incf   	dlih_h,F
	retlw   0
;========================================
mulMac			rrf     ost_h,F       			; вращать d право
				rrf     ost_l,F
				btfss   STATUS,C    			;need to add?
			goto    NO_ADD         		 		; no addition necessary
				movf    shiftL,W        			; Addition ( ACCb + ACCa -> ACCb )
				addwf   dlih_l,F       			;add lsb
				btfsc   STATUS,C    			;add in carry
				incf    dlih_h,F
				movf    shiftH,W
				addwf   dlih_h,F       			;add msb
NO_ADD  		rrf     dlih_h,F
				rrf     dlih_l,F
				rrf     rez_h,F
				rrf     rez_l,F
	return
;============================================================================================


;============================================================================================
; SUBROUTINE - 24 BIT DIVISION
; делимое:		shiftU  shiftH  shiftL	;A
; делитель:		dlih_u  dlih_h  dlih_l	;B
; результат:	rez_u  rez_h  rez_l		;C
; остаток:		ost_u  ost_h  ost_l		;D остаток
;
divizn		movlw 	D'24'				; 
		    movwf 	BCount				; 

		    clrf 	rez_u				; 
        	clrf 	rez_h				; 
		   	clrf 	rez_l				; 
   			clrf 	ost_u				; 
			clrf 	ost_h				; 
			clrf 	ost_l				; 

dloop		bcf 	STATUS,C			; 
			rlf 	shiftL,f			; 
    		rlf 	shiftH,f			; 
			rlf 	shiftU,f			; 
    		rlf 	ost_l,f				; 
			rlf 	ost_h,f				; 
			rlf 	ost_u,f				; 
        		
			movf 	dlih_u,w			; 
			subwf 	ost_u,w				; 
			btfss 	STATUS,Z			; 
		goto 	nochk					; 
        		;
			movf 	dlih_h,w			; 
			subwf 	ost_h,w				; 
			btfss 	STATUS,Z			; 
		goto 	nochk
		        ;
			movf 	dlih_l,w			; 
			subwf 	ost_l,w				; 
nochk		btfss 	STATUS,C			; 
		goto 	nogo					; 
        		;
			movf 	dlih_l,w			; 
			subwf 	ost_l,f				; 
			btfss 	STATUS,C			; 
			decf 	ost_h,f				; 
			movf 	ost_h,w				; 
			xorlw 	0xff				; 
			btfsc 	STATUS,Z			; 
			decf 	ost_u,f				; 
			movf 	dlih_h,w			; 
			subwf 	ost_h,f				; 
			btfss 	STATUS,C			; 
			decf 	ost_u,f				; 
			movf 	dlih_u,w			; 
			subwf 	ost_u,f				; 
			bsf 	STATUS,C			; 
nogo		rlf 	rez_l,f				; 
			rlf 	rez_h,f				; 
			rlf		rez_u,f				; 
			decfsz	BCount,f			; 
		goto	dloop					; 
		return							; 
;============================================================================================



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

			btfsc	COMGO			; настройка компаратора Город
		goto	u_COMGO				; 
			btfsc	COMTR			; настройка компаратора Трасса
		goto	u_COMTR				; 
			btfsc	CALIB			; калибровка спидометра
		goto	u_CALIB				; 
			btfsc	GASHN			; фунцкия гашения дисплея
		goto	u_GASHN				; 
			btfsc	FURES			; функция рестарта системы при включении
		goto	u_FURES				; 
 

	return		
;====================================
; настройка компаратора Город
u_COMGO		btfsc	f_RB_3			; + увеличение
		goto	kk_COMGO			;
			movlw	high	.2000	;
			movwf	peAsh			;
			movlw	low		.2000	;
			movwf	peAsl			;
			
			movf	comG_hi,w		;
			movwf	peBsh			;
			movf	comG_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	COMGO_d					;
 			movlw	.10				;
			addwf	comG_lo,f		;
			btfsc	STATUS,C		;
			incf	comG_hi,f		;
	goto	COMGO_d					;

;------------------------------------
kk_COMGO		; - уменьшение
			movf	comG_hi,w		;
			movwf	peAsh			;
			movf	comG_lo,w		;
			movwf	peAsl			;			
			
			movlw	high	.600	;
			movwf	peBsh			;
			movlw	low		.600	;
			movwf	peBsl			;

			call	sravnenie		;
			btfss	BOL				;
		goto	COMGO_d				;
			movlw	.10				;
			subwf	comG_lo,f		;
			btfss	STATUS,C		;
			decf	comG_hi,f		;
	goto	COMGO_d					;
;==============================================
; настройка компаратора Трасса
u_COMTR		btfsc	f_RB_3			; + увеличение
		goto	kk_COMTR			;
			movlw	high	.2000	;
			movwf	peAsh			;
			movlw	low		.2000	;
			movwf	peAsl			;
			
			movf	comT_hi,w		;
			movwf	peBsh			;
			movf	comT_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	COMTR_d					;
 			movlw	.10				;
			addwf	comT_lo,f		;
			btfsc	STATUS,C		;
			incf	comT_hi,f		;
	goto	COMTR_d					;

;------------------------------------
kk_COMTR	; - уменьшение
			movf	comT_hi,w		;
			movwf	peAsh			;
			movf	comT_lo,w		;
			movwf	peAsl			;			
			
			movlw	high	.600	;
			movwf	peBsh			;
			movlw	low		.600	;
			movwf	peBsl			;

			call	sravnenie		;
			btfss	BOL				;
		goto	COMTR_d				;
			movlw	.10				;
			subwf	comT_lo,f		;
			btfss	STATUS,C		;
			decf	comT_hi,f		;
	goto	COMTR_d					;
;==============================================
; калибровка спидометра
u_CALIB		btfsc	f_RB_3			; + увеличение
		goto	kk_CALIB			;
			movlw	high	.200	;
			movwf	peAsh			;
			movlw	low		.200	;
			movwf	peAsl			;
			
			movf	coli_hi,w		;
			movwf	peBsh			;
			movf	coli_lo,w		;
			movwf	peBsl			;
			call	sravnenie		;
			btfss	BOL				;
	goto	CALIB_d					;
 			movlw	.10				;
			addwf	coli_lo,f		;
			btfsc	STATUS,C		;
			incf	coli_hi,f		;
	goto	CALIB_d					;

;------------------------------------
kk_CALIB	; - уменьшение
			
			movf	coli_hi,w		;
			movwf	peAsh			;
			movf	coli_lo,w		;
			movwf	peAsl			;			
			
			movlw	high	-.200	;
			movwf	peBsh			;
			movlw	low		-.200	;
			movwf	peBsl			;

			call	sravnenie		;
			btfss	BOL				;
		goto	CALIB_d				;
			movlw	.10				;
			subwf	coli_lo,f		;
			btfss	STATUS,C		;
			decf	coli_hi,f		;
	goto	CALIB_d					;
;====================================
u_GASHN			;активация таймера выключения индикации контроллера (использование входа)		
			btfsc	f_RB_2			; 
		goto	kk_GASHN			;
			bsf		FGDS			;
	goto	GASHN_d					;
kk_GASHN	btfsc	f_RB_3			; 
	goto	GASHN_d					;	
			bcf		FGDS			;
	goto	GASHN_d					;		
;====================================
;====================================
u_FURES			; активация функции сброса при включении				
			btfsc	f_RB_2			; 
		goto	kk_FURES			;
			bsf		FRES			;
	goto	FURES_d					;
kk_FURES	btfsc	f_RB_3			; 
	goto	FURES_d					;	
			bcf		FRES			;
	goto	FURES_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				; повториь если не ноль
			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
;********************************************************************************************
;********************************************************************************************
;				запрет записи в EEPROM
stop_wr_e		
			bsf		STATUS,RP0		; выбрать банк 1
			btfsc	EECON1,WR		; ожидания окончания сохранения данных в EEPROM
			goto	$-1
			bcf		EECON1,WREN		; запретить запись			
			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							;
;============================================================================================
condid			; Чтение информации с датчиков (цифровая задежка на предачю 2 секунды)
;========================================
			btfsc	CONPI				; 
	goto	$+.10						; 
			btfss	CONPI_p				;			
		goto	$+.4					;
			movlw	.20					;
			movwf	zad_CONPI			;
			bcf		CONPI_p				;
			movf	zad_CONPI,f			; проверить таймер отработал
			btfsc	STATUS,Z			;
			bcf		CONPIF				;	
			goto	$+.9				;
			btfsc	CONPI_p				;
		goto	$+.4					;
			movlw	.20					;
			movwf	zad_CONPI			;
			bsf		CONPI_p				;
			movf	zad_CONPI,f			; проверить таймер отработал
			btfsc	STATUS,Z			;
			bsf		CONPIF				;
		return				;
;============================================================================================
hotstart				; программа сброса параметров времени пиковых оборотов
			btfss	FRES				; функция рестарта системы при включении
		return							;
			btfss	CONPIF				;
		goto	sbrfl					;
			btfsc	CONPIFp				;
		return							;
			bsf		CONPIFp				;
			bsf		STATUS,RP0			; выбор банка 1
			clrf	clock_h				; сброс показание - новое включение автомобиля
			clrf	clock_l				;
			bcf		STATUS,RP0			; выбор банка 0
			clrf	SPEED_max_hi		; пиковая скорость
			clrf	SPEED_max_lo		; 		
			clrf	SP_sred_hi			; средняя скорость
			clrf	SP_sred_lo			; 
			clrf	Put_hi				;  счетчик одометра
			clrf	Put_lo				; 
			clrf	PutS_up				; 
			clrf	PutS_hi				; 
			clrf	PutS_lo				; 			
			clrf	clockS_u			; 
			clrf	clockS_h			; 
			clrf	clockS_l			;
		return							;
sbrfl		bcf		CONPIFp				;			
		return							;
;============================================================================================
cleardt
vos_data	; инциализация данных в результате сбоя и сохранения в EEPROM
			bsf		STATUS,RP0			; выбрать банк 1
			clrf	TRISB				; и настроить все линии порта на вывод 
			bcf		STATUS,RP0			; выбрать банк 0
						
		
			clrf	flag_0				; 
			movlw	0x03
			movwf	comG_hi			;*Задание уровня температуры 30,0 г	
			movlw	0x20				;
			movwf	comG_lo			;*
			
			movlw	0x05
			movwf	comT_hi			;*Задание уровня температуры 30,0 г	
			movlw	0x14				;
			movwf	comT_lo			;*
			

			clrf	coli_hi			;*Задание уровня температуры 30,0 г	
			clrf	coli_lo			;*
			
			call	zap_eeprom			; записать в память заводские установки 

alr_d
			bcf		RELE1				; линия реле 
			clrf	flag_i1				; 
			
			movlw	.50					; 
			call	big_str				;бегущая строка авария данных
		goto	alr_d					; 
;============================================================================================
;********************************************************************************************
				FILL(goto 0x00),0x800-$   		; заполнить все оставшееся место кодом



;============================================================================================
; initialize eeprom locations
;============================================================================================										
;++++++++++++++++++++++++++Данные для записи в EEPROM +++++++++++++++++++++++++++++++++++++++
			ORG		0x2100						; 							
			DE		.00,.00 					;flag_0 - флаги состояния работы контроллера
			DE		0x03,0x03,0x20,0x20			;comG_hi,comG_lo	80 km- установки компаратора город
			DE		0x05,0x05,0x14,0x14			;comT_hi,comT_lo	130km- установки компаратора трасса
			DE		0x00,0x00,0x00,0x00			;coli_hi,coli_lo 00- калибровочная величина для коррекции показаний спидометра
			DE		.0,.0						; 							
;============================================================================================

	END											; directive 'end of program'

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