;**********************************************
;*  Автомат защиты от перепадов напряжения    *
;**********************************************
;* Автор:             Котов И.Ю.              *
;* Среда разработки:  MPLAB IDE v7.31         *
;* Процессор:         PIC16F676               *
;* Схема подключения:                         *
;*    RC0,RC1,RC2,RC3,RC4,RC5,RA5 - вывод     * 
;*     индикации  сегменты  a,b,c,d,e,f,g     *
;*    RC0,RC1,RC2 - выводы кнопок UP,DN,MD    * 
;*    RC4,RA2,RA4 - выводы катодов K2,K1,K0   *
;*    AN0  - вход измерения напряжения        *
;*    RA1  - выход комутации нагрузки         *
;*    RST  - вывод соединённые с VCC          *
;*                         kotov_ig@mail.ru   *
;**********************************************

          NOLIST
        #INCLUDE <P16F676.inc>
 __CONFIG _MCLRE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _BODEN & _CP_OFF & _CPD_OFF
            
         ERRORLEVEL 2
          
;               биты регистра FLAG  
; 0 - время задержки включения не истекло/истекло (1/0)      
; 1 - напряжение вышло/не вышло за пределы (1/0) 
; 2 - показания мигают/не мигают на индикаторе (1/0)  
; 3 - напряжение только-что вернулось/не вернулось в норму(1/0)  
 

;               значение регистра BUTTON  
; B'00000000' - не была нажата ни одна кнопка
; B'00000001' - была нажата кнопка UP(SB1)       
; B'00000010' - была нажата кнопка DN(SB2) 
; B'00000011' - была нажата кнопка MD(SB3)   

;               значение регистра PICTER 
; B'00000000' - отбражается текущее напряжение    
; B'00000001' - отбражается надпись uhi 
; B'00000010' - отбражается надпись ulo
; B'00000011' - отбражается надпись dlt
; B'00000100' - отбражается установка максимального напряжения
; B'00000101' - отбражается установка минимального напряжения
; B'00000110' - отбражается установка времени задержки включения
   
; регистр FSR используется ,как указатель на блок индикации 
; прерыывания TMR1 ,происходят через каждые 5мс
   
 	  CBLOCK 0x20
 	  	
 	INDUHI  : 0x03   ;индикация надписи uhi
 	INDULO  : 0x03   ;индикация надписи ulo
 	INDDLT  : 0x03   ;индикация надписи dlt
 	U       : 0x02   ;текущее значение напряжения  
 	INDU    : 0x03   ;индикация текущего значения напряжения    
 	UH               ;максимальное значение напряжения 
 	INDUH   : 0x03   ;индикация максимального напряжения	 
 	UL               ;миниимальное значение напряжения
 	INDUL   : 0x03   ;индикация минимального напряжения 
 	DL               ;задержка времени включения 
 	INDDL   : 0x03   ;индикация задержки времени включения
 	FLAG             ;регистр флагов программы
 	PICTER           ;отображаемая надпись
 	PERIOD           ;счётчик,инкрементирующийся каждые 0,25с 
 	PRESKL           ;предделитель обнуляющийся каждые 0,25с 
 	DELAY            ;счётчик задержки включения
 	WAIT             ;время перехода из меню в рабочий режим
 	ALARM            ;счётчик ошибок при измерении напряжения
 	BUTTON           ;номер нажатой кнопки
 	BTNBUF           ;регистр для считывания состояния кнопок
 	BTNUP            ;длительность нажатия кнопки UP(SB1)
 	BTNDN            ;длительность нажатия кнопки DN(SB2)
 	BTNMD            ;длительность нажатия кнопки MD(SB3)
          TASK             ;адрес заадчи
          ARGH             ;резуьтат измерения
          ARGL  
	TMPH             ;вспомогательные регистры
	TMPL
	TMP
   	EETMP            ;регистр для сохранения EEADR
   	FSRTMP           ;регистр для сохранения FSR
	CNT              ;счётчик циклов 
	 
 	  ENDC

         LIST

  	  ORG 0x00
   	B INIT 
            ORG 0x04
          B INTER
          
;******************************************************
;*     табличная перекодировка символов индикатора    *
;******************************************************

INDTBL    ADDWF PCL           ;символ смещение 
 	RETLW B'00111111'   ;0
	RETLW B'00000110'   ;1
	RETLW B'01011011'   ;2
	RETLW B'01001111'   ;3
          RETLW B'01100110'   ;4
	RETLW B'01101101'   ;5
          RETLW B'01111101'   ;6
	RETLW B'00000111'   ;7
          RETLW B'01111111'   ;8
	RETLW B'01101111'   ;9
	
;******************************************************
;*          таблица обработки состояний кнопок        *
;******************************************************
		
STATETBL  ADDWF PCL       ;здесь осуществляется табличный 
PICTER_INDU_BUTTON_XX     ;переход по состоянию кнопок и 
          MOVF UH,W       ;текущего изображения на индикаторе
          SUBWF U+1,W     ;смещение в таблице определяется как
          SKPNC           ;PICTER << 0x05 + BUTTON << 0x03
          BSF FLAG,1      ;всего 28 восьмибайтных блоков
          BTFSC U,0       ;в конце командой RETLW в программу
          BSF FLAG,1      ;возвращается указатель на текущий блок
          B $+3           ;индикации, который заносится в FSR
          NOP
PICTER_INDU_BUTTON_UP      
          B PICTER_INDU_BUTTON_XX 
          MOVF U+1,W
          SUBWF UL,W
          SKPNC
          BSF FLAG,1
          RETLW INDU
          NOP
          NOP
PICTER_INDU_BUTTON_DN
          B PICTER_INDU_BUTTON_XX
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
PICTER_INDU_BUTTON_MD
          CLRF WAIT
          MOVLW 0x01
          MOVWF PICTER
          CLRF FLAG
          NOP
          NOP
          NOP
          RETLW INDUHI                
PICTER_INDUHI_BUTTON_XX
          INCFSZ WAIT
          RETLW INDUHI
          CLRF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDU
PICTER_INDUHI_BUTTON_UP
          CLRF WAIT
          MOVLW 0x02
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDULO
PICTER_INDUHI_BUTTON_DN
          CLRF WAIT
          MOVLW 0x03
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDDLT
PICTER_INDUHI_BUTTON_MD
          CLRF WAIT
          MOVLW 0x04
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDUH                           
PICTER_INDULO_BUTTON_XX
          INCFSZ WAIT
          RETLW INDULO
          CLRF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDU
PICTER_INDULO_BUTTON_UP
          CLRF WAIT
          MOVLW 0x03
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDDLT
PICTER_INDULO_BUTTON_DN
          CLRF WAIT
          MOVLW 0x01
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDUHI
PICTER_INDULO_BUTTON_MD
          CLRF WAIT
          MOVLW 0x05
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDUL                         
PICTER_INDDLT_BUTTON_XX
          INCFSZ WAIT
          RETLW INDDLT
          CLRF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDU
PICTER_INDDLT_BUTTON_UP
          CLRF WAIT
          MOVLW 0x01
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDUHI
PICTER_INDDLT_BUTTON_DN
          CLRF WAIT
          MOVLW 0x02
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDULO
PICTER_INDDLT_BUTTON_MD
          CLRF WAIT
          MOVLW 0x06
          MOVWF PICTER
          NOP
          NOP
          NOP
          NOP
          RETLW INDDL
PICTER_INDUH_BUTTON_XX
          INCFSZ WAIT
          RETLW INDUH
          CLRF PICTER
          MOVLW _UH
          MOVWF EETMP
          MOVF UH,W
          CALL EEWRITE
          RETLW INDU
PICTER_INDUH_BUTTON_UP
          CLRF WAIT
          MOVLW 0xFF
          SUBWF UH,W
          SKPZ
          INCF UH
          NOP  
          NOP
          RETLW INDUH
PICTER_INDUH_BUTTON_DN
          CLRF WAIT
          MOVLW 0xDE
          SUBWF UH,W
          SKPZ
          DECF UH
          NOP
          NOP
          RETLW INDUH
PICTER_INDUH_BUTTON_MD
          CLRF WAIT
          MOVLW 0x01
          MOVWF PICTER
          MOVLW _UH
          MOVWF EETMP
          MOVF UH,W
          CALL EEWRITE
          RETLW INDUHI
PICTER_INDUL_BUTTON_XX
          INCFSZ WAIT
          RETLW INDUL
          CLRF PICTER
          MOVLW _UL
          MOVWF EETMP
          MOVF UL,W
          CALL EEWRITE
          RETLW INDU
PICTER_INDUL_BUTTON_UP
          CLRF WAIT
          MOVLW 0xDA
          SUBWF UL,W
          SKPZ
          INCF UL
          NOP  
          NOP
          RETLW INDUL
PICTER_INDUL_BUTTON_DN
          CLRF WAIT
          MOVLW 0xAA
          SUBWF UL,W
          SKPZ
          DECF UL
          NOP
          NOP
          RETLW INDUL
PICTER_INDUL_BUTTON_MD
          CLRF WAIT
          MOVLW 0x02
          MOVWF PICTER
          MOVLW _UL
          MOVWF EETMP
          MOVF UL,W
          CALL EEWRITE
          RETLW INDULO         
PICTER_INDDL_BUTTON_XX
          INCFSZ WAIT
          RETLW INDDL
          CLRF PICTER
          MOVLW _DL
          MOVWF EETMP
          MOVF DL,W
          CALL EEWRITE
          RETLW INDU
PICTER_INDDL_BUTTON_UP
          CLRF WAIT
          MOVLW 0x1E
          SUBWF DL,W
          SKPZ
          INCF DL
          NOP 
          NOP
          RETLW INDDL
PICTER_INDDL_BUTTON_DN
          CLRF WAIT
          MOVLW 0x01
          SUBWF DL,W
          SKPZ
          DECF DL
          NOP
          NOP
          RETLW INDDL
PICTER_INDDL_BUTTON_MD
          CLRF WAIT
          MOVLW 0x03
          MOVWF PICTER
          MOVLW _DL
          MOVWF EETMP
          MOVF DL,W
          CALL EEWRITE
          RETLW INDDLT    
            
;******************************************************
;*                основная программа                  *
;******************************************************

INIT      CLRF PORTA
          CLRF PORTC
          MOVLW  0x07         ;отключаем компаратор
          MOVWF CMCON
          BSF STATUS,RP0      ;банк 1
          CALL 0x03FF         ;калибровка гениратора
          MOVWF OSCCAL
          MOVLW 0xFF          ;тактовая частота АЦП от
          MOVWF ADCON1        ;RC - гениратора
          MOVLW B'10000000'   ;подтягивающие резисторы 
          MOVWF OPTION_REG    ;для PORTA отключены 
          MOVLW 0x10          ;все линии PORTA ,кроме
          MOVWF TRISA         ;вывода OUT - на ввод
          CLRF TRISC          ;все линии PORTC на вывод
          MOVLW 1<<ANS3       ;вывод RA4 используем как 
          MOVWF ANSEL         ;аналоговый вход АЦП AN3
          CLRF VRCON          ;отключаем источник опорного напряжения
          CLRF WPUA
          BSF PIE1,TMR1IE     ;разрешение прерываний от TMR1 
          BCF STATUS,RP0      ;банк 0
          MOVLW B'00011100'   ;запись u
          MOVWF INDUHI
          MOVLW B'01110100'   ;запись h
          MOVWF INDUHI+1
          MOVLW B'00000100'   ;запись i
          MOVWF INDUHI+2
          MOVLW B'00011100'   ;запись u
          MOVWF INDULO
          MOVLW B'00111000'   ;запись l
          MOVWF INDULO+1
          MOVLW B'01011100'   ;запись o
          MOVWF INDULO+2
          MOVLW B'01011110'   ;запись d
          MOVWF INDDLT
          MOVLW B'00111000'   ;запись l
          MOVWF INDDLT+1
          MOVLW B'01111000'   ;запись t
          MOVWF INDDLT+2 
          MOVLW INDUH         ;здесь осуществляется начальная запись
          MOVWF FSR           ;в регистры UH,UL,DL сохранённых 
          MOVLW _UH           ;в EEPROM значений максимального,
          MOVWF EETMP         ;минимального напряжений и времени
          CALL EEREAD         ;задержки включения
          MOVWF UH            ;в функцию EEREAD передаются адреса
          MOVWF ARGL          ;ячеек EEPROM _UH,_UL,_DL через
          CLRF ARGH           ;регистр EETMP
          CALL BINDEC         ;функцию BINDEC осуществляет двоично-
          MOVLW INDUL         ;десятичную перекодировку числа
          MOVWF FSR           ;расположеного в ARGH:ARGL,результат
          MOVLW _UL           ;помещается в блок индикации на 
          MOVWF EETMP         ;который указывает FSR
          CALL EEREAD
          MOVWF UL
          MOVWF ARGL
          CLRF ARGH
          CALL BINDEC
          MOVLW INDDL
          MOVWF FSR
          MOVLW _DL
          MOVWF EETMP
          CALL EEREAD
          MOVWF DL
          MOVWF ARGL
          CLRF ARGH
          CALL BINDEC
          CALL ADCONVER
          MOVF U+1,W
          MOVWF ARGL
          MOVF U,W
          MOVWF ARGH
          MOVLW INDU
          MOVWF FSR
          CALL BINDEC
          CLRF ALARM
          CLRF PERIOD
          CLRF TASK
          CLRF PICTER
          CLRF ARGL
          CLRF ARGH
          CLRF BTNUP
          CLRF BTNDN
          CLRF BTNMD
          CLRF BUTTON
          CLRF FLAG 
          MOVLW INDU
          MOVWF FSR
          BSF T1CON,TMR1ON    ;TMR1 включён без предделителя           
          MOVLW (1<<GIE)|(1<<PEIE)
          MOVWF INTCON        ;глобальное разрешение прерываний
          B $
          
;******************************************************
;*       начало программы обработчика прерываний      *
;******************************************************	             

INTER     BCF PIR1,TMR1IF      ;сбрасуем флаг TMR1IF
          MOVLW 0xEC           ;и инициализируем TMR1
          MOVWF TMR1H          ;на переполнение через 5мс
          MOVLW 0x82
          MOVWF TMR1L
          CLRWDT
          INCF PRESKL          ;здесь идёт отчёт временных 
          MOVLW 0x32           ;промежутков
          SUBWF PRESKL,W       ;регистр PRESKL инкрементируется 
          SKPZ                 ;при каждом прирывании пока
          B $+0x0D             ;его содержимое не достигнет 50
          CLRF PRESKL          ;(т.е. прошло 50*5мс = 250мс) после
          INCF PERIOD          ;чего он обнуляется и инкрементируется
          MOVLW 0x04           ;регистр PERIOD
          ANDWF PERIOD,W       ;когда устанавливается 3-ий бит PERIOD
          BCF PERIOD,2         ;(т.е. прошло 4*250мс = 1с) декрементируется
          SKPZ                 ;заержка включения DELAY
          MOVLW 0x01           ;при достижении DELAY=0 сбрасывается
          MOVF DELAY           ;флаг задержки включения
          SKPZ
          SUBWF DELAY
          SKPNZ
          BCF FLAG,0
          MOVF TASK            ;при каждом прерывании поочерёдно
          SKPNZ                ;выполняются отображение символов 
          B SIMBOL0            ;на индикаторе и опрос кнопок,
          DECF TASK            ;измерение напряжения с частотой 50Гц
          SKPNZ
          B SIMBOL1 
          DECF TASK
          SKPNZ
          B SIMBOL2
          B BTNPRES
SIMBOL0   MOVLW 0x01            ;отображение младшего знакоместа      
          MOVWF TASK
          BTFSS FLAG,2
          B $+0x0A
          BTFSS FLAG,0
          B $+6
          BTFSC PERIOD,1
          B $+6
          MOVLW 0xF4
          MOVWF PORTC
          RETFIE
          BTFSS PERIOD,0
          B $-4
          INCF FSR
          INCF FSR
          MOVF INDF,W
          MOVWF TMPL
          ANDLW 0x07
          MOVWF TMPH
          DECF FSR
          DECF FSR
          MOVF PORTA,W
          ANDLW 0xF8
          IORWF TMPH
          RRF TMPL
          RRF TMPL
          RRF TMPL,W
          ANDLW 0x0F
          IORLW 0xE0
          BSF STATUS,RP0
          BCF TRISC,2
          BTFSS TMPL,3
          BSF TRISC,2
          BCF STATUS,RP0
          MOVWF PORTC
          MOVF TMPH,W
          MOVWF PORTA
          RETFIE
SIMBOL1   MOVLW 0x02            ;отображение среднего знакоместа  
          MOVWF TASK
          BTFSS FLAG,2
          B $+0x0A
          BTFSS FLAG,0
          B $+6
          BTFSC PERIOD,1
          B $+6
          MOVLW 0xF4
          MOVWF PORTC
          RETFIE
          BTFSS PERIOD,0
          B $-4
          INCF FSR
          MOVF INDF,W
          MOVWF TMPL
          ANDLW 0x07
          MOVWF TMPH
          DECF FSR
          MOVF PORTA,W
          ANDLW 0xF8
          IORWF TMPH
          RRF TMPL
          RRF TMPL
          RRF TMPL,W
          ANDLW 0x0F
          IORLW 0xD0
          BSF STATUS,RP0
          BCF TRISC,2
          BTFSS TMPL,3
          BSF TRISC,2
          BCF STATUS,RP0
          MOVWF PORTC
          MOVF TMPH,W
          MOVWF PORTA
          RETFIE         
SIMBOL2   MOVLW 0x03             ;отображение старшего знакоместа  
          MOVWF TASK
          BTFSS FLAG,2
          B $+0x0A
          BTFSS FLAG,0
          B $+6
          BTFSC PERIOD,1
          B $+6
          MOVLW 0xF4
          MOVWF PORTC
          RETFIE
          BTFSS PERIOD,0
          B $-4
          MOVF INDF,W
          MOVWF TMPL
          ANDLW 0x07
          MOVWF TMPH
          MOVF PORTA,W
          ANDLW 0xF8
          IORWF TMPH
          RRF TMPL
          RRF TMPL
          RRF TMPL,W
          ANDLW 0x0F
          IORLW 0xF0
          BSF STATUS,RP0
          BCF TRISC,2
          BCF STATUS,RP0
          MOVWF PORTC
          MOVF TMPH,W
          MOVWF PORTA
          RETFIE                
BTNPRES   CLRF TASK            ;определение состояния программы
	MOVF FSR,W          
	MOVWF FSRTMP
          CALL ADCONVER        ;измерение наряпряжения
          MOVLW INDU
  	MOVWF FSR
	MOVF U,W
          MOVWF ARGH 
          MOVF U+1,W
          MOVWF ARGL
	CALL BINDEC          ;преобразование результата
	MOVF FSRTMP,W
  	MOVWF FSR
          CALL BTNPOL          ;опрос кнопок        
          MOVWF BUTTON 
          SWAPF BUTTON
          CLRC
          RRF BUTTON
          SWAPF PICTER
          CLRC
          RLF PICTER,W
          SWAPF PICTER
          IORWF BUTTON,W
          CLRF BUTTON
          CALL STATETBL         ;переопределение состояния
          MOVWF FSR             ;программы по таблице
          INCF ALARM            ;если напряжение вышло за
          BTFSS FLAG,1          ;пределы то инкрементируется
          CLRF ALARM            ;счётчик ошибок ALARM 
          BCF FLAG,1            ;до тех пор пока ALARM=5,
          MOVF ALARM,W          ;после чего нагрузка отключается
          SUBLW 0x05
          SKPZ
          B $+7
          BCF PORTA,5
          BCF FLAG,0
          BSF FLAG,2
          BSF FLAG,3
          DECF ALARM
          B $+0x0D
          BTFSC FLAG,3
          BSF FLAG,0
          MOVF DL,W
          BTFSC FLAG,3
          MOVWF DELAY
          BTFSC FLAG,3
          CLRF ALARM
          BCF FLAG,3
          BTFSS FLAG,0
          BSF PORTA,5
          BTFSS FLAG,0
          BCF FLAG,2
          CLRF ARGH
          MOVF UH,W
          MOVWF ARGL  
          MOVLW INDUH
          SUBWF FSR,W
          SKPZ
          B $+3
          CALL BINDEC
          RETFIE
          MOVF UL,W
          MOVWF ARGL 
          MOVLW INDUL
          SUBWF FSR,W  
          SKPZ
          B $+3
          CALL BINDEC
          RETFIE
          MOVF DL,W
          MOVWF ARGL  
          MOVLW INDDL
          SUBWF FSR,W
          SKPZ
          B $+3
          CALL BINDEC
          RETFIE
          MOVF U,W
          MOVWF ARGH 
          MOVF U+1,W
          MOVWF ARGL  
          MOVLW INDU
          SUBWF FSR,W
          SKPNZ
          CALL BINDEC
          RETFIE
          
;******************************************************
;*            подпрограмма опроса кнопок              *
;******************************************************
	         
BTNPOL   	BSF STATUS,RP0         ;здесь считывается состояние
          MOVLW 0xFF             ;кнопок на линиях PA0-PA2 в BTNBUF
          MOVWF TRISC            ;при обнаружении нажатых
	MOVLW 0x1F             ;кнопок SB1,SB2,SB3(UP,DN,MD)
	MOVWF TRISA            ;инкрементируются счётчики
	MOVLW 0x07             ;длительности нажатия BTNUP,BTNDN,
	MOVWF WPUA             ;BTNMD соответственно
	CLRF OPTION_REG        ;код нажатой клавиши возвращается в
	BCF STATUS,RP0         ;программу через RETLW 
	MOVF PORTA,W
	ANDLW 0x07
	MOVWF BTNBUF
	BSF STATUS,RP0
	CLRF TRISC
	MOVLW 0x10
	MOVWF TRISA
	BSF OPTION_REG,NOT_RAPU
	CLRF WPUA
	BCF STATUS,RP0
	MOVLW 0x00
	RRF BTNBUF
	SKPC
	ADDLW 0x01
	RRF BTNBUF
	SKPC
	ADDLW 0x01
	RRF BTNBUF
	SKPC
	ADDLW 0x01
	XORLW 0x01
	SKPNZ
	B $+5
	CLRF BTNUP
	CLRF BTNDN
	CLRF BTNMD
	RETLW 0x00
	SKPNC
	B $+0x10
	CLRF BTNUP
	CLRF BTNDN
	INCF BTNMD
	MOVLW 0x08
	XORWF BTNMD,W
	SKPNZ
	RETLW 0x03
	MOVLW 0x8F
	ANDWF BTNMD,W
	XORLW 0x88
          MOVLW 0x80
	SKPZ
	RETLW 0x00
	MOVWF BTNMD
	RETLW 0x03 
	RLF BTNBUF
          SKPNC
	B $+0x10
	CLRF BTNUP
	CLRF BTNMD
	INCF BTNDN
	MOVLW 0x08
	XORWF BTNDN,W
	SKPNZ
	RETLW 0x02
	MOVLW 0x8F
	ANDWF BTNDN,W
	XORLW 0x88
	MOVLW 0x80
	SKPZ
	RETLW 0x00
	MOVWF BTNDN
	RETLW 0x02 	
	CLRF BTNMD
	CLRF BTNDN
	INCF BTNUP
	MOVLW 0x08
	XORWF BTNUP,W
	SKPNZ
	RETLW 0x01
	MOVLW 0x8F
	ANDWF BTNUP,W
	XORLW 0x88
	MOVLW 0x80
	SKPZ
	RETLW 0x00
	MOVWF BTNUP
	RETLW 0x01 
	
;******************************************************
;*подпрограмма записи байта в энергонезависимую память*
;****************************************************** 
          
EEWRITE   BSF STATUS,RP0         ;число для записи передаётся
	MOVWF EEDAT            ;через W, адрес для записи в EETMP
	MOVF EETMP,W
          MOVWF EEADR
	BSF EECON1,WREN
	MOVLW 0x55
	MOVWF EECON2    
          MOVLW 0xAA
	MOVWF EECON2 
          BSF EECON1,WR
	BTFSC EECON1,EEIF
	B $-1
	BCF EECON1,EEIF
          BCF EECON1,WREN	 
	BCF STATUS,RP0
          RETURN
          
;******************************************************
;*  подпрограмма чтения из энергонезависимуой памяти  *
;****************************************************** 
          
EEREAD    BSF STATUS,RP0          ;прочитанное число возвращается
          MOVF EETMP,W            ;в W, адрес для чтения в EETMP
          MOVWF EEADR
	BSF EECON1,RD
	MOVF EEDATA,W   
          BCF STATUS,RP0
	RETURN
	
;******************************************************
;*         подпрограмма измерения напряжения          *
;****************************************************** 	

ADCONVER  MOVLW (1<<ADFM)|(1<<ADON)|(1<<CHS1)|(1<<CHS0)
	MOVWF ADCON0              
	CALL D100uS
	BSF ADCON0,GO
	BTFSC ADCON0,GO_DONE 
	B $-1
	MOVF ADRESH,W
	MOVWF U
	BSF STATUS,RP0
	MOVLW U+1
	MOVWF FSR
	MOVF ADRESL,W
	MOVWF INDF
	BCF STATUS,RP0
	CLRC
	RRF U
	RRF U+1
          RETURN
          
;******************************************************
;*   подпрограмма двоично-десятичной перекодировки    *
;****************************************************** 
         
BINDEC    CLRF TMPL              ;в подпрограмму передаётся двоичное
          CLRF TMPH              ;число в регистрах ARGH:ARGL
          MOVLW 0x10             ;после преобразовании и приведения
          MOVWF CNT              ;к формату индикатора через INDTBL 
BD1       RLF ARGL               ;десятичный результат заносится в
          RLF ARGH               ;блок индикации на который указывает FSR
          RLF TMPL
          RLF TMPH
          DECFSZ CNT
          B BD2
          MOVLW 0x0F
          ANDWF TMPH,W
          CALL INDTBL
          MOVWF INDF
          MOVLW 0x3F
          SUBWF INDF,W
          SKPNZ
          CLRF INDF
          INCF FSR
          SWAPF TMPL,W
          ANDLW 0x0F
          CALL INDTBL
          MOVWF INDF
          INCF FSR
          MOVLW 0x0F
          ANDWF TMPL,W
          CALL INDTBL
          MOVWF INDF
          DECF FSR
          DECF FSR
          RETURN
BD2       MOVLW 0x03
          ADDWF TMPL,W 
          MOVWF TMP
          BTFSC TMP,3
          MOVWF TMPL
          MOVLW 0x30
          ADDWF TMPL,W 
          MOVWF TMP
          BTFSC TMP,7
          MOVWF TMPL                                        
          MOVLW 0x03
          ADDWF TMPH,W 
          MOVWF TMP
          BTFSC TMP,3
          MOVWF TMPH
          MOVLW 0x30
          ADDWF TMPH,W 
          MOVWF TMP
          BTFSC TMP,7
          MOVWF TMPH      
          B BD1
          
;******************************************************
;*            подпрограмма задержки 100мкс            *
;****************************************************** 
         
 D100uS   MOVLW 0x19
          ADDLW 0xFF
          SKPZ
          B $-2
    	RETURN
    	
           ORG 0x2100
          
      _UH    DE   0xFF   ;начальное максимальное напряжения 255В
      _UL    DE   0xAA   ;начальное минимальное напряжения 170В
      _DL    DE   0x0A   ;начальная задержка времени включения 10с
          
           END	
          

