; аквариумный таймер с термометром и термостатом
; контроллер - PIC16F628 (внутренний генератор 4 MГц), индикация - МТ10Т7, термодатчик - DS18S20
; выходы: освещение, нагрузка1, нагрузка2, нагреватель, охладитель
; управление: кнопки SETUP (переход по меню) и +/Timers (установка параметра/вход в установку таймеров)
; 6 универсальных таймеров, установка типа нагрузки (если нет - таймер выключен)
; нагреватель и охладитель - установка минимальной и максимальной температуры, поддержка +-1 град
; охладитель управляется при помощи ШИМ (при превышении температуры на 1-3° импульсы со скважностью 0.5
; при большем превышении - постоянная работа

 	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _DATA_CP_OFF & _MCLRE_OFF &_BODEN_OFF
#include p16f628.inc
#define lcd_rs		PORTB,4		;ЖКИ команда/данные (LCD 1)
#define	lcd_e		PORTB,5		;ЖКИ синхро (LCD 3)
#define	THERMO  	PORTA,2		;подключение термометра
#define LIGHT_PIN	PORTA,6		;порт лампы (мой 6, тест 0, стандарт 6)
#define HEAT_PIN	PORTA,1		;порт нагревателя (мой 7, тест 7, стандарт 1)
#define COOL_PIN	PORTA,3		;порт охладителя (мой 3, тест 6, стандарт 3)
#define LOAD1_PIN	PORTA,7		;порт нагрузки1 (мой 1, тест 1, стандарт 7)
#define LOAD2_PIN	PORTA,0		;порт нагрузки2 (мой 0, тест 3, стандарт 0)
#define POWER		PORTB,7		;наличие питания

#define	CARRY		STATUS,C
#define	ZERO 		STATUS,Z

#define KEY_SET		flags,7		;нажата кнопка SET
#define KEY_MODE	flags,6		;нажата кнопка MODE
#define DS_ERR		flags,5		;наличие термометра
#define CORR_BIT	flags,4		;0-коррекции не было, 1-уже была
#define OLD_TIME	flags,3		;состояние бита секунд в прежнем цикле
#define NEW_TIME	flags,2		;состояние бита секунд в новом цикле
#define ON_LOAD		flags,1		;флаг включения нагрузки
#define OFF_LOAD	flags,0		;флаг выключения нагрузки

#define LIGHT		loads,0		;флаг включения света
#define LOAD1		loads,1		;флаг включения нагрузки1 
#define LOAD2		loads,2		;флаг включения нагрузки2 
#define HEATER		loads,3		;флаг включения нагревателя
#define COOLER		loads,4		;флаг включения охладителя (без учета ШИМ)
#define COOL_ON		loads,5		;флаг включения охладителя


INIT_OPTION	EQU	b'00000100'	;
INIT_INTCON	EQU	b'10100000'	;
INIT_T1CON	EQU	b'00000011'	;работа TMR1 с собств.ген., синхр., к.дел. 1:1
INIT_CMCON	EQU	b'00000111'	;компараторы выключены
	cblock 0x20
		d0,d1,d2,d3,d4,d5,d6,d7,d8,d9 	;буфер дисплея
		w_tmp		;временное хранение W
		status_tmp	;---- STATUS
		count		;временные счетчики
		count2		
		hours		;рабочие регистры часов (HEX)
		minutes		
		seconds
		sec_therm	;интервал измерения температуры
		screen	;номер показаний экрана 
			;0  : температура-время     	   /25°с 12-00/
			;1  : состояние нагрузок /25°с L12HC//25°с -----/
			;2  : ручное управление светом     /LIGHt  On //LIGHt  OFF/
			;3  : ручное управление нагрузкой1 /LOAd1  On //LOAd1  OFF/	
			;4  : ручное управление нагрузкой2 /LOAd2  On //LOAd2  OFF/
			;5  : установка мин. температуры   /Min t° 22/
			;6  : установка макс. температуры  /MAH t° 26/	
			;7  : установка часов 		   /Hour 12-00/
			;8  : установка минут 		   /Min 12-00/
			;9  : коррекция часов	   	   /Corr-00SEC/
			;10 : резервный (не используется)
			;11 : служебный (не используется) 
			;12 : таймер1 уст. нагрузки	   /t1     OFF//t1   LIGHt//t1   LOAd1//t1   LOAd2/
			;13 : таймер1 уст. времени вкл 	   /t1On 12-00/
			;14 : таймер1 уст. времени выкл    /t1OFF12-00/
			;15 : таймер2 уст. нагрузки	   /t2     OFF//t2   LIGHt//t1   LOAd1//t1   LOAd2/
			;16 : таймер2 уст. времени вкл 	   /t2On 12-00/
			;17 : таймер2 уст. времени выкл    /t2OFF12-00/
			;18 : таймер3 уст. нагрузки	   /t3     OFF//t3   LIGHt//t1   LOAd1//t1   LOAd2/
			;19 : таймер3 уст. времени вкл 	   /t3On 12-00/
			;20 : таймер3 уст. времени выкл    /t3OFF12-00/
			;21 : таймер4 уст. нагрузки	   /t4     OFF//t4   LIGHt//t1   LOAd1//t1   LOAd2/
			;22 : таймер4 уст. времени вкл 	   /t4On 12-00/
			;23 : таймер4 уст. времени выкл    /t4OFF12-00/
			;24 : таймер5 уст. нагрузки	   /t5     OFF//t5   LIGHt//t1   LOAd1//t1   LOAd2/
			;25 : таймер5 уст. времени вкл 	   /t5On 12-00/
			;26 : таймер5 уст. времени выкл    /t5OFF12-00/
			;27 : таймер6 уст. нагрузки	   /t6     OFF//t6   LIGHt//t1   LOAd1//t1   LOAd2/
			;28 : таймер6 уст. времени вкл 	   /t6On 12-00/
			;29 : таймер6 уст. времени выкл    /t6OFF12-00/
				
		max_temp 	;максимально допустимая температура
		min_temp 	;минимально допустимая температура
		ret_count	;таймер возврата экрана
		hexdata		;HEX данные для преобразования
		decs	 	;десятки после преобразования
		ones	 	;единицы после преобразования
		dstemp		;прочитанное значение температуры
		sendbyte	;байт команды термодатчика
		reseivebyte	;принятый байт термодатчика
		newpress	;нажатая кнопка
		oldpress	;кнопка, нажатая в прошлом цикле
		flags		;байт флагов
		loads		;байт флагов состояния нагрузок
		temp		;временный байт
		hr_tmp		;временный байт часов для преобразования и вывода
		min_tmp		;временный байт минут для преобразования и вывода
		time_corr	;величина коррекции часов
		set_count	;счетчик автоповтора SET
	endc

	cblock 0x5f
		hr_on1, hr_on2, hr_on3, hr_on4, hr_on5, hr_on6
		hr_off1, hr_off2, hr_off3, hr_off4, hr_off5, hr_off6
		min_on1, min_on2, min_on3, min_on4, min_on5, min_on6
		min_off1, min_off2, min_off3, min_off4, min_off5, min_off6
		load1, load2, load3, load4, load5, load6
		
	endc
				
; MACROS
ds_comm		macro		;порт датчика на вывод
		bcf PORTA,2
		bsf STATUS,RP0
		bcf TRISA^80h,2
		bcf STATUS,RP0
		endm

ds_data		macro		;порт датчика на ввод
		bsf STATUS,RP0
		bsf TRISA^80h,2
		bcf STATUS,RP0
		endm



	org 0x000
	goto begin
;прерывание от таймера
timeint		org 0x004			
		movwf w_tmp		;сохранить STATUS, W
		swapf STATUS,W
		clrf STATUS
		movwf status_tmp
		
		btfss TMR1H,7 ; (тест 3, стандарт 7)
		goto press
		incf seconds
		incf sec_therm
		bcf TMR1H,7 ;(тест 3, стандарт 7)
		incf ret_count		;каждую секунду - приращение счетчика возврата меню
		
		
press		movf newpress,0
		movwf oldpress
		movf PORTA,0
		andlw b'00110000'
		movwf newpress
		subwf oldpress,0
		btfsc  ZERO
		goto no_press
setpress	btfsc newpress,5
		goto press_mode
		bsf KEY_SET
		bcf KEY_MODE
		incf set_count
		goto end_key
press_mode	clrf set_count
		btfsc newpress,4
		goto no_press
		bcf KEY_SET
		bsf KEY_MODE
		goto end_key
no_press	bcf KEY_SET
		bcf KEY_MODE
end_key
		btfsc PORTA,5
		goto no_time_inc
		incf set_count
		movf set_count,0
		sublw .30		;задержка кнопки +/Timers
		btfss ZERO
		goto no_time_inc
		bsf KEY_SET
		clrf set_count
		

		
no_time_inc	
		swapf status_tmp,W	;восстановить STATUS, W
		movwf STATUS	
		swapf w_tmp,F
		swapf w_tmp,W
		bcf INTCON,2
		clrwdt	
		
	retfie		;возврат прерывания


seg7		;преобразование цифр в код 7-сегментов
		addwf PCL
		dt 0EEh, 060h, 02Fh, 06Dh, 0E1h; 0,1,2,3,4
		dt 0CDh, 0CFh, 068h, 0EFh, 0EDh; 5,6,7,8,9
		;таблица сообщений
msg_tab		addwf PCL		
		dt 0x00, 0x00, 0xee, 0x8b, 0x8b					; OFF 		0
		dt 0x00, 0x00, 0xee, 0x43, 0x00					; On  		5
		dt 0x86, 0x60, 0xce, 0xe3, 0x87					; LIGHt		10
		dt 0x86, 0xee, 0xeb, 0x67, 0x60					; LOAd1		15
		dt 0x86, 0xee, 0xeb, 0x67, 0x2f					; LOAd2		20
		dt 0xaa, 0xe8, 0xeb, 0xe3, 0x00, 0x87, 0xa9		; MAH t°	25
		dt 0xaa, 0xe8, 0x40, 0x43, 0x00, 0x87, 0xa9		; Min t°	32
		dt 0xe3, 0x47, 0x46, 0x03, 0x00					; Hour		39
		dt 0xaa, 0xe8, 0x40, 0x43, 0x00					; Min		44
		dt 0x8e, 0x47, 0x03, 0x03, 0x00, 0x00, 0x00, 0xcd, 0x8f, 0x8e	; Corr   SEC	49





begin					;инициализация PIC
		bsf STATUS,RP0
		movlw 0x30
		movwf TRISA^80h
		movlw b'11000000'
		movwf TRISB^80h
		movlw INIT_OPTION
		movwf OPTION_REG^80h
		bcf STATUS,RP0
		movlw INIT_INTCON
		movwf INTCON
		movlw INIT_T1CON
		movwf T1CON
		movlw INIT_CMCON
		movwf CMCON
		clrf STATUS
		
					;инициализация ЖКИ
		movlw 0x0F
		call lcd_cw
		movlw 1
		call lcd_dw

					;если был сброс по WDT?
		btfss STATUS,4
		goto main_loop		;исходные параметры не устанавливать

		;исходные параметры
		movlw .12
		movwf hours
		movlw .30
		call flash_rd
		movwf min_temp
		movlw .31
		call flash_rd
		movwf max_temp
		movlw .32
		call flash_rd
		movwf time_corr
		clrf minutes
		clrf seconds
		clrf sec_therm
		clrf TMR1L
		clrf TMR1H
		clrf flags
		clrf loads
		clrf newpress
		clrf oldpress
		clrf screen
		movlw 0x5f	;восстановление таймеров
		movwf FSR
		movlw .30
		movwf count
nextimer 	decf count,0
		call flash_rd
		movwf INDF	
		incf FSR
		decfsz count
		goto nextimer



;главный цикл
main_loop
		
	
;ход часов	
clock		movf sec_therm,0	;каждые 10 сек - измерение температуры
		sublw .10
		btfss ZERO
		goto sec_count
		call thermometer	
		clrf sec_therm

sec_count	movf seconds,0
		sublw .60
		btfss ZERO
		goto end_time
		incf minutes
		clrf seconds
		call tmr_ctrl
		movf minutes,0
		sublw .60
		btfss ZERO
		goto end_time
		incf hours
		clrf minutes
		call tmr_ctrl
		movf hours,0
		sublw .24
		btfss ZERO
		goto end_time
		clrf hours
		call corr		;коррекция часов
		
end_time
		movf hours,0
		sublw .1
		btfss ZERO
		goto ret_scr
		bcf CORR_BIT		;в 1 час - сброс бита коррекции
		
ret_scr		movf ret_count,0	;кнопки не нажимались 60 сек?
		sublw .60 ;(60)
		btfsc ZERO
		clrf screen		;возврат в главный экран
end_ret_menu
		

;обработка кнопок в экранах

;кнопка SETUP
		btfss KEY_SET
		goto keymode
		clrf ret_count

set0		movf screen,0	;экран 0 переход к установке таймеров
		btfss ZERO
		goto set2
		movlw .12
		movwf screen	
		goto off_key

		
set2		movf screen,0	;экран 1 ручное управление светом /LIGHt  On //LIGHt OFF/
		sublw .2
		btfss ZERO
		goto set3
		btfss LIGHT
		goto light_on
		bcf LIGHT
		goto off_key	
light_on	bsf LIGHT	
		goto off_key

set3		movf screen,0	;экран 2 ручное управление нагрузкой1 /LOAd1  On //LOAd1 OFF/
		sublw .3
		btfss ZERO
		goto set4
		btfss LOAD1
		goto load1_on
		bcf LOAD1
		goto off_key	
load1_on	bsf LOAD1	
		goto off_key		
		
set4		movf screen,0	;экран 3 ручное управление нагрузкой2 /LOAd2  On //LOAd2 OFF/
		sublw .4
		btfss ZERO
		goto set5
		btfss LOAD2
		goto load2_on
		bcf LOAD2
		goto off_key	
load2_on	bsf LOAD2	
		goto off_key		
		
set5		movf screen,0	;экран 4 макс. температура	/Min t° 24/
		sublw .5
		btfss ZERO
		goto set6
		incf min_temp
		movf min_temp,0
		sublw .40
		btfsc ZERO
		call min20deg
		movf min_temp,0
		addlw .2
		movwf max_temp
		goto off_key

set6		movf screen,0	;экран 5 мин. температура	/MAH t° 26/
		sublw .6
		btfss ZERO
		goto set7
		incf max_temp
		movf max_temp,0
		sublw .40
		btfsc ZERO
		call max20deg
		goto off_key		
	
set7		movf screen,0	;экран 6 установка часов /Hour 12-00/
		sublw .7
		btfss ZERO
		goto set8
		incf hours
		movf hours,0
		sublw .24
		btfsc ZERO
		clrf hours
		goto off_key		
	
set8		movf screen,0	;экран 7 установка минут /Min  12-00/
		sublw .8
		btfss ZERO
		goto set9
		incf minutes
		clrf seconds
		movf minutes,0
		sublw .60
		btfsc ZERO
		clrf minutes
		goto off_key

set9		movf screen,0	;экран 9 коррекция часов /Corr 00SEC/
		sublw .9
		btfss ZERO
		goto set12
		incf time_corr
		movf time_corr,0
		sublw .60
		btfsc ZERO
		call minus59
		goto off_key	

set12		movf screen,0	;экран 10 таймер1 уст.нагрузки /t1     OFF//t1   LIGHt//t1   LOAd1//t1   LOAd2/
		sublw .12
		btfss ZERO
		goto set13
		incf load1,0
		andlw .3
		movwf load1
		goto off_key	

set13		movf screen,0	;экран 11 таймер1 уст.времени вкл /On   12-00/	
		sublw .13
		btfss ZERO
		goto set14
		movlw .15
		addwf min_on1
		movf min_on1,0
		sublw .60
		btfss ZERO
		goto copy_off1
		clrf min_on1
		incf hr_on1
		movf hr_on1,0
		sublw .24
		btfsc ZERO
		clrf hr_on1
copy_off1	movf hr_on1,0
		movwf hr_off1
		movf min_on1,0
		movwf min_off1
		goto off_key		
	
set14		movf screen,0	;экран 12 таймер1 уст.времени выкл /OFF  12-00/			
		sublw .14
		btfss ZERO
		goto set15
		movlw .15
		addwf min_off1
		movf min_off1,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off1
		incf hr_off1
		movf hr_off1,0
		sublw .24
		btfsc ZERO
		clrf hr_off1
		goto off_key		
	
set15		movf screen,0	;экран 13 таймер2 уст.нагрузки /t2     OFF//t2   LIGHt//t2   LOAd1//t2  LOAd2/	
		sublw .15
		btfss ZERO
		goto set16
		incf load2,0
		andlw .3
		movwf load2
		goto off_key		
	
set16		movf screen,0	;экран 14 таймер2 уст.времени вкл /On   12-00/	
		sublw .16
		btfss ZERO
		goto set17
		movlw .15
		addwf min_on2
		movf min_on2,0
		sublw .60
		btfss ZERO
		goto copy_off2
		clrf min_on2
		incf hr_on2
		movf hr_on2,0
		sublw .24
		btfsc ZERO
		clrf hr_on2
copy_off2	movf hr_on2,0
		movwf hr_off2
		movf min_on2,0
		movwf min_off2
		goto off_key		
	
set17		movf screen,0	;экран 15 таймер2 уст.времени выкл /OFF  12-00/		
		sublw .17
		btfss ZERO
		goto set18
		movlw .15
		addwf min_off2
		movf min_off2,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off2
		incf hr_off2
		movf hr_off2,0
		sublw .24
		btfsc ZERO
		clrf hr_off2
		goto off_key		
	
set18		movf screen,0	;экран 16 таймер3 уст.нагрузки /t3     OFF//t3   LIGHt//t3   LOAd1//t3   LOAd2/
		sublw .18
		btfss ZERO
		goto set19
		incf load3,0
		andlw .3
		movwf load3
		goto off_key		
	
set19		movf screen,0	;экран 17 таймер3 уст.времени вкл /t3On 12-00/
		sublw .19
		btfss ZERO
		goto set20
		movlw .15
		addwf min_on3
		movf min_on3,0
		sublw .60
		btfss ZERO
		goto copy_off3
		clrf min_on3
		incf hr_on3
		movf hr_on3,0
		sublw .24
		btfsc ZERO
		clrf hr_on3
copy_off3	movf hr_on3,0
		movwf hr_off3
		movf min_on3,0
		movwf min_off3
		goto off_key		
	
set20		movf screen,0	;экран 18 таймер3 уст.времени выкл /t3OFF12-00/	
		sublw .20
		btfss ZERO
		goto set21
		movlw .15
		addwf min_off3
		movf min_off3,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off3
		incf hr_off3
		movf hr_off3,0
		sublw .24
		btfsc ZERO
		clrf hr_off3
		goto off_key		
	
set21		movf screen,0	;экран 19 таймер4 уст.нагрузки /t4     OFF//t4   LIGHt//t4   LOAd1//t4   LOAd2/
		sublw .21
		btfss ZERO
		goto set22
		incf load4,0
		andlw .3
		movwf load4
		goto off_key		
	
set22		movf screen,0	;экран 20 таймер4 уст.времени вкл /t4On 12-00/
		sublw .22
		btfss ZERO
		goto set23
		movlw .15
		addwf min_on4
		movf min_on4,0
		sublw .60
		btfss ZERO
		goto copy_off4
		clrf min_on4
		incf hr_on4
		movf hr_on4,0
		sublw .24
		btfsc ZERO
		clrf hr_on4
copy_off4	movf hr_on4,0
		movwf hr_off4
		movf min_on4,0
		movwf min_off4
		goto off_key		
	
set23		movf screen,0	;экран 21 таймер4 уст.времени выкл /t4OFF12-00/	
		sublw .23
		btfss ZERO
		goto set24
		movlw .15
		addwf min_off4
		movf min_off4,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off4
		incf hr_off4
		movf hr_off4,0
		sublw .24
		btfsc ZERO
		clrf hr_off4
		goto off_key		
	
set24		movf screen,0	;экран 22 таймер5 уст.нагрузки /t5     OFF//t5   LIGHt//t5   LOAd1//t5   LOAd2/
		sublw .24
		btfss ZERO
		goto set25
		incf load5,0
		andlw .3
		movwf load5
		goto off_key		
	
set25		movf screen,0	;экран 23 таймер5 уст.времени вкл /t5On 12-00/
		sublw .25
		btfss ZERO
		goto set26
		movlw .15
		addwf min_on5
		movf min_on5,0
		sublw .60
		btfss ZERO
		goto copy_off5
		clrf min_on5
		incf hr_on5
		movf hr_on5,0
		sublw .24
		btfsc ZERO
		clrf hr_on5
copy_off5	movf hr_on5,0
		movwf hr_off5
		movf min_on5,0
		movwf min_off5
		goto off_key		
	
set26		movf screen,0	;экран 24 таймер5 уст.времени выкл /t5OFF12-00/	
		sublw .26
		btfss ZERO
		goto set27
		movlw .15
		addwf min_off5
		movf min_off5,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off5
		incf hr_off5
		movf hr_off5,0
		sublw .24
		btfsc ZERO
		clrf hr_off5
		goto off_key		
	
set27		movf screen,0	;экран 25 таймер6 уст.нагрузки /t6     OFF//t6   LIGHt//t6   LOAd1//t6   LOAd2/
		sublw .27
		btfss ZERO
		goto set28
		incf load6,0
		andlw .3
		movwf load6
		goto off_key		
	
set28		movf screen,0	;экран 26 таймер6 уст.времени вкл /t6On 12-00/
		sublw .28
		btfss ZERO
		goto set29
		movlw .15
		addwf min_on6
		movf min_on6,0
		sublw .60
		btfss ZERO
		goto copy_off6
		clrf min_on6
		incf hr_on6
		movf hr_on6,0
		sublw .24
		btfsc ZERO
		clrf hr_on6
copy_off6	movf hr_on6,0
		movwf hr_off6
		movf min_on6,0
		movwf min_off6
		goto off_key		
	
set29		movf screen,0	;экран 27 таймер6 уст.времени выкл /t6OFF12-00/	
		sublw .29
		btfss ZERO
		goto off_key
		movlw .15
		addwf min_off6
		movf min_off6,0
		sublw .60
		btfss ZERO
		goto off_key
		clrf min_off6
		incf hr_off6
		movf hr_off6,0
		sublw .24
		btfsc ZERO
		clrf hr_off6
		goto off_key		
	
	
	
;кнопка +/Timers
keymode		btfss KEY_MODE
		goto off_key
		clrf ret_count
		incf screen

mode11		movf screen,0
		sublw .10
		btfss ZERO
		goto mode13
		movlw .30
		bsf STATUS,RP0
		movwf EEADR
		bcf STATUS,RP0
		movf min_temp,0
		bsf STATUS,RP0
		movwf EEDATA
		bcf STATUS,RP0
		call flash_wr
		movlw .31
		bsf STATUS,RP0
		movwf EEADR
		bcf STATUS,RP0
		movf max_temp,0
		bsf STATUS,RP0
		movwf EEDATA
		bcf STATUS,RP0
		call flash_wr
		movlw .32
		bsf STATUS,RP0
		movwf EEADR
		bcf STATUS,RP0
		movf time_corr,0
		bsf STATUS,RP0
		movwf EEDATA
		bcf STATUS,RP0
		call flash_wr
		clrf screen
		
mode13		movf screen,0
		sublw .13
		btfss ZERO
		goto mode16
		movf load1,0
		btfss ZERO
		goto mode16
		incf screen
		incf screen

mode16		movf screen,0
		sublw .16
		btfss ZERO
		goto mode19
		movf load2,0
		btfss ZERO
		goto mode19
		incf screen
		incf screen

mode19		movf screen,0
		sublw .19
		btfss ZERO
		goto mode22
		movf load3,0
		btfss ZERO
		goto mode22
		incf screen
		incf screen

mode22		movf screen,0
		sublw .22
		btfss ZERO
		goto mode25
		movf load4,0
		btfss ZERO
		goto mode25
		incf screen
		incf screen

mode25		movf screen,0
		sublw .25
		btfss ZERO
		goto mode28
		movf load5,0
		btfss ZERO
		goto mode28
		incf screen
		incf screen

mode28		movf screen,0
		sublw .28
		btfss ZERO
		goto mode30
		movf load6,0
		btfss ZERO
		goto mode30
		incf screen
		incf screen
		
mode30		movf screen,0
		sublw .30
		btfss ZERO
		goto off_key
		movlw 0x5f
		movwf FSR
		movlw .30
		movwf count
loop_wr		decf count,0
		bsf STATUS,RP0
		movwf EEADR
		bcf STATUS,RP0
		movf INDF,0
		bsf STATUS,RP0
		movwf EEDATA
		bcf STATUS,RP0
		call flash_wr
		incf FSR
		decfsz count
		goto loop_wr
		clrf screen
		


off_key		bcf KEY_SET
		bcf KEY_MODE



;рисование экрана
		movf screen,0		;экран 0 температура-время /25°с 12-00/
		btfss ZERO
		goto scr1
		btfsc DS_ERR
		goto therm_ok
		movlw 1
		movwf d0
		movwf d1
		goto next_scr
therm_ok	movf dstemp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d0
		movf ones,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d1
next_scr	movlw b'10101001'
		movwf d2
		movlw b'00000111'
		movwf d3
		clrf d4
		movf hours,0
		movwf hr_tmp
		movf minutes,0
		movwf min_tmp
		call clk_out
		btfss TMR1H,6
		goto end_screen
		movlw 0
		movwf d7
		goto  end_screen

scr1		movf screen,0		;экран 1 температура-состояние /25°с L12HC//25°с      /
		sublw .1
		btfss ZERO
		goto scr2
		btfsc DS_ERR
		goto therm_ok1
		movlw 1
		movwf d0
		movwf d1
		goto next_scr1
therm_ok1	movf dstemp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d0
		movf ones,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d1
next_scr1	movlw b'10101001'
		movwf d2
		movlw b'00000111'
		movwf d3
		clrf d4
		movlw 0x86
		movwf d5
		movlw 0x60
		movwf d6
		movlw 0x2f
		movwf d7
		movlw 0xe3
		movwf d8
		movlw 0x8e
		movwf d9
		btfss LIGHT
		clrf d5
		btfss LOAD1
		clrf d6
		btfss LOAD2
		clrf d7
		btfss HEATER
		clrf d8
		btfss COOLER
		clrf d9
		goto  end_screen

scr2		movf screen,0		;экран 2 ручное управление светом  /LIGHt  On //LIGHt  OFF/				
		sublw .2
		btfss ZERO
		goto scr3
		movlw .5		;кол-во символов
		movwf count
		movlw .10		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		
		btfsc LIGHT
		goto lig_show_on
		movlw .5		;кол-во символов
		movwf count
		movlw .0		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto end_screen
lig_show_on	movlw .5		;кол-во символов
		movwf count
		movlw .5		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto end_screen
			
scr3		movf screen,0		;экран 3 ручное управление нагрузкой1 /LOAd1  On //LOAd1 OFF/
		sublw .3
		btfss ZERO
		goto scr4
		movlw .5		;кол-во символов
		movwf count
		movlw .15		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		btfsc LOAD1
		goto show_load1_on
		movlw .5		;кол-во символов
		movwf count
		movlw .0		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto end_screen
show_load1_on	movlw .5		;кол-во символов
		movwf count
		movlw .5		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto  end_screen

scr4		movf screen,0		;экран 4 ручное управление нагрузкой2 /LOAd2  On //LOAd2 OFF/
		sublw .4
		btfss ZERO
		goto scr5
		movlw .5		;кол-во символов
		movwf count
		movlw .20		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		btfsc LOAD2
		goto show_load2_on
		movlw .5		;кол-во символов
		movwf count
		movlw .0		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto end_screen
show_load2_on	movlw .5		;кол-во символов
		movwf count
		movlw .5		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		goto  end_screen

scr5		movf screen,0		;экран 5 макс. температура	/Min t° 24/				
		sublw .5
		btfss ZERO
		goto scr6
		movlw .7		;кол-во символов
		movwf count
		movlw .32		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		movf min_temp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7
		movwf d8
		movf ones,0
		call seg7
		movwf d9
		clrf d7
		goto end_screen	
	
scr6		movf screen,0		;экран 6 мин. температура	/MAH t° 26/
		sublw .6
		btfss ZERO
		goto scr7
		movlw .7		;кол-во символов
		movwf count
		movlw .25		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		movf max_temp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7
		movwf d8
		movf ones,0
		call seg7
		movwf d9
		clrf d7
		goto  end_screen

scr7		movf screen,0		;экран 7 установка часов /Hour 12-00/
		sublw .7
		btfss ZERO
		goto scr8
		movlw .5		;кол-во символов
		movwf count
		movlw .39		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		movf hours,0
		movwf hr_tmp
		movf minutes,0
		movwf min_tmp
		call clk_out

		goto  end_screen

scr8		movf screen,0		;экран 8 установка минут /Min  12-00/ 
		sublw .8
		btfss ZERO
		goto scr9
		movlw .5		;кол-во символов
		movwf count
		movlw .44		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		movf hours,0
		movwf hr_tmp
		movf minutes,0
		movwf min_tmp
		call clk_out
		goto  end_screen
		
scr9		movf screen,0		;экран 9 коррекция часов /Corr 00SEC/ 
		sublw .9
		btfss ZERO
		goto scr12
		movlw .10		;кол-во символов
		movwf count
		movlw .49		;адрес первого символа
		movwf count2
		movlw 0			;знакоместо
		call message
		btfsc time_corr,7
		goto neg_scr
pos_scr		clrf d4
		movf time_corr,0
		goto corr_conv
neg_scr		movlw .1
		movwf d4
		comf time_corr,0
		movwf temp
		incf temp,0
corr_conv	movwf hexdata
		call convert		
		movf decs,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d5
		movf ones,0
		call seg7		;преобразовать в 7-сегментный код
		movwf d6
		goto  end_screen
		
scr12		movf screen,0		;экран 10 таймер1 уст.нагрузки /tr1    OFF//tr1  LIGHt//tr1  LOAd1//tr1  LOAd2/
		sublw .12
		btfss ZERO
		goto scr13
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0x60
		movwf d2
		clrf d3
		clrf d4
		movf load1,0
		call load_disp
		goto  end_screen

scr13		movf screen,0	;экран 11 таймер1 уст.времени вкл /On   12-00/
		sublw .13
		btfss ZERO
		goto scr14
		call disp_on
		movf hr_on1,0
		movwf hr_tmp
		movf min_on1,0
		movwf min_tmp
		call clk_out
		goto  end_screen

scr14		movf screen,0	;экран 12 таймер1 уст.времени выкл /OFF  12-00/			
		sublw .14
		btfss ZERO
		goto scr15
		call disp_off
		movf hr_off1,0
		movwf hr_tmp
		movf min_off1,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr15		movf screen,0	;экран 13 таймер2 уст.нагрузки /tr2    OFF//tr2  LIGHt//tr2  LOAd1//tr2  LOAd2/	
		sublw .15
		btfss ZERO
		goto scr16
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0x2f
		movwf d2
		clrf d3
		clrf d4
		movf load2,0
		call load_disp
		goto end_screen		
	
scr16		movf screen,0	;экран 14 таймер2 уст.времени вкл /On   12-00/	
		sublw .16
		btfss ZERO
		goto scr17
		call disp_on
		movf hr_on2,0
		movwf hr_tmp
		movf min_on2,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr17		movf screen,0	;экран 15 таймер2 уст.времени выкл /OFF  12-00/		
		sublw .17
		btfss ZERO
		goto scr18
		call disp_off
		movf hr_off2,0
		movwf hr_tmp
		movf min_off2,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr18		movf screen,0	;экран 16 таймер3 уст.нагрузки /tr3    OFF//tr3  LIGHt//tr3  LOAd1//tr3  LOAd2/
		sublw .18
		btfss ZERO
		goto scr19
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0x6d
		movwf d2
		clrf d3
		clrf d4
		movf load3,0
		call load_disp
		goto end_screen		
	
scr19		movf screen,0	;экран 17 таймер3 уст.времени вкл /On   12-00/
		sublw .19
		btfss ZERO
		goto scr20
		call disp_on
		movf hr_on3,0
		movwf hr_tmp
		movf min_on3,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr20		movf screen,0	;экран 18 таймер3 уст.времени выкл /OFF  12-00/	
		sublw .20
		btfss ZERO
		goto scr21
		call disp_off
		movf hr_off3,0
		movwf hr_tmp
		movf min_off3,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr21		movf screen,0	;экран 19 таймер4 уст.нагрузки /tr4    OFF//tr4  LIGHt//tr4  LOAd1//tr4  LOAd2/
		sublw .21
		btfss ZERO
		goto scr22
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0xe1
		movwf d2
		clrf d3
		clrf d4
		movf load4,0
		call load_disp
		goto end_screen		
	
scr22		movf screen,0	;экран 20 таймер4 уст.времени вкл /On   12-00/
		sublw .22
		btfss ZERO
		goto scr23
		call disp_on
		movf hr_on4,0
		movwf hr_tmp
		movf min_on4,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr23		movf screen,0	;экран 21 таймер4 уст.времени выкл /OFF  12-00/	
		sublw .23
		btfss ZERO
		goto scr24
		call disp_off
		movf hr_off4,0
		movwf hr_tmp
		movf min_off4,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr24		movf screen,0	;экран 22 таймер5 уст.нагрузки /tr5    OFF//tr5  LIGHt//tr5  LOAd1//tr5  LOAd2/
		sublw .24
		btfss ZERO
		goto scr25
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0xcd
		movwf d2
		clrf d3
		clrf d4
		movf load5,0
		call load_disp
		goto end_screen		
	
scr25		movf screen,0	;экран 23 таймер5 уст.времени вкл /On   12-00/
		sublw .25
		btfss ZERO
		goto scr26
		call disp_on
		movf hr_on5,0
		movwf hr_tmp
		movf min_on5,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr26		movf screen,0	;экран 24 таймер5 уст.времени выкл /OFF  12-00/	
		sublw .26
		btfss ZERO
		goto scr27
		call disp_off
		movf hr_off5,0
		movwf hr_tmp
		movf min_off5,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr27		movf screen,0	;экран 25 таймер6 уст.нагрузки /tr6    OFF//tr6  LIGHt//tr6  LOAd1//tr6  LOAd2/
		sublw .27
		btfss ZERO
		goto scr28
		movlw 0x87
		movwf d0
		movlw 0x03
		movwf d1
		movlw 0xcf
		movwf d2
		clrf d3
		clrf d4
		movf load6,0
		call load_disp
		goto end_screen		
	
scr28		movf screen,0	;экран 26 таймер6 уст.времени вкл /On   12-00/
		sublw .28
		btfss ZERO
		goto scr29
		call disp_on
		movf hr_on6,0
		movwf hr_tmp
		movf min_on6,0
		movwf min_tmp
		call clk_out
		goto end_screen		
	
scr29		movf screen,0	;экран 27 таймер6 уст.времени выкл /OFF  12-00/	
		sublw .29
		btfss ZERO
		goto end_screen
		call disp_off
		movf hr_off6,0
		movwf hr_tmp
		movf min_off6,0
		movwf min_tmp
		call clk_out
		
end_screen
;вывод на экран
		movlw 0
		call lcd_cw
		movf d0,0
		call lcd_dw
		movf d1,0
		call lcd_dw
		movf d2,0
		call lcd_dw
		movf d3,0
		call lcd_dw
		movf d4,0
		call lcd_dw
		movf d5,0
		call lcd_dw
		movf d6,0
		call lcd_dw
		movf d7,0
		call lcd_dw
		movf d8,0
		call lcd_dw
		movf d9,0
		call lcd_dw


		
;управление нагревателем
heat_ctrl	movf min_temp,0
		subwf dstemp,0
		btfsc CARRY
		goto off_heat
		bsf HEATER
		goto end_heat
off_heat	movf dstemp,0
		subwf min_temp,0
		btfsc CARRY
		goto end_heat
		bcf HEATER
end_heat

;управление охладителем
		movf dstemp,0
		subwf max_temp,0
		btfsc CARRY
		goto off_cool
		bsf COOLER
		goto end_cool
off_cool	movf max_temp,0
		subwf dstemp,0
		btfsc CARRY
		goto end_cool
		bcf COOLER
end_cool	
		
;ШИМ для охладителя
		btfss COOLER
		goto cool_off
		bsf COOL_ON
		movf max_temp,0
		subwf dstemp,0
		sublw .2
		btfss CARRY
		goto power_ctrl
		btfsc TMR1H,2
		goto power_ctrl
cool_off	bcf COOL_ON
		
;управление нагрузками

		
power_ctrl	btfsc DS_ERR	;если нет термометра - выключить нагреватель и охладитель
		goto ctrl_ok
		bcf HEATER		
		bcf COOLER
		bcf COOL_ON
ctrl_ok		btfss HEATER
		goto no_heat
		bsf HEAT_PIN
		goto cool_test
no_heat		bcf HEAT_PIN
cool_test	btfss COOL_ON
		goto no_cool
		bsf COOL_PIN
		goto light_test
no_cool		bcf COOL_PIN
light_test	btfss LIGHT
		goto no_light
		bsf LIGHT_PIN
		goto load1_test
no_light	bcf LIGHT_PIN
load1_test	btfss LOAD1
		goto no_load1
		bsf LOAD1_PIN
		goto load2_test
no_load1	bcf LOAD1_PIN
load2_test	btfss LOAD2
		goto no_load2
		bsf LOAD2_PIN
		goto end_power
no_load2	bcf LOAD2_PIN
end_power
		
		;контроль питания
		btfsc POWER
		goto power_on
		bsf STATUS,RP0
		movlw 0xFF
		movwf TRISA^80h
		bcf STATUS,RP0
		goto end_main_cycle
power_on	bsf STATUS,RP0
		movlw 0x30
		movwf TRISA^80h
		bcf STATUS,RP0
				
end_main_cycle	goto main_loop

thermometer	call init_therm
		btfsc DS_ERR
		goto ds_enable
		movlw 0xFF	
		movwf dstemp
		goto end_thermo
ds_enable	movlw 0xCC	;чтение температуры
		call send
		movlw 0xBE
		call send
		call reseive
		movwf dstemp
		call reseive
		movwf temp
		call init_therm ;инициализация термометра
		movlw 0xCC	;старт преобразования
		call send
		movlw 0x44
		call send
		rrf dstemp
		bcf dstemp,7
end_thermo	return	
init_therm	;инициализация термометра
		bsf DS_ERR	;считаем, что датчик исправен
		movlw .20	;время ожидания ответа
		movwf count2
		ds_comm
		bcf THERMO	;инициализация
	  	movlw .170	;задержка 500 мкс
		movwf count
delinittherm	decfsz count
		goto delinittherm
		bsf THERMO
		ds_data
init_ansv	btfss THERMO	;ожидание ответа
		goto end_ansv
		decfsz count2
		goto init_ansv
		bcf DS_ERR	;если нет ответа > датчик неиправен
		return
end_ansv	btfss THERMO	;ожидание освобождения шины
		goto end_ansv
		return
send		;передача команды
		movwf sendbyte	;данные для отправки
		movlw .8
		movwf count2
sendloop	ds_comm
		rrf sendbyte
		btfsc CARRY
		bsf THERMO
		call wait50
		ds_data
		decfsz count2
		goto sendloop
		return
reseive		;прием байта данных		
		movlw .8
		movwf count2
reseiveloop	ds_comm
		ds_data
		bcf CARRY
		btfsc THERMO
		bsf CARRY
		rrf reseivebyte 
		call wait50	
		decfsz count2
		goto reseiveloop
		movf reseivebyte,0
		return

;контроль таймеров
	

tmr_ctrl 	
			
		movf hr_on1,0
		movwf hr_tmp
		movf min_on1,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_on2
		movf load1,0
		btfsc ZERO
		goto ctrl_on2
		sublw .1
		btfss ZERO
		goto tr1_ld1
		bsf LIGHT
		goto ctrl_on2
tr1_ld1		movf load1,0
		sublw .2
		btfss ZERO
		goto tr1_ld2
		bsf LOAD1
		goto ctrl_on2
tr1_ld2		bsf LOAD2
ctrl_on2	movf hr_on2,0
		movwf hr_tmp
		movf min_on2,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_on3
		movf load2,0
		btfsc ZERO
		goto ctrl_on3
		sublw .1
		btfss ZERO
		goto tr2_ld1
		bsf LIGHT
		goto ctrl_on3
tr2_ld1		movf load2,0
		sublw .2
		btfss ZERO
		goto tr2_ld2
		bsf LOAD1
		goto ctrl_on3
tr2_ld2		bsf LOAD2
ctrl_on3	movf hr_on3,0
		movwf hr_tmp
		movf min_on3,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_on4
		movf load3,0
		btfsc ZERO
		goto ctrl_on4
		sublw .1
		btfss ZERO
		goto tr3_ld1
		bsf LIGHT
		goto ctrl_on4
tr3_ld1		movf load3,0
		sublw .2
		btfss ZERO
		goto tr3_ld2
		bsf LOAD1
		goto ctrl_on4
tr3_ld2		bsf LOAD2
ctrl_on4	movf hr_on4,0
		movwf hr_tmp
		movf min_on4,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_on5
		movf load4,0
		btfsc ZERO
		goto ctrl_on5
		sublw .1
		btfss ZERO
		goto tr4_ld1
		bsf LIGHT
		goto ctrl_on5
tr4_ld1		movf load4,0
		sublw .2
		btfss ZERO
		goto tr4_ld2
		bsf LOAD1
		goto ctrl_on5
tr4_ld2		bsf LOAD2
ctrl_on5	movf hr_on5,0
		movwf hr_tmp
		movf min_on5,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_on6
		movf load5,0
		btfsc ZERO
		goto ctrl_on6
		sublw .1
		btfss ZERO
		goto tr5_ld1
		bsf LIGHT
		goto ctrl_on6
tr5_ld1		movf load5,0
		sublw .2
		btfss ZERO
		goto tr5_ld2
		bsf LOAD1
		goto ctrl_on6
tr5_ld2		bsf LOAD2
ctrl_on6	movf hr_on6,0
		movwf hr_tmp
		movf min_on6,0
		movwf min_tmp
		call on_ctrl
		btfss ON_LOAD
		goto ctrl_off1
		movf load6,0
		btfsc ZERO
		goto ctrl_off1
		sublw .1
		btfss ZERO
		goto tr6_ld1
		bsf LIGHT
		goto ctrl_off1
tr6_ld1		movf load6,0
		sublw .2
		btfss ZERO
		goto tr6_ld2
		bsf LOAD1
		goto ctrl_off1
tr6_ld2		bsf LOAD2
ctrl_off1	movf hr_off1,0
		movwf hr_tmp
		movf min_off1,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		goto ctrl_off2
		movf load1,0
		btfsc ZERO
		goto ctrl_off2
		sublw .1
		btfss ZERO
		goto tr1_off1
		bcf LIGHT
		goto ctrl_off2
tr1_off1	movf load1,0
		sublw .2
		btfss ZERO
		goto tr1_off2
		bcf LOAD1
		goto ctrl_off2
tr1_off2	bcf LOAD2
ctrl_off2	movf hr_off2,0
		movwf hr_tmp
		movf min_off2,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		goto ctrl_off3
		movf load2,0
		btfsc ZERO
		goto ctrl_off3
		sublw .1
		btfss ZERO
		goto tr2_off1
		bcf LIGHT
		goto ctrl_off3
tr2_off1	movf load2,0
		sublw .2
		btfss ZERO
		goto tr2_off2
		bcf LOAD1
		goto ctrl_off3
tr2_off2	bcf LOAD2
ctrl_off3	movf hr_off3,0
		movwf hr_tmp
		movf min_off3,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		goto ctrl_off4
		movf load3,0
		btfsc ZERO
		goto ctrl_off4
		sublw .1
		btfss ZERO
		goto tr3_off1
		bcf LIGHT
		goto ctrl_off4
tr3_off1	movf load3,0
		sublw .2
		btfss ZERO
		goto tr3_off2
		bcf LOAD1
		goto ctrl_off4
tr3_off2	bcf LOAD2
ctrl_off4	movf hr_off4,0
		movwf hr_tmp
		movf min_off4,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		goto ctrl_off5
		movf load4,0
		btfsc ZERO
		goto ctrl_off5
		sublw .1
		btfss ZERO
		goto tr4_off1
		bcf LIGHT
		goto ctrl_off5
tr4_off1	movf load4,0
		sublw .2
		btfss ZERO
		goto tr4_off2
		bcf LOAD1
		goto ctrl_off5
tr4_off2	bcf LOAD2
ctrl_off5	movf hr_off5,0
		movwf hr_tmp
		movf min_off5,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		goto ctrl_off6
		movf load5,0
		btfsc ZERO
		goto ctrl_off6
		sublw .1
		btfss ZERO
		goto tr5_off1
		bcf LIGHT
		goto ctrl_off6
tr5_off1	movf load5,0
		sublw .2
		btfss ZERO
		goto tr5_off2
		bcf LOAD1
		goto ctrl_off6
tr5_off2	bcf LOAD2
ctrl_off6	movf hr_off6,0
		movwf hr_tmp
		movf min_off6,0
		movwf min_tmp
		call off_ctrl
		btfss OFF_LOAD
		return
		movf load6,0
		btfsc ZERO
		return
		sublw .1
		btfss ZERO
		goto tr6_off1
		bcf LIGHT
		return
tr6_off1	movf load6,0
		sublw .2
		btfss ZERO
		goto tr6_off2
		bcf LOAD1
		return
tr6_off2	bcf LOAD2
		return
		


wait50		movlw .12	;задержка 50мкс
		movwf count
loop50		nop
		decfsz count
		goto loop50
		return

clk_out		;преобразование и вывод времени (любого)
		movf hr_tmp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7
		movwf d5
		movf ones,0
		call seg7
		movwf d6
		movf min_tmp,0
		movwf hexdata
		call convert
		movf decs,0
		call seg7
		movwf d8
		movf ones,0
		call seg7
		movwf d9
		movlw .1
		movwf d7
		return

convert		;Перед вызовом в hexdata содержится исходное число
		;Результат в temp,decs,ones
		clrf temp
   		clrf decs
lj_sotni        ;цикл получения сотен
 		movlw .100
  		subwf hexdata,0
  		btfss CARRY
 		goto lj_des
 		movwf hexdata
 		incf temp
  		goto lj_sotni
lj_des          ;цикл получения десятков
   		movlw .10
   		subwf hexdata,0
   		btfss CARRY
  		goto lj_ed
  		movwf hexdata
  		incf decs
  		goto lj_des
lj_ed           ;в единицы - остаток
  		movf hexdata,0
  		movwf ones
  		return

max20deg	;установка max 20 град
		movf min_temp,0
		movwf max_temp
		return

min20deg	;установка min 20 град
		movlw .20
		movwf min_temp
		return
minus59		;установка коррекции -59
		movlw .197
		movwf time_corr
		return

corr		;коррекция часов
		btfsc CORR_BIT		;если коррекция уже была
		goto end_corr
		bsf CORR_BIT
		btfsc time_corr,7	;если коррекция отрицательная
		goto neg_corr
pos_corr	movf time_corr,0
		movwf seconds
		goto end_corr
neg_corr	comf time_corr,0	;преобразование доп. кода в абсолютное значение	
		sublw .59
		movwf seconds
		movlw .59
		movwf minutes
		movlw .23
		movwf hours
end_corr	return

;подпрограммы управления ЖКИ
lcd_dw		;запись данных ЖКИ	
		movwf temp
		movf temp,0	
		andlw 0x0F
		iorlw 0x20
		movwf PORTB
		bsf lcd_rs	
		bcf lcd_e
		bsf lcd_e
		swapf temp,0	
		andlw 0x0F
		iorlw 0x20
		movwf PORTB
		bsf lcd_rs	
		bcf lcd_e	
		bsf lcd_e
		return

lcd_cw		;запись команды ЖКИ	
		movwf temp
		movf temp,0	
		andlw 0x0F
		iorlw 0x20
		movwf PORTB
		bcf lcd_rs
		bcf lcd_e
		bsf lcd_e
		swapf temp,0	
		andlw 0x0F
		iorlw 0x20
		movwf PORTB
		bcf lcd_rs
		bcf lcd_e	
		bsf lcd_e
		return

message		;вывод сообщений
		;входные данные count - кол-во символов, count2 - отн. адрес первого символа, W - первое нужное знакоместо
		addlw 0x20
		movwf FSR
msg_loop	movf count2,0
		call msg_tab
		movwf INDF
		incf FSR
		incf count2
		decfsz count
		goto msg_loop
		return

load_disp	;вывод типа нагрузки данного таймера
		movwf temp
		movlw .5		;кол-во символов
		movwf count
		movf temp,0
		btfss ZERO
		goto disp_lig
		movlw .0		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		return
disp_lig	movf temp,0
		sublw .1
		btfss ZERO
		goto disp_ld1
		movlw .10		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		return
disp_ld1	movf temp,0
		sublw .2
		btfss ZERO
		goto disp_ld2
		movlw .15		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		return
disp_ld2	movlw .20		;адрес первого символа
		movwf count2
		movlw .5		;знакоместо
		call message
		return

disp_on		;показать On для таймеров
		movlw 0xee
		movwf d0 
		movlw 0x43
		movwf d1 
		clrf d2
		clrf d3
		clrf d4
		return

disp_off	;показать Off для таймеров
		movlw 0xee
		movwf d0 
		movlw 0x8b
		movwf d1 
		movlw 0x8b
		movwf d2 
		clrf d3
		clrf d4
		return

on_ctrl		;включить нагрузку?
		bcf ON_LOAD
		movf hr_tmp,0
		subwf hours,0
		btfss ZERO
		goto no_on
		movf min_tmp,0
		subwf minutes,0
		btfss ZERO
		goto no_on
		bsf ON_LOAD
no_on		return
off_ctrl	;выключить нагрузку?
		bcf OFF_LOAD	
		movf hr_tmp,0
		subwf hours,0
		btfss ZERO
		goto no_off
		movf min_tmp,0
		subwf minutes,0
		btfss ZERO
		goto no_off
		bsf OFF_LOAD
no_off		return

flash_wr	clrwdt
		bsf STATUS,RP0		;запись во FLASH
		bsf EECON1,WREN
		bcf INTCON,GIE
		movlw 0x55
		movwf EECON2
		movlw 0xAA
		movwf EECON2
		bsf EECON1,WR
wr_loop		btfsc EECON1,WR
		goto wr_loop
		bcf EECON1,WREN
		bsf INTCON,GIE
		bcf STATUS,RP0
		return


flash_rd	bsf STATUS,RP0		;чтение из FLASH
		bcf STATUS,RP1
		movwf EEADR
		bsf EECON1,RD
		movf EEDATA,0
		bcf STATUS,RP0
		return

	org 0x2100
		de 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.22,0,0,0,0,0,.13,.23,.26,0
	end
