; модуль с индикатором SC 1602 ASLB-XH-HS-G
; приставка для зарядного устройства ( до 10 А )
; напряжение входное до 25 вольт

            #INCLUDE P16F676.INC
           __CONFIG 31F4H

;==============================================
; РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ.
;==============================================
;----- регистры времени -----------------
C1	EQU	20H	; регистр часов
C2	EQU	21H	; регистр минут
C3	EQU	22H	; регистр секунд
;----- регистры дисплея -----------------
R1	EQU	23H	; РЕГИСТРЫ ИНДИКАЦИИ.
R2	EQU	24H	; верхней строки
R3	EQU	25H	;
R4	EQU	26H	;
R5	EQU	27H	;
R6	EQU	28H	;
R7	EQU	29H	;
R8	EQU	2AH	;
R9	EQU	2BH	;
R10	EQU	2CH	;
R11	EQU	2DH	;
R12	EQU	2EH	;
R13	EQU	2FH	;
R14	EQU	30H	;
R15	EQU	31H	;
R16	EQU	32H	;
R21	EQU	33H	;РЕГИСТРЫ ИНДИКАЦИИ.
R22	EQU	34H	;нижней строки
R23	EQU	35H	;
R24	EQU	36H	;
R25	EQU	37H	;
R26	EQU	38H	;
R27	EQU	39H	;
R28	EQU	3AH	;
R29	EQU	3BH	;
R30	EQU	3CH	;
R31	EQU	3DH	;
R32	EQU	3EH	;
R33	EQU	3FH	;
R34	EQU	40H	;
R35	EQU	41H	;
R36	EQU	42H	;
;----- регистры пересчёта -----------------
DEST	EQU	43H	; дес тысяч
TYS	EQU	44H	; тысячи
SOT	EQU	45H	; сотни
DES	EQU	46H	; десятки
EDI	EQU	47H	; единицы
Sb	EQU	48H	; выводимый символ
ost	EQU	49H	; остаток деления вычисления ёмкости
A1	EQU	4AH	; результат вычислений мл бит
A10	EQU	4BH	; результат вычислений ст бит
;----- регистры временного хранения ---------
tmp	EQU	4CH	; в процедуре вывода на экран
pau	EQU	4DH	; счётчик паузы
cnt	EQU	4EH	; счётчик для вывода на дисплей
cnt1	EQU	4FH	; счётчик пересчёта
tmp1	EQU	50H	; в процедуре convert
tmp2	EQU	51H	; временный
tmp3	EQU	52H	;
I10	EQU	53H	; ток зарядки старший байт(среднее значение)
I1	EQU	54H	; ток зарядки младший байт(среднее значение)
E10	EQU	55H	; ёмкость аккумулятора ст байт
E1	EQU	56H	; ёмкость аккумулятора мл байт
;---- уставка времени зарядки ---------------
Zr1	EQU	57H	; мл байт Ёмкости зарядки ( мА\час )
Zr10	EQU	58H	; ст байт Ёмкости зарядки
Szi	EQU	59H	; остаток при вычислении среднего тока
;*************************************************************
;****** 1. ПУСК. **********************************************
;*************************************************************
        org 0
	call	init
	call	inilcd		; настройка индикатора
	goto	emk		; установка ёмкости
;**********************************************
;*** 2.  Настройка контроллера *****************
;**********************************************
init	clrwdt
	bsf	STATUS,5	; БАНК 1.
;	movlw	0FF
;	movwf	OSCCAL		; максимальная частота
	movlw	B'00100000'	
	movwf	ADCON1		;
	movlw	B'00000001'	;
	movwf	OPTION_REG	;
	movlw	B'00000000'	; запрет прерываний
	movwf	INTCON		;
	clrf	PIE1		;
	movlw	B'00011111'	; RA0 - RA4 - входы
	movwf	TRISA		; RA5 - выход
	clrf	TRISC		; RC0-RC5 - выходы
	movlw	B'00000111'
	movwf	ANSEL		; RA0-RA2 - аналоговый вход
	clrf	VRCON		;
	clrf	PCON		;
	movlw	B'00110000'
	movwf	WPUA		; резисторы включены
	clrf	IOCA		;
	bcf	STATUS,5	; БАНК 0.
	clrf	PORTC		;
	clrf	PORTA		;
	clrf	T1CON		;
	movlw	.7
	movwf	CMCON		;
;-------------------------------------------
	clrf	TMR0             ;обнуляем переменные
	clrf	DEST
	clrf	TYS
	clrf	SOT
	clrf 	DES
	clrf 	EDI
	clrf	A10
	clrf	A1
	clrf	I10
	clrf	I1
	clrf	Zr10
	clrf	Zr1
	clrf	ost
	clrf	Szi
	clrf	E10
	movlw	.50
	movwf	E1		; начальная уставка ёмкости 
clrs	clrf	C1		; сброс часов
	clrf	C2
	clrf 	C3
	return
;**********************************
;*** 3. ИНИЦИАЛИЗАЦИЯ ЖКИ.  *******
;**********************************
inilcd
	call	pau1ms
        movlw   3
        call    LEDcom
	call	strob
        movlw   3
        call    LEDcom
	call	strob
        movlw   3          ;
	call    LEDcom
	call	strob
        movlw   10         ;
	call    LEDcom     ;
	call	strob
        movlw   06         ;
	call    LEDcom     ;
	call	strob
        movlw   01         ;
	call    LEDcom     ;
	call	strob
        movlw   28         ;
        call    LEDcom     ;
	call	strob
        movlw   28         ;
        call    LEDcom     ;
	call	strob
        movlw   0C         ;
        call    LEDcom     ;
	call	strob
	return
;*******************************************************
;*** 4. очистка индикатора ******************************
;*******************************************************
clrd	clrwdt			; 
	movlw	20h
	movwf	R1
	movwf	R2
	movwf	R3
	movwf	R4
	movwf	R5
	movwf	R6
	movwf	R7
	movwf	R8
	movwf	R9
	movwf	R10
	movwf	R11
	movwf	R12
	movwf	R13
	movwf	R14
	movwf	R15
	movwf	R16
	movwf	R21
	movwf	R22
	movwf	R23
	movwf	R24
	movwf	R25
	movwf	R26
	movwf	R27
	movwf	R28
	movwf	R29
	movwf	R30
	movwf	R31
	movwf	R32
	movwf	R33
	movwf	R34
	movwf	R35
	movwf	R36
	return
;*******************************************************
;** 5. ПЕРЕДАЧА КОМАНДЫ В ЖКИ.  ************************
;*******************************************************
LEDcom
        bcf     PORTC,5		; запись команд
        movwf   tmp		;
	swapf   tmp,W		;
 	andlw	B'00001111'	; обнуляем старшие разряды
        movwf   PORTC		;
        call    strob		; строб
        call    pau1ms		; пауза
        movfw   tmp
 	andlw	B'00001111'	; обнуляем старшие разряды
        movwf   PORTC		;
        call    strob		; строб
pau1ms
        movlw   .255		; пауза 1 мсек
	call	Psm
	return
;*********************************************************
;*** 6. ЗАПИСЬ ДАННЫХ В ЖКИ.  ****************************
;*********************************************************
Symb	movwf   tmp		; временное хранение
	swapf   tmp,W		; меняем местами полубайты
	andlw	B'00001111'	; обнуляем старшие разряды
	movwf   PORTC		;
	bsf     PORTC,5		; запись данных
	call    strob		; строб
	call    pausm		; пауза
	movfw   tmp		;
	andlw	B'00001111'	; обнуляем старшие разряды
	movwf   PORTC		;
	bsf     PORTC,5		; запись данных
	call    strob		; строб
	call	pausm		; пауза
	return
;*******************************************************
;*** 7. ФОРМИРОВАНИЕ СТРОБИРУЮЩЕГО ИМПУЛЬСА. ************
;*******************************************************
strob	clrwdt
	nop
	bsf     PORTC,4    ;
	movlw   .25
	call	Psm
	bcf     PORTC,4    ;
	return             ;
;*************************************************
;*** 8. Процедура вывода R1 - R36  на индикацию ***
;*************************************************
LCD 	movlw   02		;
	call    LEDcom		;
        movlw   B'10000000'	;
        call    LEDcom		;
	movlw	.16		;
	movwf	cnt		;
        movlw   R1		;
	movwf	FSR		;
	movfw	INDF		;
        call    Symb		;
	decf	cnt,1		;
	btfsc	STATUS,2	;
	goto	$+3		;
	incf	FSR,1		;
	goto	$-6		;
        movlw   B'11000000'	;
        call    LEDcom		;
	movlw	.16		;
	movwf	cnt		;
	incf	FSR,1		;
	movfw	INDF		;
        call    Symb		;
	decf	cnt,1		;
	btfss	STATUS,2	;
	goto	$-5		;
	return
;*******************************************
;*** 9. Паузы ******************************
;*******************************************
pausm
	movlw   .10		;40 МКС.
	addlw   -1
	btfss   STATUS,2
	goto    $-2
	return
;===========================================
pau25ms
        movlw   .25	; 25
        movwf   pau
PAUS	clrwdt
        movlw   .248
	call	Psm
        decfsz  pau,1
        goto    PAUS
        return
;==========================================
pau1s	movlw	.51
	movwf	tmp		; 
	call	pau25ms
	decfsz	tmp,1
	goto	$-2
	return
;==========================================
Psm	addlw	-1		;
	btfss	STATUS,2	;
	goto	$-2		;
	return			;
;***********************************************
;* 10. перекодировка 1 байта в SOT, DES, EDI  ***
;***********************************************
conv
	clrf	SOT		; сотни = 0
	clrf	DES		; десятки = 0
	movwf	EDI		; единицы = W
	addlw	-0Ah
	btfss	STATUS,0	; если переполнение
	goto	$+4		; завершаем перекодировку
	movwf	EDI		; запишем в единицы
	incf	DES,1		; десятки + 1
	goto	$-5		; повторяем вычитание
	movf	DES,0		;
	addlw	-0Ah
	btfss	STATUS,0	; если переполнение
	goto	$+4		; завершаем перекодировку
	movwf	DES		; запишем в единицы
	incf	SOT,1		; десятки + 1
	goto	$-5		; повторяем вычитание
	call	pers		; перевод в символы
	return
;*********************************************************
;*** 11. ПРОВЕРКА ДЛЯ ЧАСОВ  *****************************
;*********************************************************
chek	incf	C3,1		; проверка на переполнение
	clrf	STATUS		;  единиц секунд
	movlw	.60		; W=10
	subwf	C3,0		; вычитаем из W-C3
	btfsc	STATUS,0	; результат=0 ?
	clrf	C3		; если да то сброс Т6
	btfsc	STATUS,0
	incf	C2,1		; Т5 + 1
	movlw	.60		; W=10
	subwf	C2,0		; вычитаем из W-C3
	btfsc	STATUS,0	; результат=0 ?
	clrf	C2		; если да то сброс Т6
	btfsc	STATUS,0
	incf	C1,1		; Т5 + 1
	movlw	.24		; W=10
	subwf	C1,0		; вычитаем из W-C3
	btfsc	STATUS,0	; результат=0 ?
	clrf	C1		; если да то сброс Т6
	return
;*******************************************************
;*** 12. Процедуры выдачи результата измерения **********
;*******************************************************
outA	clrwdt
	movlw	49		; вывод " I "
	movwf	R1
	movlw	3D		; вывод " = "
	movwf	R2
	movf	SOT,W		; вывод десятков
	movwf	R3
	movf	DES,W		; вывод	единиц
	movwf	R4
	movlw	2C		; вывод " , "
	movwf	R5
	movf	EDI,W		; вывод десятых
	movwf	R6
	movlw	41		; " A "
	movwf	R7
	return
;-----------------------------------------------
outU	clrwdt
	movlw	55		; вывод " U "
	movwf	R21
	movlw	3D		; вывод " = "
	movwf	R22
	movf	SOT,0		; 
	movwf	R23		; десятки
	movf	DES,0		; 
	movwf	R24		; единицы
	movlw	2C		; вывод " , "
	movwf	R25		; 
	movf	EDI,0		; 
	movwf	R26		; десятые
	movlw	76h		; вывод " v "
	movwf	R27
	return
;-----------------------------------------------------
time	clrwdt
	movf	C1,W		; вывод часов
	call	conv		; пересчёт
	movf	DES,0		; десятки - в R1
	movwf	R9
	movf	EDI,0		; единицы - в R2
	movwf	R10
	movlw	3Ah		; ":"
	movwf	R11
	movf	C2,W		; вывод минут
	call	conv		; пересчёт
	movf	DES,0		; десятки - в R4
	movwf	R12
	movf	EDI,0		; единицы - в R5
	movwf	R13
	movlw	3Ah		; ":"
	movwf	R14
	movf	C3,W		; вывод часов
	call	conv		; пересчёт
	movf	DES,0		; десятки - в R7
	movwf	R15
	movf	EDI,0		; единицы - в R8
	movwf	R16
	return
;***************************************************************
; Процедура перевода двух 8-битных чисел для вывода на индикатор
; Данные посылаются в A1 ( мл.разряд)и A10 (ст.разряд)
;***************************************************************
convert	clrwdt
	clrf	DEST		;дес тысяч
	clrf	TYS		;тысячи
	clrf	SOT		;сотни
	clrf	DES		;десятки
	clrf	EDI		;единицы
;-- перекодировка младшего байта -------------------
	movf	A1,0
	movwf	EDI
	addlw	-0Ah
	btfss	STATUS,0	; если переполнение,
	goto	$+4		; завершаем перекодировку 
	movwf	EDI		; запишем в единицы
	incf	DES,1		; десятки + 1
	goto	$-5		; повторим вычитание
	movf	DES,0		;
	movwf	tmp1		;
	addlw	-0Ah
	btfss	STATUS,0	; если переполнение,
	goto	$+4		; завершаем перекодировку  
	movwf	DES		; запишем в единицы
	incf	SOT,1		; сотни + 1
	goto	$-5		; повторим вычитание
;-- перекодировка старшего байта ----------------------
	clrwdt
	movf	A10,0		; сохраняем t10
	movwf	tmp1		; 
next1	clrw			; прибавляем 256 А10 раз
	subwf	tmp1,0		; с проверкой на переполнение
	btfsc	STATUS,Z	; если =0
	return			; выходим из процедуры
	movlw	.6
	addwf	EDI
	movlw	.10		; W=10
	subwf	EDI,0		; вычитаем из EDI - W
	btfsc	STATUS,C	; EDI>10 ?
	movwf	EDI		; если да то W ->EDI
	btfsc	STATUS,C
	incf	DES,1
	movlw	.5
	addwf	DES		; 
	movlw	.10		; W=10
	subwf	DES,0		; вычитаем из DES - W 
	btfsc	STATUS,C	; DES>10 ?
	movwf	DES		; если да то W -> DES
	btfsc	STATUS,C
	incf	SOT,1
	movlw	.2		; 
	addwf	SOT
	movlw	.10		; W=10
	subwf	SOT,0		; вычитаем из SOT - W 
	btfsc	STATUS,C	; SOT>10 ?
	movwf	SOT		; если да то W -> SOT
	btfsc	STATUS,C
	incf	TYS,1
	movlw	.10		; W=10
	subwf	TYS,0		; вычитаем из TYS - W 
	btfsc	STATUS,C	; TYS>10 ?
	movwf	TYS		; если да то W -> TYS
	btfsc	STATUS,C
	incf	DEST,1
	decf	tmp1,1
	goto    next1
;*********************************************************
; 13. - перевод результата для вывода на дисплей ---------
;------------ удаляем незначащие нули --------------------
;*********************************************************
Dig	clrw			;
	subwf	DEST,0		; дес тысяч  = 0 ?
	btfss	STATUS,Z	;
	goto	digit1		; преобразуем для индикатора
	movlw	20
	movwf	DEST
	clrw			;
	subwf	TYS,0		;
	btfss	STATUS,2	;
	goto	digit2		; 
	movlw	20
	movwf	TYS
	clrw			;
	subwf	SOT,0		;
	btfss	STATUS,2	;
	goto	digit3		; 
	movlw	20
	movwf	SOT
	goto	digit4
digit1	movf	DEST,0		;дес тысяч
	addlw	30
	movwf	DEST
digit2	movf	TYS,0		;тысячи
	addlw	30
	movwf	TYS
digit3	movf	SOT,0		;сотни
	addlw	30
	movwf	SOT
digit4	movf	DES,0		;десятки
	addlw	30
	movwf	DES
	movf	EDI,0		;единицы
	addlw	30
	movwf	EDI
	return
;************************************************
;*** 14.  ЗАРЯДКА   ******************************
;************************************************
zar0	clrwdt
	call	clrd		; очистка индикатора
;----- верхняя строка ------------------------------
	call	time		; вывод часов
	movf	Zr10,0		; пересылаем данные
	movwf	A10		; ёмкости
	movf	Zr1,0		; в ЖКИ
	movwf	A1
	call	convert
	call	Dig		; подготовка на вывод
	movf	TYS,0		; сотни
	movwf	R29
	movf	SOT,0		; десятки
	movwf	R30
	movf	DES,0		; единицы
	movwf	R31
	movlw	2C		; вывод " , "
	movwf	R32		; 
	movf	EDI,0		; десятые
	movwf	R33
	call	mesem		; "A/ч"
;----- нижняя строка ------------------------------
	call	izmI		; измеряем ток зарядки
	call	conv		; пересчёт 
	call	nozr		; подготовка на вывод
	call	outA		; выводим ток зарядки
	call	vrzar		; время зарядки, ход часов
;----------------------------------------------------------
	call	izmU		; измеряем напряжение
	call	conv		; пересчёт
	call	nozr		; подготовка на вывод
	call	outU		; выводим напряжение
;------------------------------------------------------------
	call	LCD		; выводим на экран
	call	pau1s		; секундная задержка
	movlw	.125		; точная подстройка
	call	Psm		; хода часов(1-255)
	btfss	PORTA,4		; если нажата кнопка
	goto	emk		; вывод уставки ёмкости
	goto	chek1		; сравнение уставки
;-----------------------------------------------------------
vrzar	clrwdt			;считаем время зарядки
	movlw	2		; 
	subwf	A1,0		; 
	btfss	STATUS,C	; если зарядный ток < 2 mA
	return			; выходим без счёта
	call	chek		; иначе - ход часов
	call	rasch		; считаем ёмкость зарядки
	return
;***************************************************
;---- перевод в символы  ---------------------------
pers	movf	SOT,0
	addlw	30h
	movwf	SOT
	movf	DES,0
	addlw	30h
	movwf	DES
	movf	EDI,0
	addlw	30h
	movwf	EDI
	return
;---- удаляем незначащие нули  -----------------------
nozer	movlw	30h
	subwf	SOT,0
	btfss	STATUS,Z
	return
	movlw	020h
	movwf	SOT
	movlw	30h
	subwf	DES,0
	btfss	STATUS,Z
	return
	movlw	020h
	movwf	DES
	return
nozr	movlw	30h
	subwf	SOT,0
	btfss	STATUS,Z
	return
	movlw	020h
	movwf	SOT
	return
;******************************************************
; 15. АЦП - ПРЕОБРАЗОВАНИЯ (ИЗМЕРЕНИЕ ВХОДНЫХ ВЕЛИЧИН).
;******************************************************
izmI	clrwdt			; ТОК ЗАРЯДКИ
	clrf	A1
	movlw	.255		; количество измерений
	movwf	pau		; 
        movlw	B'01000001'	; опорное с RA1
        movwf	ADCON0		; вход RA0, вкл АЦП
izm1	movlw	15		; пауза  88 мксек
	call	Psm		; между измерениями
	call	izmer
;---------------------------------------------------------
	subwf	A1,0		; вычитаем A1 - W = W
	btfss	STATUS,C	; если A1 > W
	call	rez3		; пишем в A1
;-------------------------------------------------------
	decfsz	pau		; 255 раз измерь
	goto	izm1		; 
	movf	A1,0		; результат в W
	return			; выход из процедуры
;------------------------------------------------------
rez3	movf	tmp3,0		; tmp3 -> W
	movwf	A1
	return
;=========================================================
izmU	clrwdt			; НАПРЯЖЕНИЕ
	movlw	.255		; количество измерений
	movwf	pau		; 
	movwf	A1
        movlw	B'00001001'	; опорное с Vdd
        movwf	ADCON0		; вход RA2, вкл АЦП
izm2	movlw	15
	call	Psm
	call	izmer
;---------------------------------------------------------
	subwf	A1,0		; вычитаем A1 - W = W
	btfsc	STATUS,C	; если A1 < W
	call	rez3		; пишем W в A1
;-------------------------------------------------------
	decfsz	pau		; 255 раз измерь
	goto	izm2		; 
	movf	A1,0		; результат в W
	return			; выход из процедуры
;=====================================================
izmer	bsf	ADCON0,1	; вкл преобразование
	nop
	nop
        btfsc	ADCON0,1	; ждём завершения
        goto	$-1          	;
;	bsf	STATUS,5	; БАНК 1.
	movf	ADRESL,0	; младшиий байт - в W
;	bcf	STATUS,5	; В БАНК 0.
	movwf	tmp3
	return
;-----------------------------------------------
mesem	movlw	41		; " A "
	movwf	R34
	movlw	02A		; " * "
	movwf	R35
	movlw	068		; " h "
	movwf	R36
	return
;************************************************************
;** 16. вычисление ёмкости зарядки ***************************
;************************************************************
;===========================================================
;== 1. вычисляем среднее значение тока за 1 минуту  ==========
;===========================================================
rasch	clrwdt
	incf	A10,1
	clrf	tmp1
	movf	A1,0		; загружаем ток зарядки
	addwf	Szi,0		; + остаток прежнего деления
	btfsc	STATUS,0	; если переполнение
	incf	A10		; переносим в старший разряд
	movwf	A1		; W = I1
;----- итоговое число --------------------------------------
del2	addlw	-3Ch		; зарядный ток делим на 60
	btfss	STATUS,0	; если переполнение,
	goto	$+4		; завершаем расчёты 
	incf	tmp1,1		; запишем
	goto	$-4		; повторим вычитание
	movwf	tmp1		; результат в cnt1
;-----------------------------------------------------------
	decf	A10,1		; A10 - 1
	btfss	STATUS,Z	; если можно
	goto	del12		; продолжаем деление
;-----------------------------------------------------------
	addlw	3Ch
	movwf	Szi		; восстанавливаем остаток
	goto	Sum
;===========================================================
del12	incf	tmp1,1		; запишем
	goto	del2
;============================================================
Sum	movf	tmp1,0
	addwf	I1,1
;	btfsc	STATUS,0	; если переполнение
;	incf	I10,1
;-----------------------------------------------------------
	clrw
	subwf	C3,0
	btfss	STATUS,Z	; если секунды не = 0
	return			; выходим
;===========================================================
;== 2. делим среднее значение тока на 60 -------------------
;===========================================================
Del0	incf	I10,1
	clrf	tmp1
	movf	I1,0		; загружаем ток зарядки
	addwf	ost,0		; + остаток прежнего деления
	btfsc	STATUS,0	; если переполнение
	incf	I10,1		; переносим в старший разряд
	movwf	I1		; W = I1
;----- итоговое число --------------------------------------
del	addlw	-3Ch		; зарядный ток делим на 60
	btfss	STATUS,0	; если переполнение,
	goto	$+4		; завершаем расчёты 
	incf	tmp1,1		; 
	goto	$-4		; повторим вычитание
	movwf	tmp1		; результат в tmp1
;-----------------------------------------------------------
	decf	I10,1		; I10 - 1
	btfss	STATUS,Z	; если можно
	goto	del11		; продолжаем деление
;-----------------------------------------------------------
	addlw	3Ch
	movwf	ost		; восстанавливаем остаток
;--------------------------------------------------
	clrf	I10
	clrf	I1
;===========================================================
;== 3. расчитываем ёмкость ----------------------------------
;===========================================================
	movf	tmp1,0
	addwf	Zr1,1		; Zr1 + tmp1
	btfsc	STATUS,C	; если переполнение
	incf	Zr10,1		; увеличиваем Zr10
	return
;============================================================
del11	incf	tmp1,1		; запишем
	goto	del
;**************************************************************
;** 17. Ёмкость аккумулятора ***********************************
;**************************************************************
emk	movlw	5		; 5 секунд ожидания
	movwf	tmp2		;
;--------------------------------------
emk1	clrwdt
	call	emkout		; вывод ёмкости аккумулятора
;-----------------------------------------------------------
	call	pau1s		; 
;-----------------------------------------------------------
	btfss	PORTA,4		; если нажата кнопка
	call	plus		; + 50 мА/ч
	decfsz	tmp2,1
	goto	emk1
	bsf	PORTA,5		; вкл светодиод
	goto	zar0		; переход на зарядное
;********************************************************
emkout	call	clrd		; стираем старые данные
	movlw	043h	;  C
	movwf	R1
	movlw	061		;  a
	movwf	R2
	movlw	070		;  p
	movwf	R3
	movlw	061		;  a
	movwf	R4
	movlw	063		;  c
	movwf	R5
	movlw	069		;  i
	movwf	R6
	movlw	074		;  t
	movwf	R7
	movlw	079		;  y
	movwf	R8
	movlw	042		;  B
	movwf	R10
	movlw	061		;  a
	movwf	R11
	movlw	74h		;  t
	movwf	R12
	movlw	74h		;  t
	movwf	R13
	movlw	02E		; . .
	movwf	R14

	movf	E1,W		; вывод уставки ёмкости
	movwf	A1
	movf	E10,W		; 
	movwf	A10
	call	convert		; пересчёт
	call	Dig		; удаляем незначащие нули 
	movf	TYS,0		; сотни - в R24
	movwf	R24
	movf	SOT,0		; десятки - в R25
	movwf	R25
	movf	DES,0		; единицы - в R26
	movwf	R26
	movlw	2C		; вывод " , "
	movwf	R27		; 
	movf	EDI,0		; десятые - в R27
	movwf	R28

	movlw	41		; " A "
	movwf	R30
	movlw	02A		; " * "
	movwf	R31
	movlw	068		; " h "
	movwf	R32
	call	LCD		; выводим на экран
	return
;=============================================================
plus	clrwdt
	movlw	5
	movwf	tmp2		; tmp2 = 5
	movf	E1,0
	addlw	32		; +0,5 А
	btfsc	STATUS,0	; если переполнение,
	incf	E10,1
	movwf	E1
;-----проверка на переполнение ---------------------------
	movlw	3		; макс ёмкость
	subwf	E10,0		; 95 А
	btfss	STATUS,Z	; (3B6h)
	return
	movlw	0B6		; 
	subwf	E1,0		; 
	btfss	STATUS,0	; 
	return
	movlw	0		; если переполнение,
	movwf	E10		; возвращаем
	movlw	.50		; на 1 А
	movwf	E1
	return
;**************************************************************
;** 18. Сравниваем уставку с ёмкостью **************************
;**************************************************************
chek1	clrwdt		; 
;============ проверка откл зарядки  ======================
	movf	E10,0		; загружаем уставку
	subwf	Zr10,0		; сравниваем ст байт
	btfss	STATUS,Z	; если не равны
	goto	zar0		; выходим
	movf	E1,0		; загружаем уставку
	subwf	Zr1,0		; сравниваем мл байт
	btfss	STATUS,C	; если меньше
	goto	zar0		; выходим
	nop			; иначе, откл зарядку

;== Ф И Н И Ш ==========================================
Endzar	clrwdt
	call	clrd	; стираем старые данные
	movlw	044h	; З D
	movwf	R4
	movlw	06F		; а o
	movwf	R5
	movlw	06E		; р n
	movwf	R6
	movlw	065		; я e
	movwf	R7
	movlw	021		; ж !
	movwf	R8
;	movlw	065		; е
;	movwf	R9
;	movlw	0BD		; н
;	movwf	R10
;	movlw	06F		; о
;	movwf	R11
;	movlw	020		; 
;	movwf	R12
;	movlw	021		; !
;	movwf	R13
;----------------------------------
	call	izmU		; измеряем U аккумулятора
	call	conv		; процедура перевода
	call	nozr		; подготовка на вывод
	call	outU		; выводим напряжение
;	movlw	55		; вывод " U "
;	movwf	R21
;	movlw	3D		; вывод " = "
;	movwf	R22
;	movf	SOT,0		; 
;	movwf	R23		; десятки
;	movf	DES,0		; 
;	movwf	R24		; единицы
;	movlw	2C		; вывод " , "
;	movwf	R25		; 
;	movf	EDI,0		; 
;	movwf	R26		; десятые
;	movlw	76h		; вывод " v "
;	movwf	R27
;----------------------------------------------
	movf	Zr1,W		; вывод  ёмкости
	movwf	A1
	movf	Zr10,W		; 
	movwf	A10
	call	convert		; пересчёт
	call	Dig		; удаляем незначащие нули 
	movf	TYS,0		; сотни
	movwf	R29
	movf	SOT,0		; десятки
	movwf	R30
	movf	DES,0		; единицы
	movwf	R31
	movlw	2C		; вывод " , "
	movwf	R32		; 
	movf	EDI,0		; десятые
	movwf	R33
	movlw	41		; " A "
	movwf	R34
	movlw	02A		; " * "
	movwf	R35
	movlw	068		; " h "
	movwf	R36
	call	pau1s		; 991.776ms
	call	LCD		; выводим на дисплей
	bcf	PORTA,5		; откл светодиод
	btfss	PORTA,4		; если нажата кнопка
	goto	emk		; продолжаем зарядку
	goto	Endzar		;
;************************************************************
	END

