
.include "m8def.inc"	;AT8-16, 1МГц

.org 0				;начало кода
rjmp start
.org 3				;сравнение регистра счетчика 2
rjmp timer			;подпрограмма таймера 4Гц
.org 14				;вектор прер. АЦП
rjmp adc_complete	;подпрограмма АЦП (срабатывает редко)

start:
;======== Стек ===========
ldi R16, low(RAMEND) ;низ стека
out SPL, R16 
ldi R16, high(RAMEND);верх стека
out SPH, R16
;====== Внимание! Распиновка ЖК: =======
;== PD7-RS, PD6-RW, PD5-E, PortB-Data ==
;==== установка портов ====
ldi R16, 0b00111100
out ddrC, R16	;PortС утсновка(смешан.)
ldi R16, 0b00000000
out portC, R16
ldi R16, 0b11110001
out ddrD, R16	;PortD утсновка(смешан.)
ldi R16, 0b00001110
out portD, R16	;полевик, и резисторы кнопок
ldi R16, 0xFF		
out ddrB, R16	;PortB на выход(шына данных 2х16 екран)
ldi R27, 0x01
ldi R26, 0x00	;0x0100,ОЗУ,часы
ldi R16, 0x30	;'0' для часов
st X+,R16		;часов
st X+,R16		;дес. минут
st X+,R16		;минут
st X+,R16		;дес. с
st X+,R16		;с.
clr R1
inc R1			;1,для переноса и деления
clr R2			;0,для переноса и деления
clr R3			;повтор бип
clr R4			;регистр секунд таймера 4Гц
ldi R16, 0x69
ldi R17, 0x78
mov R5,R16
mov R6,R17		;проверяем 2.7в
clr R7			;регистр секунд таймера 2Гц
clr R8			;АЦП
clr R9			;АЦП
clr R10
clr R11			;промежут.АЦП
clr R25			;для задержки 30с.
ldi R27, 0x01
ldi R26, 0x10	;0x0112,ОЗУ,мА*ч
st X+,R2		;clr,0x0112
st X+,R2		;clr,0x0113
st X+,R2		;clr,0x0114
;при включении ожидается нажатие кнопки
ldi R31,0b00001000	;РОН статуса символов ЖК
;== инициализация 2х16 экран ==
ldi R18, 0b00111000		;R18,РОН данных экрана
rcall delay20ms
rcall write_lcd
rcall write_lcd
rcall write_lcd
rcall write_lcd
ldi R18, 0b00001100		;display off
rcall write_lcd
ldi R18, 0b00000001		;display clear
rcall write_lcd
rcall delay1500mks
ldi R18, 0b00000110		;entry mode set
rcall write_lcd
;== дисплей готов к выводу ==

;======= Timer + ADC ========
ldi R16, 0xf5		;задержка 245,для 4Гц
out OCR2, R16 		;сохранить в регистре сравнения
ldi R16, 0b00000111	;задержка 1024,для 3.8Гц
out TCCR2, R16 		;пуск таймера 8-бит
ldi R16, 0b10000000 ;лог "1"
out TIMSK, R16 		;вкл. сравнение счетчика 2
ldi R16, 0b01000000	;AD_Converter ADMUX byte
out ADMUX, R16
ldi R16, 0b10001011	;AD_Converter ADCSRA byte, 125kHz
out ADCSRA, R16			
sei 				;вкл. прерывания в ЦП
rcall design		;дизайн
;== конец инициализации устройств, далее основной код ==

main:
;========== R31 РОН статуса =========
;====== проверим нажатие кнопок =====
sbic PinD,3			;выполнить если бит порта "1"
rjmp noreset
rcall delay100ms
sbis PinD,3			;выполнить если бит порта "0"
ori R31, 0b10000000	;sbi R31.7, контроль, "Reset"

noreset:
sbic PinD,2			;выполнить если бит порта "1"
rjmp nominus
rcall delay100ms
sbis PinD,2			;выполнить если бит порта "0"
ori R31, 0b01000000	;sbi R31.6, контроль, "Minus"

nominus:
sbic PinD,1			;выполнить если бит порта "1"
rjmp noplus
rcall delay100ms
sbis PinD,1			;выполнить если бит порта "0"
ori R31, 0b00100000	;sbi R31.5, контроль, "Plus"

noplus:
cp R1,R4			;проверим 0.5с
brsh main			;если больше или равно
clr R4				;очистим счетчик 0.5с
inc R7				;+1, 2Гц

;====== проверим нажатие кнопок =====
sbrc R31, 6			;выполнить если установлен бит R31.6
rcall menshe
sbrc R31, 5			;выполнить если установлен бит R31.5
rcall bolshe
cp R1,R7			;проверим 1c
brsh main			;если больше или равно
rjmp zamer

zamer:
clr R7			;очистим счетчик 1с
;====== сигнал окончания разряда ==========
;== этот блок реализует два тройных бипа ==
;===== проигрываются только один раз ======
cp R3,R2		;проверим на бьип
breq zamer2		;перейти если равно
dec R3			;-1
rcall beep		;тройной бип

;=== старт замера тока АЦП ===
zamer2:
ldi R16, 0b01000000	;AD_Converter ADMUX byte
out ADMUX, R16
sbi ADCSRA,6		;старт замера АЦП
rcall delay40mks
rcall delay40mks
rcall delay40mks
rcall delay40mks
sbi ADCSRA,6		;старт замера АЦП
;=== печать тока I,mA ===
rcall cal1024		;калибровка замера
rcall multiply
mov R28, R10		;старший разряд
mov R29, R11		;младший разряд
ldi R30, 0x82		;поз. печати числа ImA
rcall indikacija3
rcall design

;=== секундомер =================
;=== имеет свой тестер на I=0 ===
;=== не менять позицию ниже =====
rcall sekyndomer

;== печать тока Imax,mA*ч ==
;======== ОЗУ ==============
rcall divide		;делим на 120 для 30с/ма*ч
rcall zaderjka30c	;раз в 30с прибавляем значение
rcall indikacija

;== вольтметр АЦП ==========
ldi R16, 0b01000001	;AD_Converter ADMUX byte
out ADMUX, R16
sbi ADCSRA,6		;старт замера АЦП
rcall delay40mks
rcall delay40mks
rcall delay40mks
rcall delay40mks
sbi ADCSRA,6		;старт замера АЦП
rcall cal1024		;калибровка замера
rcall multiply		;переводим в 10мкВ
rcall voltagetest	;проверка на "батарейка разряжена"

;====== проверим нажатие кнопок ======
sbrc R31, 7			;выполнить если установлен бит R31.7
rjmp restart

;== задержка если сразу после нажатия кнопки ==
sbrc R31, 2			;выполнить если установлен бит R31.2
rjmp outwait		;задержка вывода

;=== если нет, то выведем напряжение ===
mov R28, R10		;старший разряд
mov R29, R11		;младший разряд
ldi R30, 0xcb		;поз. печати числа U,в
rcall indikacija2
cbi portD,7		;RS="0", команда
ldi R18, 0xca	;locate
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
ldi R18, 0x20	;" ","пробел"
sbrc R31, 1		;выполнить если установлен бит R31.1
ldi R18, 0x7e	;"!",разряд окончен
rcall write_lcd	;установка
rjmp main
outwait:			;задержка вывода Uв на 1с.
andi R31, 0b11111011	;cbi R31.2, контроль
rjmp main

;========= сброс замера =========
restart:
ldi R27, 0x01
ldi R26, 0x00	;0x0100,ОЗУ,часы
ldi R16, 0x30	;'0' для часов
st X+,R16		;часов
st X+,R16		;дес. минут
st X+,R16		;минут
st X+,R16		;дес. с
st X+,R16		;с.
clr R25			;для задержки 30с.
ldi R27, 0x01
ldi R26, 0x10	;0x0112,ОЗУ,мА*ч
st X+,R2		;clr,0x0112
st X+,R2		;clr,0x0113
st X+,R2		;clr,0x0114
clr R31			;РОН статуса символов ЖК
rcall lcd_clear	;мигнем ЖК
sbi portD, 4	;вкл. бузер
sbi portC, 5	;вкл. светодиод
sbi portD, 0	;выкл. полевик на ножке 0 порта Д
rcall delay2s
cbi portD, 4	;выкл. бузер
rjmp main		;восстановим надписи
nop
nop
nop
nop
nop

;----------------далее только подпрограммы--------------------

;======== Timer ===========
timer:			;срабатывает по сравнению, 4Гц
out TCNT2, R2	;обнулим счетчик
inc R4			;+1, 4Гц
reti

;==== АЦП замер сделан ====
adc_complete:
in R9, ADCL	
in R8, ADCH
reti

;== ожидание 30с, для коррекции силы тока ==
zaderjka30c:
cli 			;выкл. прерывания в ЦП
inc R25			;+1c
cpi R25, 0x1e	;если "цифра" уже 30
breq silatokasum	;перейти если равно
sei 			;вкл. прерывания в ЦП
ret

silatokasum:
clr R25			;обнуление счетчика 30с
ldi R27, 0x01
ldi R26, 0x10	;0x0110,ОЗУ,мА*ч
ld R14,X+		;0x0110
ld R13,X+		;0x0111
ld R12,X		;0x0112
add R14, R18	;сумма
adc R13, R17	;с учетом переноса
adc R12, R2		;с учетом переноса, R2=0
st X,R12		;0x0112
st -X,R13		;0x0111
st -X,R14		;0x0110
sei 			;вкл. прерывания в ЦП
ret

;======== калибровка напряжения ========
;=== отнимем 1/64 от общего значения ===
cal1024:
mov R10, R8
mov R11, R9
ldi R16, 6		;Поделить на 64
shift:
clc
ror R10
ror R11
dec R16
brne shift
sub R9,R11		;вычитаем младшие байты
sbc R8,R10		;и старшие байты
ret

;====== Умножение, для перевода в "мА" и "В" ==========
;========= R10..R11==*==R8..R9 ========================
multiply:		;Подпрограмма умножения
clr R10			;Очистка старшего байта результата
clr R11			;Очистка младшего байта результата
ldi R16, 0x32	;умножаем на 50, мА
sum:			;Цикл суммирования
add R11,R9		;Прибавление к младшему биту результата содержимого
adc R10,R8		;Прибавление к старшему биту результата с учетом переноса
dec R16			;Вычитание единицы из регистра R16
brne sum		;Если результат не равен 0, то вернуться к метке sum
ret

;====== Деление на 120* (0078),для перевода в мА*ч ==
;========= R10..R11==/==R16 =========================
divide:			;Подпрограмма деления
ldi R16, 0x78	;120,константа
clr R17			;ст.
clr R18			;мл.
minus:			;Цикл вычитания делителя из делимого
cp R11,R16		;Сравниваем байты делимого и делителя
cpc R10,R2		;Сравниваем старшие байты,R2=0
brlo exit		;Если делимое уже меньше, то выходим из цикла
sub R11,R16		;Иначе вычитаем из делимого делитель (младшие байты)
sbc R10,R2		;и старшие байты,R2=0
add R18,R1		;R1=1
adc R17,R2		;Прибавляем к частному единицу
rjmp minus		;Возвращаемся к началу цикла
exit:			;Метка выхода из цикла
ret				;Возврат из подпрограммы

;=========== Проверка напряжения на батарее ===========
;== здесь происходит отключение полевого транзистора ==
voltagetest:	;проверяем 2.7в
cp R11, R6		;Сравниваем младшие байты делимого и делителя
cpc R10, R5		;Сравниваем старшие байты делимого и делителя
brlo lowvoltage	;Если меньше, то переход
ret

lowvoltage:
ldi R16, 0x02
ldi R17, 0x8A	;проверяем 0.65в
cp R11, R17		;Сравниваем младшие байты делимого и делителя
cpc R10, R16	;Сравниваем старшие байты делимого и делителя
brlo zerovoltage	;батарея еще не подключенна
;если напряжение достигло критического то отметим это на ЖК
sbrs R31, 3		;if pinX,n='0' then do
inc R3			;+1,бип
sbrs R31, 3		;if pinX,n='0' then do
inc R3			;+1,бип
ori R31, 0b00001010	;sbiR31/3,1, контроль
cbi portD, 0	;выкл. полевик на ножке 0 порта Д
cbi portC, 5	;выкл. светодиод
ret

zerovoltage:
;снимем отметку с ЖК если батарею отключили
andi R31, 0b11111101;	cbi R31.1, контроль
clr R11
clr R10			;приведем показания в "0", для коррекции 0.01в
ret

;====индикация на ЖК====
indikacija:
;== вывод динамического числа на экран 2x16 ==
;======= ОЗУ = число * hex,0xFFFFFF ==========
ldi R27, 0x01
ldi R26, 0x10	;0x0110,ОЗУ,мА*ч
ld R14,X+		;0x0110,L
ld R13,X+		;0x0111,M
ld R12,X		;0x0112,H
ldi R23, 0x30	;символ"0" единицы
ldi R22, 0x30	;символ"0" десятки
ldi R21, 0x30	;символ"0" сотни
ldi R20, 0x30	;символ"0" тисячи

ldi R16, 0x27
ldi R17, 0x10	;10000
cp R14, R17
cpc R13, R16	;проверим на превышение розряда
cpc R12, R2		;R2=0
brlo circle_odin	;перейти если меньше

ldi R16, 0x01
ldi R17, 0x86
ldi R18, 0xA0	;100000
cp R14, R18
cpc R13, R17
cpc R12, R16	;проверим на превышение разряда
brlo circle_desyat	;перейти если меньше
ldi R19, 100	;100
rjmp circle

circle_desyat:
ldi R19, 10		;10
rjmp circle

circle_odin:
ldi R19, 1		;1
rjmp circle

circle:
;==	счетчик	==
;odinnezero:
sub R14, R19	;-1
sbc R13, R2
sbc R12, R2 	;вычитание регистров с заемом
brlo schetokoncen
inc R23			;+1
cpi R23, 0x3A	;если "цифра" уже $A
breq desyat		;перейти если равно
rjmp circle
;==	переполнение	==
desyat:
ldi R23, 0x30	;символ"0"
inc R22			;+1
cpi R22, 0x3A	;если "цифра" уже $A
breq sto		;перейти если равно
rjmp circle
;==	переполнение	==
sto:
ldi R22, 0x30	;символ"0"
inc R21			;+1
cpi R21, 0x3A	;если "цифра" уже $A
breq tisacha	;перейти если равно
rjmp circle
;==переполнение	==
tisacha:
ldi R21, 0x30	;символ"0"
inc R20			;+1
rjmp circle

schetokoncen:
;=== locate =====
cbi portD,7		;RS="0", команда
ldi R18, 0xc2	;поз. печати числа ImA*ч
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
;== тысячи ==
mov R18, R20	;пересил. R20 в R18
rcall write_lcd	;установка
;== сотни ==
mov R18, R21	;пересил. R21 в R18
rcall write_lcd	;установка
cpi R19, 10		;10
brne noImax10		;перейти если равно
ldi R18, 0x2e	;"."
rcall write_lcd	;установка
noImax10:
;== десятки ==
mov R18, R22	;пересил. R22 в R18
rcall write_lcd	;установка
cpi R19, 100	;100
brne noImax100	;перейти если равно
ldi R18, 0x2e	;"."
rcall write_lcd	;установка
noImax100:
;== единицы ==
mov R18, R23	;пересил. R23 в R18
rcall write_lcd	;установка
;== добавим в конце "mАh ==
cpi R19, 1		;1
brne no_mAh		;перейти если не равно
ldi R18, 0x6d	;"m"
no_mAh:
rcall write_lcd	;установка
ldi R18, 0x41	;"A"
rcall write_lcd	;установка
ldi R18, 0x68	;"h"
rcall write_lcd	;установка
ret				;вывод окончен, возврат в программу

indikacija2:
;== вывод динамического числа на экран 2x16 ==
;РОН28..29 = число * hex, 0xFFFF
ldi R23, 0x30	;символ"0" единицы
ldi R22, 0x30	;символ"0" десятки
ldi R21, 0x30	;символ"0" сотни
ldi R19, 100	;100

circle2:
;== счетчик ==
;odinnezero2:
sub R29, R19	;-100
sbc R28, R2 	;вычитание регистров с заемом
brlo schetokoncen2
inc R23			;+1
cpi R23, 0x3A	;если "цифра" уже $A
breq desyat2	;перейти если равно
rjmp circle2
;== переполнение ==
desyat2:
ldi R23, 0x30	;символ"0"
inc R22			;+1
cpi R22, 0x3A	;если "цифра" уже $A
breq sto2		;перейти если равно
rjmp circle2
;== переполнение ==
sto2:
ldi R22, 0x30	;символ"0"
inc R21			;+1
rjmp circle2

schetokoncen2:
;===locate=====
cbi portD,7		;RS="0", команда
mov R18, R30	;locate 0x88-л/ч, 0xC1-бак
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
;== вольт ==
mov R18, R21	;пересил. R21 в R18
rcall write_lcd	;установка
ldi R18, 0x2e	;"."
rcall write_lcd	;установка
;== десятых ==
mov R18, R22	;пересил. R22 в R18
rcall write_lcd	;установка
;== сотых ==
mov R18, R23	;пересил. R23 в R18
rcall write_lcd	;установка
ldi R18, 0x56	;"V"
rcall write_lcd	;установка
ret

indikacija3:
;== вывод динамического числа на экран 2x16 ==
;РОН28..29 = число * hex, 0xFFFF
ldi R23, 0x30	;символ"0" единицы
ldi R22, 0x30	;символ"0" десятки
ldi R21, 0x30	;символ"0" сотни

ldi R16, 0x27
ldi R17, 0x10	;10000
cp R29, R17
cpc R28, R16	;проверим на превышение розряда
brlo circle3_odin	;перейти если меньше
ldi R19, 100	;100
rjmp circle3

circle3_odin:
ldi R19, 10		;10
rjmp circle3

circle3:
;== счетчик ==
;odinnezero3:
sub R29, R19	;-1
sbc R28, R2 	;вычитание регистров с заемом
brlo schetokoncen3
inc R23			;+1
cpi R23, 0x3A	;если "цифра" уже $A
breq desyat3	;перейти если равно
rjmp circle3
;== переполнение ==
desyat3:
ldi R23, 0x30	;символ"0"
inc R22			;+1
cpi R22, 0x3A	;если "цифра" уже $A
breq sto3		;перейти если равно
rjmp circle3
;== переполнение ==
sto3:
ldi R22, 0x30	;символ"0"
inc R21			;+1
rjmp circle3

schetokoncen3:
;===locate=====
cbi portD,7		;RS="0", команда
mov R18, R30	;locate
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
cpi R19, 100	;проверим переполнение разряда
breq schetokoncenI_10A ;если есть 10А
;== ампер ==
mov R18, R21	;пересил. R21 в R18
rcall write_lcd	;установка
ldi R18, 0x2e	;"."
rcall write_lcd	;установка
;== десятых ==
mov R18, R22	;пересил. R22 в R18
rcall write_lcd	;установка
;== сотых ==
mov R18, R23	;пересил. R23 в R18
rcall write_lcd	;установка
ldi R18, 0x41	;"A"
rcall write_lcd	;установка
ret

schetokoncenI_10A:
;== ампер ==
mov R18, R21	;пересил. R21 в R18
rcall write_lcd	;установка
mov R18, R22	;пересил. R22 в R18
rcall write_lcd	;установка
ldi R18, 0x2e	;"."
rcall write_lcd	;установка
;== десятых ==
mov R18, R23	;пересил. R23 в R18
rcall write_lcd	;установка
ldi R18, 0x41	;"A"
rcall write_lcd	;установка
ret

;=========дизайн=========
design:
cbi portD,7		;RS="0", команда
ldi R18, 0x80	;нач. екрана
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
ldi R18, 0x49	;"I"
rcall write_lcd	;установка
ldi R18, 0x3d	;"="
rcall write_lcd	;установка
cbi portD,7		;RS="0", команда
ldi R18, 0xc0	;2'ая строка екрана
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
ldi R18, 0x43	;"C"
rcall write_lcd	;установка
ldi R18, 0x3d	;"="
rcall write_lcd	;установка
ret

;===сигнал окончания разряда===
beep:
sbi portD, 4	;вкл. бузер
rcall delay1s
cbi portD, 4	;выкл. бузер
rcall delay1s
sbi portD, 4	;вкл. бузер
rcall delay1s
cbi portD, 4	;выкл. бузер
rcall delay1s
sbi portD, 4	;вкл. бузер
rcall delay1s
cbi portD, 4	;выкл. бузер
ret

;=========показ напряжения отсечки=============
menshe:				;уменьшить напряжение отсечки
ori R31, 0b00000100	;sbi R31.2,задержка вывода Uв на 1с.
ldi R16, 0x21
ldi R17, 0x34		;проверяем 0.8в
cp R6, R17			;Сравниваем младшие байты
cpc R5, R16			;Сравниваем старшие байты
brlo menshemax		;Если меньше, то выход
ldi R16, 0x01
ldi R17, 0xf4		;0.05в,шаг
sub R6,R17			;отнимем младшие байты
sbc R5,R16			;и старшие байты
menshemax:
mov R28, R5			;старший разряд
mov R29, R6			;младший разряд
ldi R30, 0xcb		;поз. печати числа U,в
rcall indikacija2
andi R31, 0b10011111	;cbi R31.6 и 5, контроль
rjmp simvolbutton

bolshe:				;увеличить напряжение отсечки
ori R31, 0b00000100	;sbi R31.2,задержка вывода Uв на 1с.
ldi R16, 0x8e
ldi R17, 0x94		;проверяем 3.7в
cp R17, R6			;Сравниваем младшие байты
cpc R16, R5			;Сравниваем старшие байты
brlo bolshemax		;Если меньше, то выход
ldi R16, 0x01
ldi R17, 0xf4		;0.05в
add R6,R17			;прибавим младшие байты
adc R5,R16			;и старшие байты
bolshemax:
mov R28, R5			;старший разряд
mov R29, R6			;младший разряд
ldi R30, 0xcb		;поз. печати числа U,в
rcall indikacija2
andi R31, 0b10011111	;cbi R31.6 и 5, контроль
;если нажата кнопка то отметим это на ЖК
simvolbutton:
cbi portD,7		;RS="0", команда
ldi R18, 0xca	;locate
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
ldi R18, 0x2a	;"*",отсечка разряда
rcall write_lcd	;установка
ret

;======== Delay ========
delay2s:
ldi R16, 0xFF
ldi	R17, 0xFF	;$79FF=0.26c
rjmp delay		
delay1s:
ldi R16, 0xFF
ldi	R17, 0x79	;$79FF=1c
rjmp delay		
delay100ms:
ldi R16, 0x90
ldi	R17, 0x65	;$61A8=0.1c
rjmp delay	
delay20ms:
ldi R16, 0x88
ldi	R17, 0x13	;$1388=20ms
rjmp delay
delay1500mks:
ldi R16, 0x77
ldi	R17, 0x01	;$0177=1.5mks
rjmp delay
delay40mks:
ldi R16, 0x0A
ldi	R17, 0x00	;$0A=40mks
rjmp delay
delay:			;длинна цикла x/5*hex
subi R16, 1 	;Рон16-1
sbci R17, 0 	;Рон17-0-переполнение'C'
brcc delay		;End delay(переход по 'C')
ret

;==== запись дисплея ====
write_lcd:
out portB, R18
nop
sbi portD,5		;Е="1"
nop
cbi portD,5		;Е="0"
rcall delay40mks
ret

;==== очистка дисплея ====
lcd_clear:
cbi portD,7		;RS="0", команда
ldi R18, 0x01
rcall write_lcd
rcall delay1500mks
sbi portD,7		;RS="1", печать
ret

;====== секундомер =========
;= находится в области ОЗУ =
;===== 0x0104-0x0100 =======
sekyndomer:
ldi R16, 0x64	;проверяем ток 100мА
cp R11, R16		;Сравниваем младшие байты делимого и делителя
cpc R10, R2 	;Сравниваем старшие байты, R2=0
brlo sekyndomerprint	;Если меньше, то переход
ldi R27, 0x01
ldi R26, 0x00	;0x0100 ОЗУ
ld R16,X		;0x0100 ОЗУ
inc R16			;+1cек.
st X,R16		;0x0100 ОЗУ
cpi R16, 0x3A	;если "цифра" уже $A
brlo sekyndomerprint	;перейти если меньше
ldi R16, 0x30	;символ"0"
st X+,R16		;0x0100 ОЗУ
ld R16,X		;0x0101 ОЗУ
inc R16			;+10c
st X,R16		;0x0101 ОЗУ
cpi R16, 0x36	;если "цифра" уже 6
brlo sekyndomerprint	;перейти если меньше
ldi R16, 0x30	;символ"0"
st X+,R16		;0x0101 ОЗУ
ld R16,X		;0x0102 ОЗУ
inc R16			;+1мин
st X,R16		;0x0101 ОЗУ
cpi R16, 0x3A	;если "цифра" уже $A
brlo sekyndomerprint	;перейти если меньше
ldi R16, 0x30	;символ"0"
st X+,R16		;0x0102 ОЗУ
ld R16,X		;0x0103 ОЗУ
inc R16			;+10мин
st X,R16		;0x0103 ОЗУ
cpi R16, 0x36	;если "цифра" уже 6
brlo sekyndomerprint	;перейти если меньше
ldi R16, 0x30	;символ"0"
st X+,R16		;0x0103 ОЗУ
ld R16,X		;0x0104 ОЗУ
inc R16			;+1час
st X,R16		;0x0104 ОЗУ
cpi R16, 0x3A	;если "цифра" уже $A
brlo sekyndomerprint	;перейти если меньше
ldi R16, 0x30	;символ"0"
st X,R16		;0x0104 ОЗУ

sekyndomerprint:
;==== вывод времени на ЖК ====
;=== locate ===
cbi portD,7		;RS="0", команда
ldi R18, 0x89	;locate 89
rcall write_lcd	;установка
sbi portD,7		;RS="1", печать
ldi R27, 0x01
ldi R26, 0x04	;0x0104 ОЗУ
;==час==
ld R18,X		;0x0104 ОЗУ
rcall write_lcd	;установка
ldi R18, 0x3a	;":"
rcall write_lcd	;установка
;==дес.мин.==
ld R18,-X		;0x0103 ОЗУ
rcall write_lcd	;установка
;==мин.==
ld R18,-X		;0x0102 ОЗУ
rcall write_lcd	;установка
ldi R18, 0x3a	;":"
rcall write_lcd	;установка
;==дес.cек.==
ld R18,-X		;0x0101 ОЗУ
rcall write_lcd	;установка
;==сек.==
ld R18,-X		;0x0100 ОЗУ
rcall write_lcd	;установка
ret				;вывод времени окончен, возврат
