;-------------------------------------------------------------------------------------------------
; Дизассемблированная прошивка (файл 12F629_50Hz.hex) от диммера
; ссылка: http://www.elektronika.ba/617/ir-light-dimmer-v1/
; Используется внутренний генератор на 4 МГц.
;-------------------------------------------------------------------------------------------------

	LIST  P=12F629
	INCLUDE   p12f629.inc

END_ROM	equ		3FFh

;	ERRORLEVEL  2		; выдавать сообщения только об ошибках
	ERRORLEVEL  -302	; не выдавать сообщение о некорректном переключения банков
	ERRORLEVEL  -219	; не выдавать сообщение о некорректном обращении к SFR-регистрам

	;биты конфигурации микроконтроллера:
	__CONFIG   _CP_ON & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT   

		ORG	0		

    		GOTO L1				; на инициализацию
    		GOTO L1				;
    		GOTO L1				;
    		GOTO L1				;

L00		; адрес входа в прерывание = 04h

   		BCF INTCON,GIE		; запрещаем все прерывания
    		MOVWF 0x5F			;
    		MOVF STATUS,W		; грузим B'01011111' в регистр статуса

    		MOVWF 0x5E			; грузим B'01011110'
  	  	BCF STATUS,RP0		; банк 0
    		BTFSS INTCON,INTF	; проверяем, было ли прерывание по сети 
    		GOTO L2				; не было, идем на проверку переполнения TMR0
    		CALL L3				; было, идем на таблицу передачи управления

	    	MOVWF 0x01			;
   	 	BCF INTCON,INTF		; сбрасываем условие прерывания
    		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		GOTO L4				;

    		BTFSS 0x26,3			;
    		GOTO L5				;

    		INCF 0x35,F			;
    		BTFSC STATUS,Z		;
    		INCF 0x36,F			;
    		BTFSC STATUS,Z		;
    		BSF 0x26,4			;
L5:	
		BSF INTCON,T0IE		; разрешено прерывание по переполнению TMR0
    		BSF STATUS,RP0		; банк 1

    		MOVLW 0x40			;
    		XORWF 0x01,F		; ХОРим регистр TMR0 с 64

    		BCF STATUS,RP0		; банк 0
    		BCF INTCON,T0IF		; сброс переполнения TMR0
    		GOTO L4				; на выход
L2:	
		BTFSS INTCON,T0IF	; если было переполнение TMR0 - пропустить след. команду
    		GOTO L6				; нет, переполнения не было
    		BTFSS INTCON,T0IE	; если было переполнение TMR0 - пропустить след. команду
    		GOTO L6				; нет, переполнения не было
    		BSF 0x05,0			; переполнение было, включаем триак лог. 1

    		MOVLW 0xDB		; грузим '11011011' - признаки прерываний
    		ANDWF INTCON,F	; в регистр INTCON
    		GOTO L7				; небольшая задержка 
L7:							; 
		GOTO L8				; -//-
L8:							; 
		GOTO L9				; -//-
L9:							;
		BCF 0x05,0			; выключаем триак лог. 0
		GOTO L4				; на выход
L6:	
		BTFSS 0x0C,0			; проверяем переполнение TMR1
   		GOTO L4				; на выход, переполнения TMR1 не было
        	BCF 0x0C,0			; переполнение было, сбрасываем его

        	INCF 0x29,F			;
    		BTFSC STATUS,Z		;
   		INCF 0x2A,F			;
    		BTFSS STATUS,Z		;
    		GOTO L4				; на выход

    		BSF STATUS,RP0		; банк 1
    		BCF 0x0C,0			; сброс переполнения TMR1
    		BCF STATUS,RP0		; банк 0

    		BTFSC 0x2B,0			; если бит 0 в ячейке 2B равен 1
    		GOTO L10			; идем на основной цикл опроса

    		BTFSC 0x2B,1			; если бит 1 в ячейке 2B равен 1
    		GOTO L11			; идем на программирование кнопок пульта

    		BTFSC 0x2B,2			; если бит 2 в ячейке 2B равен 1
    		GOTO L12			; идем на

   		BTFSC 0x2B,3			;если бит 3 в ячейке 2B равен 1
   		GOTO L13			; идем на
L4:
		MOVF 0x5E,W		; грузим B'01011110'
    		MOVWF STATUS		;
    		MOVF 0x5F,W		; грузим B'01011111'

    		RETFIE		; выход из прерывания

;------------------таблица переходов на подпрограммы обслуживания ----------------------------
L3:	
		MOVF 0x20,W			;
    		ADDWF PCL,F		;
    		RETLW 0x00			;
    		RETLW 0x89			;
    		RETLW 0x94			;
    		RETLW 0xA0			;
        	RETLW 0xAA			;
    		RETLW 0xB4			;
  	  	RETLW 0xBE			;
   	 	RETLW 0xCA			;
    		RETLW 0xD2			;
   		RETLW 0xDC			;
    		RETLW 0xF2			;

;================== СТАРТ ====================

L1:	
		BSF STATUS,RP0		; банк 1

    		MOVLW 0x45			; грузим B'01000101'
    		MOVWF 0x01			; в регистр OPTION_REG

    		MOVLW 0x02			; грузим 2
    		MOVWF 0x15			; в регистр WPU - подключаем резистор к GP2

    		MOVLW 0x1E			; грузим B'00011110'
    		MOVWF 0x05			; в TRISIO, на выход бит 0 и 5, остальные на вход	

    		CLRF 0x0C			; обнуляем PIR1
    		BCF STATUS,RP0		; банк 0

    		CLRF 0x05			; обнуляем порт 			
    		MOVLW 0x07			; 
    		MOVWF 0x19			; пишем 7 в CMCON - отключаем внутр. компаратор
    		CLRF 0x0C			; обнуляем PIR1

    		MOVLW 0x30			; грузим B'00110000'
    		MOVWF 0x10			; в регистр T1CON
							; коэффициент деления предделителя для TMR1 = 1:8

    		MOVLW 0x50			; грузим B'01010000'
    		MOVWF INTCON		; прерывания разрешены

    		CLRF 0x26			; обнуляем ячейки 	26
    		CLRF 0x2B			; -//- 				2B
    		CLRF 0x20			; -//- 				20	

    		MOVLW 0x0A			;  
    		MOVWF 0x37			; грузим 10 в ячейку 37
    		CALL L14			; перезапись 8 байт из EEPROM с адреса 02 в ОЗУ с адреса 2C
    		GOTO L10			; на основной цикл опроса

;-----------------------------основной цикл опроса------------------------------------------

L10:	
		BSF INTCON,GIE		; разрешаем прерывания
    		MOVLW 0x02			;
    		CALL L15			; мигаем светодиодом 2 раза - индикация выхода на режим

;-----------------------------опрос кнопки и ИК-приемника-------------------------------

L19:
		BTFSC 0x26,4			; проверяем бит 4 ячейки 26
	    	GOTO L16			;
   		BTFSS 0x05,1			; проверяем кнопку
    		GOTO L17			; кнопка нажата
L23:	
		BTFSS 0x05,4			; не нажата, проверяем ИК-приемник
    		GOTO L18			; он активен, идем на прием ИК-посылки
    		GOTO L19			; неактивен, идем на опрос кнопки
L16:	
		BCF 0x26,4			; обнуляем бит 4 ячейки 26
    		MOVLW 0x04			;
    		CALL L15			; мигаем 4 раза светодиодом
    		GOTO L20			;
L17:	
		CLRF 0x2B			; обнуляем ячейку 2B
    		BSF 0x2B,1			; в ячейке 2B бит 1 - в лог. 1

    		MOVLW 0xEB			;
    		MOVWF 0x29			; грузим 235 в ячейку 29

    		MOVLW 0xFF			;
   		MOVWF 0x2A			; грузим 255 в ячейку 2A

    		CALL L21			; запуск таймера TMR1
    		CALL L22			; задержка 10 миллисекунд

    		BTFSC 0x05,1			; проверяем кнопку
    		GOTO L23			; не нажата
    		CALL L22			; задержка 10 миллисекунд

    		BTFSC 0x05,1			; проверяем кнопку
    		GOTO L23			; не нажата
    		BSF 0x05,5			; кнопка нажата - зажигаем светодиод
L25:	
		CALL L24			; задержка 100 миллисекунд 
    		BTFSS 0x05,1			; проверяем кнопку
	    	GOTO L25			; кнопка нажата - ждем ее отпускания
    		BCF 0x05,5			; кнопка отпущена - гасим светодиод
    		CALL L26			; останавливаем таймер TMR1

    		MOVLW 0xEE			;
    		SUBWF 0x29,W		; вычитаем 238 из ячейки 29 
    		BTFSC STATUS,C		; проверяем перенос
    		GOTO L27			;

	    	MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		GOTO L28			;
	    	GOTO L20			;

L44:	
		MOVLW 0x1F			;
    		MOVWF 0x35			;
    		MOVLW 0xD1			;
    		MOVWF 0x36			;

    		MOVLW 0x01			;
    		CALL L15			; 1 раз мигаем светодиодом

    		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		GOTO L29			;

    		MOVLW 0x06			;
    		SUBWF 0x20,W		;
    		BTFSS STATUS,C		;
	    	GOTO L19			; опрос кнопки и ИК-приемника

    		MOVLW 0x06			;
    		MOVWF 0x20			;
    		GOTO L19			; опрос кнопки и ИК-приемника
L29:	
		MOVLW 0x06			;
	    	CALL L30			;
	    	GOTO L19			; опрос кнопки и ИК-приемника
L43:	
		MOVF 0x37,W			;
	    	GOTO L30			;
L28:	
		MOVLW 0x0A			; грузим 10

;------------------задержка----------------------------
; задержка = 20 мс Х содержимое аккумулятора

L30:	
		MOVWF 0x25			; сохраняем аккумулятор в ячейке 25
L31:	
		INCF 0x20,F			;
    		CALL L22			; задержка 10 миллисекунд 
    		CALL L22			; задержка 10 миллисекунд 
	    	DECFSZ 0x25,F		;
	    	GOTO L31			; циклим, если ячейка 25 еще не равна 0
	    	GOTO L19			; опрос кнопки и ИК-приемника

;------------------задержка----------------------------
; задержка = 20 мс Х содержимое ячейки 20

L33:
		CALL L22			; задержка 10 миллисекунд 
	    	CALL L22			; задержка 10 миллисекунд 
L20:	
		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		GOTO L32			;
    		DECF 0x20,F			;
	    	GOTO L33			; циклим, если ячейка 20 еще не равна 0
L32:	
		BCF 0x26,3			; в ячейке 26 - бит 3 в лог. 0
    		GOTO L19			; опрос кнопки и ИК-приемника

;------------------подпрограмма миганий светодиода ----------------------------
;------------в аккумуляторе - требуемое число миганий светодиода--------

L15:	
		MOVWF 0x25			; сохраняем в ячейке 25 число миганий светодиода
L34:	
		CALL L24			; задержка 100 миллисекунд 
    		BSF 0x05,5			; зажигаем светодиод 
    		CALL L24			; задержка 100 миллисекунд 
    		BCF 0x05,5			; гасим светодиод
	    	DECFSZ 0x25,F		;
	    	GOTO L34			; циклим, если ячейка 25 еще не равна 0
    		RETURN		; выходим

;------------------вход в программирование кнопок пульта-----------------------------------------

L11:	
		BSF INTCON,GIE		; разрешаем все прерывания

    		MOVF 0x20,W			; ячейку 20 - в аккумулятор
    		MOVWF 0x37			; аккумулятор - в ячейку 37

    		MOVLW 0x02			;
	    	MOVWF 0x20			; грузим 2 в ячейку 20

	    	MOVLW 0x0A			;
    		CALL L15			; 10 раз мигаем светодиодом
							; индикация входа в режим программирования

	    	MOVLW 0x2C			;
    		MOVWF FSR			; грузим адрес 2C для сохранения кодов пульта
    		MOVLW 0x08			;
    		MOVWF 0x38			; в ячейке 38 - число байт (8), описывающее 4 кнопки пульта
    		BCF STATUS,C		;
	    	RRF 0x38,F			;
L37:	
		MOVF FSR,W			;
	    	MOVWF 0x39			;
	    	CLRF 0x2B			; обнуляем ячейку 2B
	    	BSF 0x2B,3			; в ячейке 2B - бит 3 в лог.1

	    	MOVLW 0xEB			; число 235
	    	MOVWF 0x29			; в ячейку 29
	    	MOVLW 0xFF			; число 255
	    	MOVWF 0x2A			; в ячейку 2A
	    	CALL L21			; запуск таймера TMR1
L35:	
		BTFSC 0x05,4			; проверяем выходной бит ИК-приемника
	    	GOTO L35			; приемник неактивен, ждем активности
    		CALL L26			; приемник активен, останавливаем таймер TMR1

	    	CLRF 0x2B			; обнуляем ячейку 2B
    		BSF 0x2B,2			; в ячейке 2B - бит 2 в лог.1
    		CALL L36			; прием ИК-посылки

	   	BTFSS 0x26,0			;
	    	GOTO L37			;

	    	MOVF 0x39,W			;
	    	MOVWF FSR			;
    		MOVF 0x27,W			;
    		MOVWF INDF		;
    		INCF FSR,F			;
    		MOVF 0x28,W			;
    		MOVWF INDF		;
    		INCF FSR,F			;

    		MOVLW 0x01			;
    		CALL L15			; 1 раз мигаем светодиодом

    		MOVLW 0x06
    		MOVWF 0x20			; в ячейку 20 - грузим 6

    		CALL L24			; задержка 100 миллисекунд
    		CALL L24			; задержка 100 миллисекунд

    		MOVLW 0x02			;
	    	MOVWF 0x20			; грузим 2 в ячейку 20

	    	DECFSZ 0x38,F		; уменьшаем число записанных байт в ОЗУ
	    	GOTO L37			; если не все 8 записаны - повторяем заново

							; нет, все записаны, идем далее
	    	CALL L38			; перезапись 8-ми байт данных из ОЗУ с адреса 2C
							; в EEPROM с адреса 02

	    	MOVLW 0x0A			;
    		CALL L15			; 10 раз мигаем светодиодом
							; индикация выхода из режима программирования

    		MOVF 0x37,W			; пересылаем ячейку 37 в аккумулятор
    		MOVWF 0x20			; пересылаем аккумулятор в ячейку 20
    		MOVF 0x37,F			; пересылаем в ячейку 37

    		BTFSS STATUS,Z		;
    		GOTO L19			; на опрос кнопки и ИК-приемника
    		MOVLW 0x0A			; 
    		MOVWF 0x37			; пишем 10 в ячейку 37
    		GOTO L19			; на опрос кнопки и ИК-приемника

;--------------------вход в ------------------------------------------------

L12:	
		BSF INTCON,GIE		; все прерывания разрешены
    		MOVLW 0x02			;
	    	CALL L15			; 2 раза мигаем светодиодом
	    	GOTO L37			; идем на ввод кода 

;--------------------вход в ------------------------------------------------

L13:	
		BSF INTCON,GIE		; все прерывания разрешены
    		MOVF 0x37,W			;
	    	MOVWF 0x20			; переписываем данные из ячейки 37 в ячейку 20
    		GOTO L10			; идем на основной цикл опроса

;--------------------------работа с ИК-приемником-------------------

L18:	
		CLRF 0x2B			; очистка ячейки 2B
    		BSF 0x2B,0			; в ячейке 2B - бит 0 в лог.1
    		CALL L36			; прием ИК-посылки

    		BTFSS 0x26,0			;
    		GOTO L19			; опрос кнопки и ИК-приемника
    		CALL L39			; перекодировка (???)

	    	BTFSS 0x26,1			;
    		GOTO L19			; опрос кнопки и ИК-приемника

    		MOVLW 0x01			;
    		SUBWF 0x34,W		;
    		BTFSC STATUS,Z		;
	    	GOTO L40			;

    		MOVLW 0x02			;
    		SUBWF 0x34,W		;
    		BTFSC STATUS,Z		;
    		GOTO L41			;

    		MOVLW 0x03			;
    		SUBWF 0x34,W		;
    		BTFSC STATUS,Z		;
    		GOTO L27			;

    		MOVLW 0x04			;
    		SUBWF 0x34,W		;
    		BTFSC STATUS,Z		;
    		GOTO L42			;
    		GOTO L19			; на опрос кнопки и ИК-приемника
L40:	
		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
	    	GOTO L43			;
	    	MOVLW 0x0A			;	
	    	SUBWF 0x20,W		;
    		BTFSS STATUS,Z		;
	    	INCF 0x20,F			;
    		GOTO L19			; на опрос кнопки и ИК-приемника
L41:	
		MOVF 0x20,F			;
    		BTFSS STATUS,Z		;
    		DECF 0x20,F			;
    		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		BCF 0x26,3			;
    		GOTO L19			; на опрос кнопки и ИК-приемника

L27:	
		MOVLW 0x08			;
    		XORWF 0x26,F		;
    		BTFSC 0x26,3			;
    		GOTO L44			;

    		MOVLW 0x04			;
    		CALL L15			; 4 раза мигаем светодиодом			
    		GOTO L19			; на опрос кнопки и ИК-приемника
L42:	
		MOVF 0x20,F			;
    		BTFSC STATUS,Z		;
    		GOTO L45			;
    		MOVF 0x20,W			;
    		MOVWF 0x37			;
L45:	
		GOTO L20			;

;-------------------------подпрограмма приема ИК-посылки------------------------------------

L36:	
		CALL L46			; работаем с таймером
    		BCF 0x26,0			; обнуляем в ячейке 26 бит 0
    		BCF 0x26,2			; обнуляем в ячейке 26 бит 2
L47:	
		BTFSS 0x05,4			; проверяем выходной бит ИК-приемника
    		GOTO L47			; бит активен (лог. 0), ждем его неактивности 
    		CALL L26			; бит неактивен, останавливаем таймер TMR1

    		MOVLW 0x01			;
    		SUBWF 0x0F,W		;
    		BTFSS STATUS,Z		;
    		GOTO L48			;
    		MOVLW 0x77			; грузим 119
    		SUBWF 0x0E,W		; вычитаем из младшего байта таймера TMR1
L48:	
		BTFSS STATUS,C		;
    		BSF 0x26,2			; в ячейке 26 - бит 2 в лог. 1
    		BTFSC 0x26,2			; проверяем бит 2 в ячейке 26
    		CALL L49			; он равен 1 - прием 5-ти битного адреса посылки ИК-кода
    		BTFSS 0x26,2			; проверяем бит 2 в ячейке 26
    		CALL L50			; он равен 0 - прием 6-ти битного ИК-кода команды

    		RETURN		; нет, равен 1, - выходим

;------------------подпрограмма----------------------------
;прием 5-ти битного адреса ИК-посылки

L49:	
		CALL L46		; подпрограмма работы с таймером TMR1
    		CALL L51		; задержка 420 мкс

    		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L52		; бит активен 
    		CALL L53		; бит неактивен, задержка 444 мкс
    		CALL L53		; задержка 444 мкс

   		BTFSC 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L52		; он неактивен, идем на выход
    		BSF 0x05,5		; зажигаем светодиод - бит ИК-приемника активен

    		CLRF 0x28		; обнуляем ячейку 28
    		CLRF 0x27		; обнуляем ячейку 27

    		MOVLW 0x27
    		MOVWF FSR		; в FSR - грузим 39

    		MOVLW 0x0C
    		MOVWF 0x25		; в ячейку 25 грузим 12
L57:	
		CALL L53		; задержка 444 мкс
    		CALL L53		; задержка 444 мкс

    		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L54		; он активен, ждем его неактивности
    		BSF INDF,0		; не активен, бит 0 регистра INDF - в лог. 1
L55:	
		BTFSC 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L55		; он неактивен, ждем его активности
    		GOTO L56		; бит активен
L54:	
		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L54		; он активен, ждем его неактивности
L56:	
		BCF STATUS,C	; бит неактивен
    		RLF INDF,F		;
    		CALL L53		; задержка 444 мкс

    		MOVLW 0x08		;
    		SUBWF 0x25,W	;
    		BTFSC STATUS,Z	;
    		INCF FSR,F		;
    		DECFSZ 0x25,F	;
   	 	GOTO L57		;

  	  	CALL L24		; задержка 100 миллисекунд
	    	CALL L24		; задержка 100 миллисекунд
    		BSF 0x26,0		; в ячейке 26 бит 0 - в лог. 1
L52:	
		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L52		; он активен, ждем его неактивности
    		CALL L26		;

   	 	BCF 0x05,5		; гасим светодиод
  	  	BCF 0x27,5		; в ячейке 27 бит 5 - в лог. 0
   	 	RETURN		; выходим 

;------------------подпрограмма----------------------------
;прием 6-ти битной команды ИК-посылки

L50:	
		CALL L46		; подпрограмма работы с таймером TMR1
   	 	CALL L58		; задержка 256 мкс
   	 	MOVLW 0x06
   	 	MOVWF 0x25		; в ячейку 25 грузим 6 
L60:	
		CALL L59		; задержка 280 мкс
  	  	DECFSZ 0x25,F	; цикл
    		GOTO L60		; 1.680 мс общая задержка

   	 	BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
   	 	GOTO L61		; то, идем ожидание его неактивности

	    	CALL L59		; нет, бит неактивен, задержка

    		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
   	 	GOTO L61		; то, идем ожидание его неактивности

   	 	BSF 0x05,5		; нет, бит неактивен, зажигаем светодиод
   	 	CLRF 0x27		; обнуляем ячейку 27
   	 	CLRF 0x28		; обнуляем ячейку 28

   	 	MOVLW 0x27		;
   	 	MOVWF FSR		; в FSR - грузим адрес 27h

   	 	MOVLW 0x20		;
   	 	MOVWF 0x25		; в ячейку 25 - грузим 32
L62:	
		BTFSC 0x05,4		; проверяем выходной бит ИК-приемника
    		GOTO L62		; он в лог. 1 - ждем
L63:	
		BTFSS 0x05,4		; проверяем выходной бит ИК-приемника
   	 	GOTO L63		; он в лог. 0 - ждем

  	  	CALL L59		; задержка 280 мкс
   	 	CALL L59		; задержка 280 мкс
   	 	CALL L59		; задержка 280 мкс 
						; (суммарное время задержки = 840 мкс)

   	 	MOVLW 0x10		;
   	 	SUBWF 0x25,W	; вычитаем 16 из ячейки 25

    		BTFSC STATUS,Z	;
  	  	INCF FSR,F		;
   	 	BCF INDF,0		;

   	 	BTFSS 0x05,4		; проверяем выходной бит ИК-приемника 
   	 	BSF INDF,0		; он активен, в ячейке INDF бит 0 - в лог. 1
  	  	DECF 0x25,F		; неактивен, из ячейки 25  - 1
   	 	BTFSC STATUS,Z	;
    		GOTO L64		;
	
    		BCF STATUS,C	;
   	 	RLF INDF,F		;
    		GOTO L62		;
L64:	
		BSF 0x26,0		; в ячейке 26 бит 0 - в лог. 1
L65:	
		BTFSC 0x05,4		; ждем активного выходного бита ИК-приемника 
	    	GOTO L65		; он в лог. 1 - ждем
L61:	
		BTFSS 0x05,4		; ждем неактивного выходного бита ИК-приемника 
    		GOTO L61		; он в лог. 0 - ждем

    		CALL L26		; останов таймера TMR1, сброс переполнения
	    	CALL L24		; задержка 100 миллисекунд 
	    	CALL L24		; задержка 100 миллисекунд 
    		BCF 0x05,5		; гасим светодиод
    		RETURN		; выходим 

;------------------подпрограмма работы с таймером TMR1----------------------------

L46:	
		MOVLW 0xFF			;
	    	MOVWF 0x29			; в ячейку 29 - грузим 255
	    	MOVLW 0xFF			;
	    	MOVWF 0x2A			; в ячейку 2A - грузим 255

;------------------подпрограмма работы с таймером TMR1----------------------------
;------------------обнуление байт и запуск таймера---------------------------------------

L21:	
		CLRF 0x0E			; обнуляем млаший байт TMR1
	    	CLRF 0x0F			; обнуляем старший байт TMR1
    		BSF 0x10,0			; включаем TMR1
	    	BCF 0x0C,0			; сбрасываем признак переполнения TMR1
	    	BSF STATUS,RP0		; банк 1
	    	BSF 0x0C,0			; уст. признак переполнения TMR1
   	 	BCF STATUS,RP0		; банк 0
    		RETURN		; выходим

;------------------подпрограмма работы с таймером TMR1----------------------------
;------------------остановка таймера и сброс признака переполнения---------------

L26:	
		BSF STATUS,RP0		; банк 1
    		BCF 0x0C,0			; сбрасываем признак переполнения TMR1
    		BCF STATUS,RP0		; банк 0
  	  	BCF 0x0C,0			; сбрасываем признак переполнения TMR1
   	 	BCF 0x10,0			; останавливаем TMR1
    		RETURN		; выходим

;------------------подпрограмма перекодировки (???)----------------------------

L39:	
		CLRF 0x34			; обнуление ячейки 34
  	  	BCF 0x26,1			; в ячейке 26 бит 1 - в лог. 0
   	 	MOVLW 0x2C			;
    		MOVWF FSR			; уст. адрес начала кодов пульта в ОЗУ

   	 	MOVLW 0x08			; 
	    	MOVWF 0x25			; пишем число байт (8) в ячейку 25
    		BCF STATUS,C		; обнуляем бит переноса
	    	RRF 0x25,F			;
L69:
		INCF 0x34,F			;
    		MOVF 0x27,W			;
   	 	SUBWF INDF,W		;
    		BTFSC STATUS,Z		;
	    	GOTO L66			;

	    	INCF FSR,F			; адрес ОЗУ +1
	    	INCF FSR,F			; адрес ОЗУ +1
	    	GOTO L67			; проверяем все ли 8 байт 
L66:	
		INCF FSR,F			;
    		MOVF 0x28,W			;
    		SUBWF INDF,W		;
	    	BTFSC STATUS,Z		;
	    	GOTO L68			;
	    	INCF FSR,F			;
	    	GOTO L67			;
L68:	
		BSF 0x26,1			; в ячейке 26 бит 1 - в лог. 1
    		RETURN				; выходим
L67:	
		DECFSZ 0x25,F		;
	    	GOTO L69			;
   	 	RETURN		; выходим

;------------------подпрограмма перезаписи 8-ми байт из ОЗУ в EEPROM---------------------
L38:	
		MOVLW 0x02			;
	    	CALL L70			; пишем адрес 02 в EEADR

	    	MOVLW 0x2C			; начальный адрес в ОЗУ
    		MOVWF FSR			;

    		MOVLW 0x08			;
	    	MOVWF 0x25			; число переписываемых байт (8) - грузим в ячейку 25
L73:	
		MOVF INDF,W		;
	    	CALL L71			; пишем в EEPROM
	    	CALL L72			; наращиваем адрес EEPROM
	    	INCF FSR,F			;
	    	DECFSZ 0x25,F		;
	    	GOTO L73			; циклим, если еще не все байты перезаписаны
  	  	RETURN		; выходим

;----------подпрограмма чтения 8 байт из EEPROM с адреса 02-------------- 
;----------------байты переписываются в ОЗУ с адреса 2C-----------------------
L14:	
		MOVLW 0x02			; 
	    	CALL L70			; уст. адрес 02 в EEADR
   	 	MOVLW 0x2C			;
    		MOVWF FSR			; уст. адрес ОЗУ = 2C
    		MOVLW 0x08			;
   	 	MOVWF 0x25			; грузим 8 в ячейку 25
L75:	
		CALL L74			; читаем EEPROM
    		MOVWF INDF		;
    		CALL L72			; наращиваем адрес в EEPROM
    		INCF FSR,F			;
	    	DECFSZ 0x25,F		;
   	 	GOTO L75			; если не все 8 байт переписаны - циклим
    		RETURN		; выходим

;------------------подпрограмма установки адреса EEPROM--------------------
L70:	
		BSF STATUS,RP0		; банк 1
  	  	MOVWF 0x1B			; пишем адрес в EEADR
   	 	BCF STATUS,RP0		; банк 0
    		RETURN		;выходим

;------------------подпрограмма наращивания адреса EEPROM-----------------
L72:	
		BSF STATUS,RP0		; банк 1
	    	INCF 0x1B,F			; наращиваем EEADR
    		BCF STATUS,RP0		; банк 0
   	 	RETURN		; выходим

;------------------подпрограмма чтения байта из EEPROM---------------------
L74:	
		BSF STATUS,RP0		; банк 1
   	 	BSF 0x1C,0			; инициализируем чтение из EEPROM
  	  	MOVF 0x1A,W		; работаем с EEDATA
   	 	BCF STATUS,RP0		; банк 0
    		RETURN		; выходим

;------------------подпрограмма записи в EEPROM данных из аккумулятора-----------------------
L71:	
		BSF STATUS,RP0		; банк 1
	    	MOVWF 0x1A			; аккумулятор в регистр данных для записи в EEPROM
	    	BSF 0x1C,2			; разрешаем запись в EEPROM

    		MOVLW 0x55			; обязательная процедура для записи в EEPROM
	    	MOVWF 0x1D			; 
	    	MOVLW 0xAA		;
   	 	MOVWF 0x1D			; 
		BSF 0x1C,1			; инициализируем запись в EEPROM
L76:	
		BTFSC 0x1C,1			; проверяем бит окончания записи в EEPROM
  	  	GOTO L76			; ждем завершения записи
   	 	BCF 0x1C,2			; запись завершена, запрещаем запись в EEPROM
    		BCF STATUS,RP0		; банк 0
    		RETURN		; выходим

;------------------подпрограмма задержки 256 мкс----------------------------
L58:	
		MOVLW 0x53
    		MOVWF 0x22		; 83 грузим в ячейку 22
L77:	
		DECFSZ 0x22,F
	    	GOTO L77
	    	GOTO L78
L78:	
		RETURN		; выходим

;------------------подпрограмма задержки 280 мкс----------------------------
L59:	
		MOVLW 0x5B
   		MOVWF 0x22		; 91 грузим в ячейку 22
L79:	
		DECFSZ 0x22,F
    		GOTO L79
    		GOTO L80
L80:	
		RETURN		; выходим

;------------------подпрограмма задержки 420 мкс----------------------------
L51:	
		MOVLW 0x8A
    		MOVWF 0x22		; 138 грузим в ячейку 22
L81:	
		DECFSZ 0x22,F
    		GOTO L81
    		NOP
    		RETURN		; выходим

;------------------подпрограмма задержки 444 мкс----------------------------
L53:	
		MOVLW 0x92
	    	MOVWF 0x22		; 146 грузим в ячейку 22
L82:	
		DECFSZ 0x22,F
	    	GOTO L82
  	 	NOP
    		RETURN		; выходим

;------------------подпрограмма задержки на 10 миллисекунд----------------------------
L22:	
		MOVLW 0xCE		; 206 грузим в ячейку 22
    		MOVWF 0x22
    		MOVLW 0x08
   	 	MOVWF 0x23		; 8 грузим в ячейку 23
L84:	
		DECFSZ 0x22,F
   	 	GOTO L83
 	  	DECFSZ 0x23,F
L83:	
		GOTO L84
    		GOTO L85
L85:	
		NOP
    		RETURN		; выходим

;------------------подпрограмма задержки на 100 миллисекунд ----------------------------
L24:	
		MOVLW 0x1E			;
    		MOVWF 0x22			; грузим 30 в ячейку 22
    		MOVLW 0x4F			;
    		MOVWF 0x23			; грузим 79 в ячейку 23
L87:	
		DECFSZ 0x22,F
    		GOTO L86
    		DECFSZ 0x23,F
L86:	
		GOTO L87
    		GOTO L88
L88:	
		NOP
    		RETURN		; выходим
;-------------------------------------------------------------------------------------------------------------
;		org 	END_ROM
;CALIBR
;		dw 	3454h	;в последнюю ячейку пишем калибровочную константу,
					;заранее считанную из чипа
		END
