;**********************************************************************
;                                                                     *
;    Filename:	    CH-KON-100-01.asm                                 *
;    Date:                                                            *
;    File Version: V01                                                *
;                                                                     *
;    Author:        Gena Chernov                                      *
;    Company:       MAGETEX, protkt - OpenVoron                       *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;                                                                     *
;    Files required:  индикатор кодов RC-6                            *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
	list      p=16f648A           		; list directive to define processor
	#include <p16F648A.inc>       		; processor specific variable definitions
             	
	errorlevel  2            			; suppress message 302 from list file

	__CONFIG   _CP_ON & DATA_CP_ON & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 


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

reg_ind							; регистр индикации выбора знакоместа
b_zad_ind						; переменная длительности индикации
;================================
cher300_10						; 
cher02							; 
cher05							; 
;================================
;temp_c

;================================
flag_i1							; флаги индикации
flag_i2							; флаги индикации
flag_1							; флаги управления
flag_11							; 
flag_12							; 
flag_2							; флаг выбора параметров настройки регулятора
flag_3							; флаги управления
flag_4							; флаги управления
flag_5							; 
;================================

;========================================
; регистры программы десятичного преобразования
;========================================
; служебные
flag_s							; 
count							; 
temp							; 
R3								; 
R2								; 
R1								; 
R0								; 
; входные
binu							; 
binh							; 
binl							; 
; выходные
edin							; единицы
dest							; десятки
sotn							; сотни
tysc							; тысячи
dtys							; дестки тысяч
stys							; сотни тысяц
mlon							; милионы
;========================================


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

t_binu
t_binh
t_binl

;========================================
synh_bayt,data_bayt
klav_naj						; переменная формирования длительности нахатия клавиши
flag_13
chetch_polbit				; счетсик загружаемых полу байт
reg_ik						; приемный порт ИК порта

	endc
;========================================
	cblock	0x07c	
;================================
w_FSR
w_temp                     		; variable used for context saving 
status_temp                		; variable used for context saving
pclath_temp        	  			; variable used for context saving
;=================================
	endc
;========================================
	cblock	0x0A0

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

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

	endc	
;========================================


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

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

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

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

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


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

;=================================
#define		B_MIG	flag_1,0	; бит мигания (1 потушен, 0 горит)

;=================================
#define		KOD_YES	flag_1,4	; бит данные готовы
#define		pspn	flag_1,5	; 
;=================================
#define		BPN		flag_1,6	; бит пропуска набора при вызове индикации параметров функции при  нажатии на клавишу коррекции параметра
;=================================

;bank 0
#define		BITZ_N	flag_12,1	; бит начала байта
#define		BITZ_P	flag_12,2	; бит конца байта
#define		S0		flag_12,3	; бит начала сканирования посылки
#define		S1		flag_12,4	; 
#define		S2		flag_12,5	; 
#define		S3		flag_12,6	; 

;bank 1
#define		KD		flag_13,0	; контроль ожидания синхроимпульса
#define		PBP		flag_13,1	; бит контроля повторного прерывания по большому периоду
#define		P_M_B	flag_13,2	; бит типа текущего периода 0 малый 1-большой
#define		KO		flag_13,3	; 
#define		KMPER	flag_13,4	; контроль малого периода
#define		KBPER	flag_13,5	; контроль большого периода
;=================================
#define		IRDA_DU	PORTB,0		; 
;=================================



#define		E_data	flag_3,3	; флаг ошибки данных
#define		MINUS	flag_3,4	; бит измерения отрицательных температур
#define		ERROR_D	flag_3,5	; авария датчика температуры
#define		oh_te	flag_3,6	; показания датчика температуры выходят за разрешенные пределы
;=================================

#define		RSF		flag_4,0	; бит формирования импульса Reset Далласа
#define		CT		flag_4,1	; бит цикла измерения/чтение температуры
#define		MINUS_d	flag_4,2	; бит измерения отрицательных температур
#define		B24		flag_4,3	;
#define		BTE		flag_4,4	; бит гашения первых нулей до 00
#define		BTE0_00	flag_4,5	;
#define		BRACON	flag_4,6	; бит разрешения автоконтроля
#define		zad_op	flag_4,7	; бит разрешения 
;=================================
;=================================
; биты программы индикации
#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		SPUAN	.15			; значение скорости автонабора по умолчанию
;#define		DIND	.10			; длительность находжения в режиме настройки (автовыход через - .10 секунд)
#define		DAN		.13			; 
;======================================================================================
; символы знакогенератора
#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
;======================================================================================


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

			pagesel	preryvanie			; 
			call	preryvanie			; 
			pagesel	pren				; 
pren			
			movf	w_FSR,w     	  	; 
			movwf	FSR   	   		 	; 
			movf    pclath_temp,w     	; retrieve copy of PCLATH register
			movwf	PCLATH            	; restore pre-isr PCLATH register contents
			movf    status_temp,w     	; retrieve copy of STATUS register
			movwf	STATUS            	; restore pre-isr STATUS register contents
			swapf   w_temp,f			; 
			swapf   w_temp,w          	; restore pre-isr W register contents
		retfie                   	 	; return from interrupt
;=======================================================================================================
;*************************************************************************************************************************************************
deshif
;				movwf	temp_c
;======================
;				movlw	HIGH adr_str	; PCLATH настройка регистра страницы для 
;				movwf	PCLATH			; правильного выполнения команды "addwf	PCL,F"
;======================
;				movfw	temp_c			; ЗАГРУЗКА АДРЕССА бита регистра яркости
			addwf	PCL,f			; дешифратор цифр
adr_str		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"-"минус"				
;*************************************************************************************************************************************************
;*************************************************************************************************************************************************

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


;============================================================================================
; очистка памяти данных				; 
main		movlw	0x5				; банк 0
			movwf	FSR				; 
ClfMem0		clrf	INDF			; 
			incf	FSR,f			; 
			movlw	0x80			;
			subwf	FSR,w			;
			BNZ 	ClfMem0			;
			clrf	INDF			; 			
;============================================================================================
			movlw	0xA0			; банк 1
			movwf	FSR				; 
ClfMem1		clrf	INDF			; 
			incf	FSR,f			; 
			movlw	0xff			;
			subwf	FSR,w			;
			BNZ 	ClfMem1			;
			clrf	INDF			; 	
;============================================================================================
;============================================================================================
;инициализация процессора
			clrwdt					; сброс сторожевого таймера++++++
;====================================
			movlw	0x07			; 0x07 код
			movwf	CMCON			; отключить компараторы
;====================================
			bsf		STATUS,RP0		; выбор банка 1
				; настройка таймера	TMP0. и INT0 входа	; 
			movlw	b'10000011'		; подтягив. резисторы выключены, пределитель к ТМР0, коэф. 1:16, прерывание
			movwf	OPTION_REG		; по INT0 по заднему фронту
;====================================
			movlw	b'00001000'		;  RA3- вход датчика температуры
			movwf	TRISA			;
			movlw	b'00000001'		;  RB0 - вход инфракрасного порта
			movwf	TRISB			; 
;==================================== 
		; настройка таймера	TMP1	; 
			bcf		STATUS,RP0		; выбрать банк 0
			movlw	b'00000001'		; таймер включен, предделитель 4 мг = 1:1 - 1 000 000 гц
			movwf	T1CON			;
;============================================================================================
	; инициализация переменных


			
			movlw	.2				; счетчик 10 гц выход 1 секунда
			movwf	cher300_10		; 
			movwf	cher02			; 
			movwf	cher05			; 
			

			pagesel	aaaaaaaaaaaaaa	; 

aaaaaaaaaaaaaa
;============================================================================================
		; настройка прерываний		; 
			movlw	b'11110000'		; разрешить от ТМР0 и INT0
			movwf	INTCON			; разрешить прерывания от переферийных устройств
;============================================================================================
;============================================================================================
		
;============================================================================================
; цикл работы 
ind
 
			movfw	data_bayt			; 				
			movwf	binl				;
			bsf		BTE					; 
			call	bin_dec				;
			
			movfw	edin				; 
			movwf	ind_3				; 
			movfw	dest				; 
			movwf	ind_2				; 
			movfw	sotn				; 
			movwf	ind_1				; 
			
			;==============				;			
			call	ind_zad				;
			;==============				;
			movlw	.20					;
			movwf	b_zad_ind			;

;--------------------------------------------				

			goto	ind					; режим индикации и регулирования/режим установки

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







	
;******************** цикл индикации *************************************************************
ind_zad								; задежка вывода индикации
			clrwdt					; сброс сторожевого таймера++++++
			movf	b_zad_ind,f		;	
			BNZ		$-3				;
			movlw	.60				;
			movwf	b_zad_ind		;
		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,C        ; 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
			bcf	INTCON,GIE	
	 			movlw   R0				;
				movwf   FSR				;
				call    adjBCD			;
		 		movlw   R1				;
				movwf   FSR				;
				call    adjBCD			;
				movlw   R2				;
				movwf   FSR				;
				call    adjBCD			;
				movlw   R3				;
				movwf   FSR				;
				call    adjBCD			;
			bsf	INTCON,GIE
			goto    loop24				;
;===============================================
adjBCD 			movlw   3				;
				addwf   INDF,W			;
				movwf   temp			;
				btfsc   temp,3          ; test if result > 7
				movwf   INDF			;
				movlw   30				;
				addwf   INDF,W			;
				movwf   temp			;
				btfsc   temp,7          ; test if result > 7
				movwf   INDF    	       ; save as MSD
		RETLW   0						;
;===============================================
;============================================================================================					
;============================================================================================

;********************************************************************************************************
conv_t								; конвертирование значения температуры

hhhhh
			movfw	edin			; 
			movwf	ind_3			; 
			movfw	dest			; 
			movwf	ind_2			; 
			movfw	sotn			; 
			movwf	ind_1			; 				
		return						; 


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



;=======================================================================================================
			org 0x800
;=======================================================================================================

;=======================================================================================================
preryvanie
;========================================================================== 
			bcf		STATUS,RP0			; выбор банка 0
			;===============================================
			btfss	INTCON,T0IF			; определить преывание от ТМR0
		goto	end_TMR0
			bcf		INTCON,T0IF			; сбросить флаг прерывания от модуля ТМR0						
			movlw	.46					; делитель до 300 Гц
			movwf	TMR0				; необходимо предустановить счетчик	
;========================================================================== 
;============== период 	300 Гц	
;========================================================================== 
;==============	программа формирования задежки индикации символов
			movf	b_zad_ind,f			; проверить время задежки вышло
			BZ		$+2					;
			decf	b_zad_ind,f			; 
;========================================================================== 
;======================================== 
;==============	программа обслуживания работы индикатора
			call	indic				;
;======================================== 
;========================================================================== 
			decfsz	cher300_10,f		; счетчик делитель длительности до 10 Гц 
			goto	end_TMR0				; 
			movlw	.30					; если достигнут ноль востановить счетчик
			movwf	cher300_10			;
;========================================================================== 
;======== период 	10 Гц		
;========================================================================== 


;========================================================================== 
			decfsz	cher05,f			; счетчик делитель длительности до 2 Гц 
			goto	end_TMR0				; 
			movlw	.5					; если достигнут ноль востановить счетчик
			movwf	cher05				;
;========================================================================== 
;============== период 	2 Гц
;========================================================================== 
			btfss	B_MIG				; цикл управления прерывистой индикацией
			goto	$+3					;
			bcf		B_MIG				;
			goto	$+2					;
			bsf		B_MIG				;
;========================================================================== 			
			decfsz	cher02,f			; счетчик делитель длительности до 1 Гц 
			goto	end_TMR0				; 
			movlw	.2					; если достигнут ноль востановить счетчик
			movwf	cher02				; период 1 Гц
;==========================================================================
;============== период 	1 Гц start		;				
;========================================================================== 			
	
;==========================================================================
;============== период 	1 Гц end
;========================================================================== 
end_TMR0
;========================================================================== 
;========================================================================== 
;========================================================================== 
; сама программа декодирования RC-5
;============================================== программа обработки прерываний от 		
			bcf		STATUS,RP0			; выбор банка 0	
			; прерывание от порта всегда разрешено		
			btfss	INTCON,INTE			; проверка прерывания по INT0I разрешено?
		return							;
			btfss	INTCON,INTF			; тестироваит прерывание от порта ввода вывода (от синхронизации сети)
		goto	pr_ccp					; если нет то прерывание от таймера
			bcf		INTCON,INTF			; если да, то сбросить флаг прерывания
;======================================== определение длительности периода тактирования сигнала
			bsf		STATUS,RP0			; выбор банка 1
			btfsc	OPTION_REG,INTEDG	; изменение полярности прерывания
		goto	$+.3					; 
			bsf		OPTION_REG,INTEDG	; по переднему
		goto	$+.2					; 
			bcf		OPTION_REG,INTEDG	; по заднему
;======================================== 
	; контроль прерыванйи по входу INT во время работы модуля ССР т.е. формирование малого и большого периода
	; дедектирования уровня сигнала
			bcf		STATUS,RP0			; выбор банка 0	
			btfss	S2					; контроль старт бита выполнен ( только после этого можно включать
		goto	stpp					; контроль периодов)
			btfss	KMPER				; контроль малого периода
		goto	conbp					; в момент большого это нормально
		goto	error_ir				; в момент малого периода это ОШИБКА
conbp		btfss	KBPER				;
		goto	stpp					;
			btfsc	PBP					; если приходит второе прерывание по входу INT0
		goto	error_ir				; в момент большого это ОШИБКА			
			bsf		PBP					; прерывание большого периода выполнено
		return							;
;======================================== ; контроль старт бита
stpp		btfsc	S3					; это начала посылки? 0 - начало передачи пакета
		goto	zagmd					;
			bsf		S3					; да это начало
			movlw	.28					; инициализировать счетчик полубит
			movwf	chetch_polbit		;
			clrf	reg_ik				; очистить сдвиговый регистра
;======================================== 
zagmd		; загрузка малой длительности		
			bcf		PBP					; инициализировать бит контроля прерывания ИНТ в момет большого периода	
			bcf		KD					; отключить контроль ожидания синхроимпульса	
			bsf		KMPER				; контроль малого периода включить		
			movlw	0x01				; загрузка 1/4 периода сигнала (тактовая 4 мГц)			
			movwf	CCPR1H				;
			movlw	0xA4				; 0xA4
			movwf	CCPR1L				;
			clrf	TMR1L				; очистить TMR1
			clrf	TMR1H				; синхронизировать таймер			
			movlw	b'00001011'			; включить модуль ССР1						
			movwf	CCP1CON				; 
			bsf		STATUS,RP0			; выбор банка 1
			bsf		PIE1,CCP1IE			; разрещить прерывание от модуля ССP1			
			bcf		STATUS,RP0			; выбор банка 0				
			bcf		PIR1,CCP1IF			; сбросить прерывание
		return							; 			
;======================================== 
pr_ccp		; обработка прерываний от модуля ССР
			bsf		STATUS,RP0			; выбор банка 1
			btfss	PIE1,CCP1IE			; проверка прерывания по CCP1 разрешено?
	return								; 
			bcf		STATUS,RP0			; выбор банка 0
			btfss	PIR1,CCP1IF			; 
	return								; если нет то прерывание от таймера
			bcf		PIR1,CCP1IF			; если да, то сбросить флаг прерывания
;======================================== 
			btfsc	KD					; контроль длительности, ожидания синхроимпульса
		goto	error_ir				;			
			decfsz	chetch_polbit,f		;
		goto	$+.2					;	
		goto	conskan					;
;========================================			
			btfsc 	S2 					; бит контроля выполнения условия СТАРТА
		goto	ob_rbit					; условие старта выполнено
			btfsc 	S1 					; условие бита 2 старта выполенно			
		goto	ks2						;
			btfsc 	S0 					; условие бита 1 старта выполенно
		goto	ks1						;
ks0			btfsc 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
		goto	error_ir				;
			bsf		S0					;
		goto	ob_rbit					;
ks1			btfss 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
		goto	error_ir				;
			bsf		S1					;
		goto	ob_rbit					;
ks2			btfsc 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
		goto	error_ir				;
			bsf		S2					;
;========================================
ob_rbit		btfss	P_M_B				; выбор длительности контроля длительности 0-малая,1-большая
		goto	decodi_mal				; обработка уровня малого периода	
				; обработка уровня большого периода	
			bcf		P_M_B				; подготовка бита обоработки малого периода				
			movlw	0x06				; загрузка длительности ожидания синхроинмпульса			
			movwf	CCPR1H				; 0x03
			movlw	0x00				; 0x48			
			movwf	CCPR1L				;
;======================================== 			
			bsf		KD					; включить контроль длительности ожидания синхроимпульса
			bcf		PBP					; сбросить бит контроля повторного прерывания в момент большого периода
			bcf		KMPER				; контроль малого периода отключить	
			bcf		KBPER				; контроль большого периода	отключить		
;======================================== чтение состояния уровня по входу IRDA_DU первый полубайт
			btfss 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
			bcf 	BITZ_N 				; установить BITZ_N в "0" 
			btfsc 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
			bsf 	BITZ_N				; нет установить BITZ_N в "1" 
		return							;
;========================================		
decodi_mal				; обработка уровня малого периода									;
			bsf		P_M_B				; загрузка большого периода
			movlw	0x03				; загрузка 1/2периода сигнала (тактовая 4 мГц)			
			movwf	CCPR1H				; 0x03
			movlw	0x48				; 0x48			
			movwf	CCPR1L				;
			bcf		PBP					; сбросить бит контроля повторного прерывания в момент большого периода 			
			bcf		KMPER				; контроль малого периода отключить
			bsf		KBPER				; контроль большого периода
;======================================== пропустить сканирование первого полубита последовательности)
			movlw	.27					;
			subwf	chetch_polbit,w		; первый полубайт не обрабатывать
			btfsc	STATUS,Z			;
		return							;
;======================================== чтение состояния уровня по входу IRDA_DU второй полубайт
			btfss 	IRDA_DU 			; проверить уровень на линии PORTB,1			
			bcf 	BITZ_P 				; установить BITZ_N в "0" 
			btfsc 	IRDA_DU 			; проверить уровень на линии PORTB,1			
			bsf 	BITZ_P				; нет установить BITZ_N в "1" 
;======================================== декодирование полученного бита и запись его в регистр сбвига
			btfss 	BITZ_N				; 
		goto	con2					;
			btfsc 	BITZ_P				; 
		goto	error_ir				; ошибка бита		
			bsf 	STATUS,C 			; установить С в "1" 	
		goto	zagb					;
con2		btfss 	BITZ_P				; 
		goto	error_ir				; ошибка бита		
			bcf 	STATUS,C 			; установить С в "0" 
zagb		rlf 	reg_ik,f 			; сдвиг влево для записи в регистре reg_ik
;========================================
			movlw	.17					; определение окончания формирования байтов			
			subwf	chetch_polbit,w		;
			btfss	STATUS,Z			;
		goto	$+.5					;	
			movfw	reg_ik				; загрузить синхро байт			
			movwf	synh_bayt			; и очистить регистр сдвига
			clrf	reg_ik				;			
	return								; 
			movlw	.1					;			
			subwf	chetch_polbit,w		;
			btfss	STATUS,Z			;
	return								;	
			movfw	reg_ik				; загрузить байт данных
			movwf	data_bayt			; 
			clrf	reg_ik				;			
	return								; 
;========================================
conskan		; процедура окончания сканирования посылки
			btfss 	IRDA_DU 			; проверить уровень на линии IRDA_DU			
		goto	error_ir				; если наблюдается уровень 0 - ОШИБКА
			bsf		KOD_YES				; код "готов"
			movlw	DAN					; функция залипания клавиши
			movwf	klav_naj			; 
;========================================
;			btfsc	TOCHKA3				; индикатор приема IR-данных
;		goto	$+3						; 
;			bsf		TOCHKA3				; 
;		goto	$+2						; 
;			bcf		TOCHKA3				; 
;========================================
error_ir	; метка окончания при ошибке приема данных		
			bsf		STATUS,RP0			; выбор банка 1
			bcf		OPTION_REG,INTEDG	; по заднему
			bcf		PIE1,CCP1IE			; запретить прерывание от модуля ССP2
			bcf		STATUS,RP0			; выбор банка 0
			clrf	CCPR1H				;
			clrf	CCPR1L				;
			clrf	flag_12				; 			
			clrf	flag_13				;			
			clrf	reg_ik				;			
			clrf	CCP1CON				; выключить модуль
			clrf	chetch_polbit		;
	return								; 
;============================================================================================










;==================Индикация=================================================================
;программа управления портами ввода/вывода микроконтроллера	
;============================================================================================
indic								; программа развертки индикацией
;=============================================	
			btfsc	TOCHKA1			; загрузка десятичной точки
			bsf		ind_1,0			; 
			btfsc	TOCHKA2			; 
			bsf		ind_2,0			; 
			btfsc	TOCHKA3			; 
			bsf		ind_3,0			; 
;=============================================	
;=============================================	
i1ry		btfss	reg_ind,0		; 
		goto	i2ry				; 
			movfw	ind_1			; вызов кода индикации первого знакоместа (левого)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR1			; 
			goto	ir1t			; индикация разряда постоянна
;=========================			; 
			btfss	B_MIG			; мигание
			goto	ir1t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir1t			; 
;=========================			; 	
ir1t		btfss	TOCHm1			; 
			goto	ir1				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir1			call	indiprot		; 
			clrf	reg_ind			; 
			bsf		reg_ind,1		; 
	return							; 
;=============================================	
;=============================================		
i2ry		btfss	reg_ind,1		; 
		goto	i3ry				; 
			movfw	ind_2			; вызов кода индикации второго знакоместка (среднего)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR2			; 
			goto	ir2t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir2t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir2t			; 
;=========================			; 		
ir2t		btfss	TOCHm2			; 
			goto	ir2				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir2			call	indiprot		; 
			clrf	reg_ind			; 
			bsf		reg_ind,2		; 
	return							; 
;=============================================	
;=============================================	
i3ry								; 
			movfw	ind_3			; вызов кода индикации третьего знакоместка (правого)
			movwf	r_PORTB			; загрузка порта В
			btfss	RAZR3			; 
			goto	ir3t			; индикация разряда постоянна
;=============================================		
			btfss	B_MIG			; мигание
			goto	ir3t			; если бит 0 знакоместо горит
			movlw	b'00000001'		; 
			andwf	r_PORTB,f		; если бит 1 знакоместо погащено
			goto	ir3t			; 
;=========================			; 		
ir3t		btfss	TOCHm3			; 
			goto	ir3				; точка не мигает
;=========================			; 
			btfss	B_MIG			; мигание точки
			bcf		r_PORTB,0		; если бит 0 точка горит
;=========================			; 
ir3			call	indiprot		;
			clrf	reg_ind			;
			bsf		reg_ind,0		;
	return							; 
;=============================================	
;=============================================	
indiprot	; управления портами ввода вывода 				
			; отключение индикации c охранением состояния портов управления (реле)			
			movfw	PORTB			; загрузка 
			movwf	d_PORTB			; 
			movfw	PORTA			; 
			movwf	d_PORTA			; 
;====================================
			movlw	CL_PA			; очистка порта A (c учетом RA4/3 выхода на реле)  
			andwf	d_PORTA,f		;			
			movlw	SE_PA			; установка битов разрядов индикации в off
			iorwf	d_PORTA,f		; 

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

			btfsc	reg_ind,0		; выбор индикации разряда
			bcf		SOT				; 
			btfsc	reg_ind,1		; 
			bcf		DES				; 
			btfsc	reg_ind,2		; 
			bcf		EDI				; 
;=====================================
;			btfsc	RELE1			; управлением реле нагревателя
;		goto	$+3					; 
;			bcf		d_PORTA,4		; 
;		goto	$+2					; 
;			bsf		d_PORTA,4		; 			
;=====================================			
;			btfsc	RELE2			; управление реле аварии
;		goto	$+3					; 
;			bcf		d_PORTA,0		; 
;		goto	$+2					; 
;			bsf		d_PORTA,0		; 			
;=====================================
			movfw	d_PORTA			; загрузка портов
			movwf	PORTA			; 
			movfw	d_PORTB			; 
			movwf	PORTB			; 
	return							; 
;============================================================================================







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



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







	END                       ; directive 'end of program'

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