;***********************************************
; ПРОШИВКА ЛАМИНАТОРА
; Автор: Andrew_KMR
; Чип: Mega8535
; Кварц: 6МГц
;***********************************************
.include "D:\RADIO\ASM\APPNOTES\M8535def.inc" ;Добавляем сюда путь к папке APPNOTES

;***Назначение регистров***
.def mult=r4                 ;Коэффициент
.def OFF_time=r5             ;Время отключения
.def NumberCount=r7          ;Разряд индикации
.def prohod_count=r9         ;Количество проходов
.def anime=r10               ;Анимация
.def motor_flag=r11          ;Флаг прокатки
.def motor_count=r12         ;Текущее значение прохода мотора
.def current_indicate=r13    ;Текущее значение для индикации
.def current_temperature=r14 ;Текущее значение температуры
.def indicate_digital=r15    ;Индикация
.def set_temperature=r16     ;Установленная температура
.def data = r17              ;Временные данные
.def temp=r18                ;Временные данные
.def loop=r19                ;Временные данные
.def motor_set=r20           ;Установленное значение прохода мотора
.def mode_flag=r21           ;Флаг режимов
.def time_secund=r22         ;Секунды
.def time_minut=r23          ;Минуты
.def flag_tempOk=r24         ;Флаг соответствия температуры
.def flag_beep=r25           ;Флаг сигнала готовности
.def popravka=r26            ;Поправка по температуре
.def popravka_znak=r27       ;Знак поправки по температуре
.def motor_speed=r28         ;Скорость протяжки     
.def pause0=r29              ;Временные данные
.def pause1=r30              ;Временные данные
.def pause2=r31              ;Временные данные

;***Назначение портов ввода/вывода***
;PORTA  
.equ MOTOR_FORV=1    ;Мотор-вперёд
.equ MOTOR_REV=2     ;Мотор-назад         
.equ HEATER=3        ;Нагреватель
.equ KEY_DOWN=4      ;Кнопка вниз
.equ KEY_UP=5        ;Кнопка вверх
.equ KEY_MOTOR=6     ;Кнопка направления мотора
.equ KEY_HOT=7       ;Кнопка режима ламинирования
;PORTB  
.equ BEEP=1 ;Бипер
.equ MOTOR_POWER=7 ;Реле питания мотора
;PORTС  
.equ NUMBER2=0   ;Разряд 2
.equ NUMBER3=1   ;Разряд 3
.equ NUMBER4=2   ;Разряд 4
.equ NUMBER1=3   ;Разряд 1
.equ LED_RED=4   ;Светодиод-красный
.equ LED_GREEN=5 ;Светодиод-зелёный

;.equ MULT=20 ;Коэффициент

.cseg 
.org 0 
     rjmp START  
.org $003	;Output Compare2 Interrupt Vector Address
     rjmp TIMER2    
.org $006	;Output Compare1A Interrupt Vector Address
     rjmp TIMER1A
.org $013   ;Output Compare0 Interrupt Vector Address
     rjmp TIMER0
;-------- ПРЕРЫВАНИЕ ТАЙМЕРА 0 - КВАРЦ 6.0 МГц ---------
; Используем для индикации с периодом 1мСек.
;-------------------------------------------------------    
TIMER0:
     in r2,sreg
     inc NumberCount
     mov temp,NumberCount
     cpi temp,1 ;Если 1-й разряд
     breq NUMBER_01
     cpi temp,2 ;Если 2-й разряд
     breq NUMBER_02
     cpi temp,3 ;Если 3-й разряд
     breq NUMBER_3     
NUMBER_4: ;- 4-й разряд ----------------
     cpi mode_flag,1
     breq ModeError
     cpi mode_flag,2
     breq ModeError 
     cpi mode_flag,3
     breq POPRAVKA_DIG4
     cpi mode_flag,4
     breq POPRAVKA_DIG4
     cpi mode_flag,5
     breq POPRAVKA_DIG4 
     cpi mode_flag,7
     breq MULT_DIG4                 
     sbis PINA,KEY_MOTOR
     rjmp GRADUS_C ;Если не включена прокатка             
POPRAVKA_DIG4:     
     ldi loop,1 ;Единиц
     rcall decdig  ;Пересчёт и вывод числа          
     sbi PORTC,NUMBER3
     cbi PORTC,NUMBER4          
     clr NumberCount
     rjmp ExitNumber     
NUMBER_01:
     rjmp NUMBER_1     
NUMBER_02:
     rjmp NUMBER_2   
MULT_DIG4:
     ldi loop,1      ;Единиц
     rcall decdig    ;Пересчёт и вывод числа
     cbr data,0b00000100         
     sbi PORTC,NUMBER3
     cbi PORTC,NUMBER4          
     clr NumberCount
     rjmp ExitNumber               
;------- Ошибка датчика -------------     
ModeError: 
     ldi data,0b11111111 ;пусто
     sbi PORTC,NUMBER3
     cbi PORTC,NUMBER4          
     clr NumberCount
     rjmp ExitNumber     
;------------------------------------              
GRADUS_C:
     ldi data,0b01010001 ;C - градусов цельсия           
NUMB_4:
     sbi PORTC,NUMBER3
     cbi PORTC,NUMBER4          
     clr NumberCount
     sbis PINA,KEY_MOTOR
     rjmp IND_TEMPERATURE ;Если не включена прокатка
     rjmp ExitNumber         
IND_TEMPERATURE:     
     mov indicate_digital,current_indicate ;Обновляем индикацию     
     rjmp ExitNumber
NUMBER_3: ;- 3-й разряд ----------------    
     cpi mode_flag,1
     breq Error3
     cpi mode_flag,2
     breq OFF3
     cpi mode_flag,3
     breq POPRAVKA_DIG3
     cpi mode_flag,4
     breq POPRAVKA_DIG3
     cpi mode_flag,5
     breq POPRAVKA_DIG3
     cpi mode_flag,7
     breq MULT_DIG3     
     sbis PINA,KEY_MOTOR
     rjmp NO_PROKAT3 ;Если не включена прокатка  
POPRAVKA_DIG3:            
     ldi loop,0x0A   ;Десятков
     rcall decdig    ;Пересчёт и вывод числа
     cbr data,0b00000100          
     sbi PORTC,NUMBER2
     cbi PORTC,NUMBER3       
     rjmp ExitNumber  
MULT_DIG3:
     ldi loop,0x0A   ;Десятков
     rcall decdig    ;Пересчёт и вывод числа         
     sbi PORTC,NUMBER2
     cbi PORTC,NUMBER3       
     rjmp ExitNumber             
NO_PROKAT3:     
     ldi loop,1 ;Единиц
     rcall decdig  ;Пересчёт и вывод числа 
     sbi PORTC,NUMBER2
     cbi PORTC,NUMBER3       
     rjmp ExitNumber
;--------- Ошибка датчика -------------     
Error3:
     ldi data,0b11011110 ;r  
     sbi PORTC,NUMBER2
     cbi PORTC,NUMBER3       
     rjmp ExitNumber
;---------------------------------------     
OFF3:
     ldi data,0b11010100 ;F  
     sbi PORTC,NUMBER2
     cbi PORTC,NUMBER3       
     rjmp ExitNumber
;---------------------------------------     
NUMBER_2: ;- 2-й разряд ----------------   
     cpi mode_flag,1
     breq Error2
     cpi mode_flag,2
     breq OFF2
     cpi mode_flag,3
     breq POPRAVKA_DIG2
     cpi mode_flag,4
     breq SPEED_DIG2
     cpi mode_flag,5
     breq TIME_DIG2 
     cpi mode_flag,7    ;Ввод коэффициента
     breq MULT_DIG2          
     sbic PINA,KEY_MOTOR
     rjmp PROKAT_2 ;Если включена прокатка        
     ldi loop,0x0A ;Десятков
     rcall decdig ;Пересчёт и вывод числа 
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber
MULT_DIG2:
     ;ldi data,0b11111111 ;Пусто
     ldi data,0b11111110 ;-
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber                                
TIME_DIG2:
     ldi data,0b00011110 ;o  
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber                           
SPEED_DIG2:
     ldi data,0b00001110 ;d 
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber                      
POPRAVKA_DIG2:
     cpi popravka_znak,0
     breq POPRAVKA_MINUS
POPRAVKA_PLUS:
     ldi data,0b10101110 ;+  
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber        
POPRAVKA_MINUS:      
     ldi data,0b11111110 ;-  
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber                
PROKAT_2: 
     mov data,anime
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber     
;--------- Ошибка датчика -------------     
Error2:
     ldi data,0b11011110 ;r  
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber
;---------------------------------------     
OFF2:
     ldi data,0b11010100 ;F  
     sbi PORTC,NUMBER1
     cbi PORTC,NUMBER2 
     rjmp ExitNumber
;--------------------------------------     
NUMBER_1: ;- 1-й разряд ----------------
     cpi mode_flag,1
     breq Error1
     cpi mode_flag,2
     breq OFF1
     cpi mode_flag,3
     breq POPRAVKA_DIG1
     cpi mode_flag,4
     breq SPEED_DIG1 
     cpi mode_flag,5
     breq TIME_DIG1 
     cpi mode_flag,7
     breq MULT_DIG1              
     sbis PINA,KEY_MOTOR
     rjmp GRADUS_C1 ;Если не включена прокатка  
     mov indicate_digital,prohod_count
     ldi loop,1    ;Единиц
     rcall decdig  ;Пересчёт и вывод числа              
     mov indicate_digital,motor_set ;Показываем настройку мотора             
     rjmp NUMB_1
TIME_DIG1:
     mov indicate_digital,OFF_time     ;Показываем время автоотключения           
     ldi data,0b11000100 ;P
     rjmp NUMB_1                  
SPEED_DIG1:
     mov indicate_digital,motor_speed  ;Показываем скорость мотора             
     ldi data,0b00110100 ;S 
     rjmp NUMB_1                  
POPRAVKA_DIG1:
     mov indicate_digital,popravka ;Показываем поправку температуры             
     ldi data,0b01010001 ;'C
     rjmp NUMB_1 
MULT_DIG1:
     mov indicate_digital,mult    ;Показываем коэффициент             
     ldi data,0b01010100 ;E 
     rjmp NUMB_1               
;--------- Ошибка датчика -------------     
Error1:
     ldi data,0b01010100 ;E  
     rjmp NUMB_1
OFF1:
     ldi data,0b00000101 ;O  
     rjmp NUMB_1
;--------------------------------------     
GRADUS_C1:
     ldi loop,0x64 ;Сотен
     rcall decdig  ;Пересчёт и вывод числа     
NUMB_1:   
     sbi PORTC,NUMBER4
     cbi PORTC,NUMBER1
ExitNumber: 
     out PORTD,data    
     out sreg,r2
     reti
;-------- ПРЕРЫВАНИЕ ТАЙМЕРА 1A - КВАРЦ 6.0 МГц -----------------------     
; Используем для получения значений температуры и управления нагрузкой
;----------------------------------------------------------------------
TIMER1A:
     in r2,sreg
     sbi ADCSRA,ADSC        ;Запуск АЦП
     inc time_secund
     cpi time_secund,200    ;200x100mS=20Sec
     brlo lope
     clr time_secund
     inc time_minut
     mov temp,OFF_time      ;делаем копию
     mov loop,OFF_time      ;делаем ещё копию 
     add temp,loop          ;умножение на 3
     add temp,loop     
     cp time_minut,temp     ;Сравниваем время
     brlo lope
     clr time_secund
     clr time_minut
     clr flag_beep       ;пропищать 
     ldi flag_tempOk,1 
     ldi mode_flag,2     
lope:
     sbic ADCSRA,ADSC    ;Ожидание результата
     rjmp lope
     in data,ADCL
     mov r0,data
     in temp,ADCH
     mov r1,temp
     cpi temp,high(1023) ;Если обрыв датчика
     breq Error_sensor   ;значит ошибка
     cpi temp,0
     brne sverka_OK      ;Если старший разряд не равен нулю всё Ок
     cpi data,160        
     brsh sverka_OK      ;Если младший разряд меньше 240 градусов всё Ок
Error_sensor:       
     ;------- ОШИБКА датчика -----------
     sbis PINB,BEEP
     rjmp OFF_BEEP
     cbi PORTB,BEEP 
     rjmp DALEE_BEEP    
     ;----------------------------------
OFF_BEEP:     
     sbi PORTB,BEEP
DALEE_BEEP:     
     cbi PORTA,HEATER
     cbi PORTC,LED_RED
     cbi PORTC,LED_GREEN 
     ldi mode_flag,1 ;Ошибка датчика
     rjmp EXIT_HEATER      
     ;----------------------------------
sverka_OK:     
     cpi mode_flag,1
     breq Err_OK
     rjmp NO_Err
Err_OK:
     cbi PORTB,BEEP 
     clr mode_flag ;Сбросить флаг ошибки
NO_Err:
     cpi mode_flag,2 ;Проверяем на режим автоотключения
     brne POWER_ON
     ;---------- Проверка на автоотключение ------------
POWER_OFF:
     cbi PORTA,HEATER
     sbi PORTC,LED_RED
     sbi PORTC,LED_GREEN      
     rcall ADCtoGradus
     ;---- Проверка диапазона ------------------
     cpi data,56
     brsh EXIT_HEATER    ;Если > или = выходим
     cbi PORTB,MOTOR_POWER ;Выключаем мотор
     cbi PORTC,LED_RED
     sbi PORTC,LED_GREEN
     ;--------- ОТКЛЮЧАЕМ МОТОР ------------------------               
     clr flag_tempOk     ;Пропищать
     rjmp EXIT_HEATER
     ;--------------------------------------------------
POWER_ON:     
     sbic PINA,KEY_HOT   ;Если отключена кнопка нагрева
     rjmp INDICATE_TEMP  ;отключить нагрев
     ;---- если включена кнопка нагрев --------     
     mov current_indicate,set_temperature ;Показываем установленную температуру     
     cpi temp,1          ;Если старший разряд <>0
     breq ON_HEATER      ;включить нагрев
;--- Проверка температуры на совпадение ----
     rcall ADCtoGradus
     mov current_temperature,data     
     cp current_temperature,set_temperature ;Сравнение температуры
     brsh OFF_HEATER     ;если больше или равно - выкл. нагрузку
ON_HEATER:     
     cbi PORTC,LED_GREEN 
     sbi PORTA,HEATER
     sbi PORTC,LED_RED
     rjmp EXIT_HEATER 
;--------------------------------------------     
INDICATE_TEMP:
     clr flag_beep ;Флаг сигнала готовности
     ldi flag_tempOk,1
     cbi PORTA,HEATER
     cbi PORTC,LED_RED
     sbi PORTC,LED_GREEN 
     rcall ADCtoGradus
     mov current_indicate,data ;Показываем текущую температуру  
     rjmp EXIT_HEATER   
OFF_HEATER:          
     cbi PORTA,HEATER
     cbi PORTC,LED_RED
     cbi PORTC,LED_GREEN
     ;------ проверяем на соответствие температуры ------------
     ;cp current_temperature,set_temperature
     ;brne FLAG_SET ;Если температура не ровна   
     ;clr flag_tempOk
     ;rjmp FLAG_OK
;FLAG_SET:
;     ldi flag_tempOk,1
;FLAG_OK:
     ;----- тут проверяем t на допуск -------       
     mov temp,set_temperature
     ldi loop,6    ;Погрешность
     add temp,loop ;Установленная t+6 градусов
     cp current_temperature,temp
     brsh FLAG_SET ;Если температура не ровна
     sbi PORTC,LED_GREEN    
     clr flag_tempOk
     rjmp EXIT_HEATER  
FLAG_SET:
     ldi flag_tempOk,1         
EXIT_HEATER:     
     out sreg,r2
     reti          
;-------- ПРЕРЫВАНИЕ ТАЙМЕРА 2 - КВРЦ 32.768 -----------   
; Используем для управления мотором в режиме проката
;------------------------------------------------------- 
TIMER2:
     in r2,sreg
     cpi mode_flag,2
     brne NO_AUTO_OFF   ;Если не автоотключение
     clr motor_count    ;Очистка счётчика прохода мотора     
     clr prohod_count
     inc prohod_count   
     cbi PORTA,MOTOR_REV
     cbi PORTA,MOTOR_FORV 
     rjmp MOTOR_OK
NO_AUTO_OFF:           
     sbic PINA,KEY_MOTOR
     rjmp MOTOR_SVERKA
     clr motor_count ;Очистка счётчика прохода мотора
     clr prohod_count
     inc prohod_count
     rjmp MOTOR_F    ;По умолчанию
MOTOR_SVERKA:
     mov data,anime     
     sbis PORTA,MOTOR_REV
     rjmp FORVARD
     cpi data,0b01011111 ;DEG 1
     breq ANIME4
     cpi data,0b11011110 ;CEG 2
     breq ANIME1
     cpi data,0b10111110 ;CDG 3
     breq ANIME2 
     rjmp ANIME3     
FORVARD:     
     cpi data,0b01011111 ;DEG 1
     breq ANIME2
     cpi data,0b11011110 ;CEG 2
     breq ANIME3
     cpi data,0b10111110 ;CDG 3
     breq ANIME4 
ANIME1:
     ldi data,0b01011111  ;DE 1
     rjmp OK_ANIME      
ANIME2:
     ldi data,0b11011110  ;EG 2 
     rjmp OK_ANIME      
ANIME3:
     ldi data,0b10111110  ;CG 3
     rjmp OK_ANIME      
ANIME4:
     ldi data,0b00111111  ;CD 4
OK_ANIME:  
     mov anime,data            
     inc motor_count ;Увеливаем текущее значение прохода
     cp motor_count,motor_set
     brne MOTOR_OK   ;Если неравно продолжаем
     clr motor_count ;Очистка счётчика прохода мотора    
     inc prohod_count 
     mov data,prohod_count
     cpi data,10
     brne MOTOR_ROTATE
     clr prohod_count
     inc prohod_count
MOTOR_ROTATE:     
     sbis PORTA,MOTOR_REV
     rjmp MOTOR_R
MOTOR_F:
     cbi PORTA,MOTOR_REV
     sbi PORTA,MOTOR_FORV
     rjmp MOTOR_OK
MOTOR_R: 
     cbi PORTA,MOTOR_FORV
     sbi PORTA,MOTOR_REV
MOTOR_OK:       
     out sreg,r2
     reti
;-------- ПРЕРЫВАНИЕ ПО RESET --------------------------      
START:
       ;PORTх - регистр данных *подключение подтяг.резисторов
       ;DDRх  - регистр направления данных 
       ;0 - вход, 1 - выход
       ;   b7 b6 b5 b4 b3 b2 b1 b0
       ;0b 1  1  1  1  1  1  1  1 ;Подтягивающие резисторы
       ;***подтяг. резисторы (порт A)***                         
       ldi temp, 0b11110000   ;Подтягивающие резисторы
       out PORTA,temp         
       ldi temp, 0b00001110   ;Направление данных
       out DDRA,temp
       ;***подтяг. резисторы (порт B)***                         
       ldi temp, 0b00000000   ;Подтягивающие резисторы
       out PORTB,temp         
       ldi temp, 0b11111111   ;Направление данных
       out DDRB,temp
       ;***подтяг. резисторы (порт C)***                         
       ldi temp, 0b00001111   ;Подтягивающие резисторы
       out PORTC,temp         
       ldi temp, 0b11111111   ;Направление данных
       out DDRC,temp
       ;***подтяг. резисторы (порт D)***                         
       ldi temp, 0b00000000   ;Подтягивающие резисторы
       out PORTD,temp         
       ldi temp, 0b11111111   ;Направление данных
       out DDRD,temp
       ldi temp,high(RAMEND)
       out SPH,temp       
       ldi temp,low(RAMEND)
       out SPL,temp   
        ;--------- ADC ----------------------------------------------------------------------
        ldi temp,0b10000111     ;Настраиваем регистр ADCSR АЦП 6 МГц/128 = 46,8кГц
        out ADCSRA,temp	        
        ldi temp,0b11000000     ;Настраиваем мультиплексор АЦП для опорного напряжения
        out ADMUX,temp	        ;и входного канала      
        ;--------- TIMER 0 -------------------------------------------------------------------
        ldi temp,(1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(1<<CS02)|(0<<CS01)|(1<<CS00) ;1024
        out TCCR0,temp
        ldi temp,5 ;Время прерывания таймера 0 = 1мСек
        out OCR0,temp                	        
        ;--------- TIMER 1 -------------------------------------------------------------------
        ldi temp,(0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(0<<WGM10)
        out TCCR1A,temp      
        ldi temp,(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10)
        out TCCR1B,temp
        ldi temp,high(585)  ;Время прерывания таймера 1A
        out OCR1AH,temp
        ldi temp,low(585)
        out OCR1AL,temp                         
        ;--------- TIMER 2 -------------------------------------------------------------------
        ldi temp,(1<<AS2) ;1-Кварц на 32768 Гц 0-Общий кварц
        out ASSR,temp
        ldi temp,(1<<WGM21)|(0<<WGM20)|(0<<COM21)|(0<<COM20)|(1<<CS22)|(1<<CS21)|(0<<CS20)
        out TCCR2,temp
        ;-------------- Расчет: 600/скорость(мм./мин.) = 600/500 = 1,2 сек.
        ldi temp,255   ;Время прерывания таймера 2
        out OCR2,temp        
        ldi temp,(1<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(1<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(1<<OCIE0)|(0<<TOIE0)  
        out TIMSK,temp
        ;OCIE - Output Compare
        ;TOIE - Overflow
        ;TICIE - Input Capture
        ldi temp,(0<<OCF2)|(0<<TOV2)|(0<<ICF1)|(0<<OCF1A)|(0<<OCF1B)|(0<<TOV1)|(0<<OCF0)|(0<<TOV0) ;Флаги
        out TIFR,temp
        cli ;Запрещаем прерывания
        clr NumberCount             
        clr motor_count
        clr motor_flag
        ldi temp,20
        mov mult,temp
        rcall pause
        rcall pause
        rcall pause
        sbi PORTB,MOTOR_POWER
        rcall pause
        cbi PORTA,MOTOR_REV       
        sbi PORTA,MOTOR_FORV          
        ldi motor_set,7 ;Значение по умолчанию
        ldi temp,50
        mov indicate_digital,temp
        ldi set_temperature,50 ;Установка температуры по умолчанию
        clr mode_flag    ;Сбросить флаг режимов
        clr time_secund  ;Сброс таймера
        clr time_minut
        ldi flag_tempOk,1
        clr flag_beep ;Флаг сигнала готовности
        ldi temp,0b01011111 ;DE 1
        mov anime,temp
        clr prohod_count
        inc prohod_count
        ;---------- Чтение из памяти EEPROM ------------
        ldi pause1,high(Multiple*2) ;Читаем сначала знак
        ldi pause2,low(Multiple*2)
        rcall EERead
        mov mult,r8
        mov temp,mult
        cpi temp,31 ;сравниваем верхний предел
        brsh Write_Mult 
        cpi temp,10 ;сравниваем нижний предел
        brlo Write_Mult 
        rjmp READ_POPRAVKA
        ;-------------- Запись в EEPROM ---------
Write_MULT:
        ldi pause1,high(Multiple*2)
        ldi pause2,low(Multiple*2)
        ldi temp,20
        mov mult,temp
        mov r8,mult
        rcall EEWrite
READ_POPRAVKA:                
        ;---------- Чтение поправки из памяти EEPROM ------------
        ldi pause1,high(Popravka*2) ;Читаем сначала знак
        ldi pause2,low(Popravka*2)
        rcall EERead
        mov popravka_znak,r8
        cpi popravka_znak,0x02 ;сравниваем
        brsh Write_all 
        ldi pause1,high(Popravka+1*2) ;Читаем поправку
        ldi pause2,low(Popravka+1*2)
        rcall EERead
        mov popravka,r8
        cpi popravka,36  ;сравниваем
        brsh Write_all   ;Больше или равно
        rjmp READ_SPEED
        ;-------------- Запись поправки в EEPROM ---------
Write_all:
        ldi pause1,high(Popravka*2)
        ldi pause2,low(Popravka*2)
        clr popravka_znak
        mov r8,popravka_znak
        rcall EEWrite
        ldi pause1,high(Popravka+1*2)
        ldi pause2,low(Popravka+1*2)
        clr popravka
        mov r8,popravka
        rcall EEWrite       
READ_SPEED:
        ;---------- Чтение скорости из памяти EEPROM ------------
        ldi pause1,high(Speed*2) ;Читаем сначала знак
        ldi pause2,low(Speed*2)
        rcall EERead
        mov motor_speed,r8
        cpi motor_speed,71 ;сравниваем верхний предел
        brsh Write_Speed 
        cpi motor_speed,30 ;сравниваем нижний предел
        brlo Write_Speed  
        rjmp READ_TIME
        ;-------------- Запись скорости в EEPROM ---------
Write_Speed:
        ldi pause1,high(Speed*2)
        ldi pause2,low(Speed*2)
        ldi motor_speed,50
        mov r8,motor_speed
        rcall EEWrite
READ_TIME:
        ;---------- Чтение времени из памяти EEPROM ------------
        ldi pause1,high(Time*2) ;Читаем сначала знак
        ldi pause2,low(Time*2)
        rcall EERead
        mov OFF_time,r8
        mov pause1,OFF_time
        cpi pause1,46 ;сравниваем верхний предел
        brsh Write_Time 
        cpi pause1,10 ;сравниваем нижний предел
        brlo Write_Time 
        rjmp TIMER_LOAD
        ;-------------- Запись времени в EEPROM ---------
Write_Time:
        ldi pause1,high(Time*2)
        ldi pause2,low(Time*2)
        ldi pause1,15  ;По умолчанию 15мин.
        mov OFF_time,pause1
        mov r8,OFF_time
        rcall EEWrite      
       ;-------- Загрузка значения таймера из Flash -------
TIMER_LOAD:               
       mov pause0,motor_speed
       ldi pause1,30
       sub pause0,pause1          ;текущая-30
       ldi ZH,high(Timer_value*2) ;начальный адрес
       ldi ZL,low(Timer_value*2)          
       add ZL,pause0 
       clr pause0        
       adc ZH,pause0            
       cli
       lpm          ;Читаем из Flash
       out OCR2,r0  ;загружаем в таймер        
       sei
;------------ ОСНОВНОЕ МЕНЮ --------------------------------      
MENU:  
       cpi flag_beep,1
       breq MENU1
       cpi flag_tempOk,0
       brne MENU1
       rcall pause
       rcall pause            
       sbi PORTB,BEEP
       rcall pause
       rcall pause
       rcall pause         
       rcall pause            
       rcall pause                        
       cbi PORTB,BEEP   
       rcall pause     
       rcall pause               
       sbi PORTB,BEEP
       rcall pause               
       rcall pause
       rcall pause         
       rcall pause            
       rcall pause                          
       cbi PORTB,BEEP
       rcall pause   
       rcall pause                  
       sbi PORTB,BEEP
       rcall pause            
       rcall pause            
       rcall pause
       rcall pause         
       rcall pause         
       cbi PORTB,BEEP
       ldi flag_beep,1   
MENU1:       
       sbis PINA,KEY_UP
       rjmp UP_MENU     
       sbis PINA,KEY_DOWN
       rjmp DOWN_MENU    
       sbic PINA,KEY_MOTOR ;если отжата кнопка 
       rjmp PROKAT_OK
       clr motor_flag
       clr prohod_count
       inc prohod_count
       rjmp MENU
;--------- Проверка на включение проката --------------
PROKAT_OK:
       sbis PINA,KEY_MOTOR ;если нажата кнопка
       rjmp MENU
       mov pause1,motor_flag
       cpi pause1,0
       brne MENU     ;если флаг <> 0
       ldi pause1,1
       mov motor_flag,pause1     
       clr motor_count
       ldi pause0,2
       mov prohod_count,pause0
       cbi PORTA,MOTOR_FORV
       sbi PORTA,MOTOR_REV 
       ;mov motor_count,motor_set ;Загружаем установленное значение
       ;dec motor_count      
       rjmp MENU      
;------- КНОПКА ВВЕРХ --------
UP_MENU:
       clr time_secund    ;Сброс таймера
       clr time_minut
       cpi mode_flag,2
       brne UP_MENU_NO_OFF
       clr mode_flag
       sbi PORTB,MOTOR_POWER ;Включаем мотор
       sbi PORTB,BEEP
       rcall pause
       sbi PORTA,MOTOR_FORV     
       cbi PORTB,BEEP              
       rjmp NO_KEY
UP_MENU_NO_OFF:       
       sbis PINA,KEY_HOT   ;Если включена кнопка нагрева
       rjmp NO_POPRAVKA    ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp NO_POPRAVKA    ;Если включена прокатка       
     ;------ Ожидание отпускания кнопки ----------   
       sbi PORTB,BEEP
       rcall pause   
       rcall pause     
       cbi PORTB,BEEP   
       rcall pause   
       rcall pause    
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                
       cbi PORTB,BEEP
       ldi pause0,30
loop1:
       ldi pause1,255
loop2:
       ldi pause2,255   
loop3:
       dec pause2    
       brne loop3
       sbic PINA,KEY_UP
       rjmp loop_key  
       sbis PINA,KEY_DOWN       ;Нажали обе кнопки  
       rjmp Key_press  
       sbis PINA,KEY_HOT        ;Если включена кнопка нагрева
       rjmp loop_key            ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp loop_key            ;Если включена прокатка             
       dec pause1  
       brne loop2
       dec pause0
       brne loop1 
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP                         
       ldi mode_flag,3
LOOP_POPRAVKA:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP
       rjmp LOOP_POPRAVKA              
MENU_POPRAVKA:
       ldi pause0,70
loop4:
       ldi pause1,255
loop5:
       ldi pause2,255   
loop6:
       dec pause2    
       brne loop6 
       sbis PINA,KEY_UP
       rjmp UP_POPRAVKA
       sbis PINA,KEY_DOWN
       rjmp DOWN_POPRAVKA       
       sbis PINA,KEY_HOT     ;Если включена кнопка нагрева
       rjmp EXIT_POPRAVKA    ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp EXIT_POPRAVKA    ;Если включена прокатка 
       cpi mode_flag,1
       breq EXIT_POPRAVKA_ERR      
       dec pause1  
       brne loop5
       dec pause0
       brne loop4
EXIT_POPRAVKA:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP
EXIT_POPRAVKA_ERR:        
        ;-------------- Запись поправки в EEPROM ---------
       cli	; Затем запрещаем прерывания. 
       ldi pause1,high(Popravka*2)
       ldi pause2,low(Popravka*2)
       mov r8,popravka_znak
       rcall EEWrite
       ldi pause1,high(Popravka+1*2)
       ldi pause2,low(Popravka+1*2)
       mov r8,popravka
       rcall EEWrite 
       ldi mode_flag,7 
       sei 	; разрешаем прерывания  
       rjmp MENU_MULT            
UP_POPRAVKA:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP        
       cpi popravka,35       ;Верхний предел достигнут
       brne UP_SRAVNENIE0
       cpi popravka_znak,1   ;знак +
       breq LOOP_UP_POPRAVKA1 ;выход
UP_SRAVNENIE0:       
       cpi popravka,0 
       brne UP_SRAVNENIE
       ldi popravka_znak,1      
UP_SRAVNENIE:      
       cpi popravka_znak,1   ;знак +
       breq SUMM_UP
       dec popravka
       ;dec popravka  
       rjmp LOOP_UP_POPRAVKA     
LOOP_UP_POPRAVKA1:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause     
       cbi PORTB,BEEP   
       rcall pause   
       rcall pause    
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                
       cbi PORTB,BEEP
       rjmp LOOP_UP_POPRAVKA           
SUMM_UP:            
       inc popravka
       ;inc popravka     
LOOP_UP_POPRAVKA:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP
       rjmp LOOP_UP_POPRAVKA              
       rjmp MENU_POPRAVKA
DOWN_POPRAVKA:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                         
       cbi PORTB,BEEP        
       cpi popravka,35       ;Нижний предел достигнут
       brne DOWN_SRAVNENIE0
       cpi popravka_znak,0   ;знак -
       breq LOOP_DOWN_POPRAVKA1 ;выход
DOWN_SRAVNENIE0:
       cpi popravka,0 
       brne DOWN_SRAVNENIE
       ldi popravka_znak,0             
DOWN_SRAVNENIE:       
       cpi popravka_znak,0   ;знак -
       breq SUMM_DOWN
       dec popravka
       ;dec popravka  
       cpi popravka,0 
       brne LOOP_DOWN_POPRAVKA
       ldi popravka_znak,0             
       rjmp LOOP_DOWN_POPRAVKA  
LOOP_DOWN_POPRAVKA1:                       
       sbi PORTB,BEEP
       rcall pause   
       rcall pause     
       cbi PORTB,BEEP   
       rcall pause   
       rcall pause    
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                
       cbi PORTB,BEEP
       rjmp LOOP_DOWN_POPRAVKA           
SUMM_DOWN:            
       inc popravka
       ;inc popravka          
LOOP_DOWN_POPRAVKA:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_DOWN
       rjmp LOOP_DOWN_POPRAVKA              
       rjmp MENU_POPRAVKA       
MENU_MULT:
       ldi pause0,70
loop20:
       ldi pause1,255
loop21:
       ldi pause2,255   
loop22:
       dec pause2    
       brne loop22 
       sbis PINA,KEY_UP
       rjmp UP_MULT
       sbis PINA,KEY_DOWN
       rjmp DOWN_MULT       
       sbis PINA,KEY_HOT     ;Если включена кнопка нагрева
       rjmp EXIT_MULT        ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp EXIT_MULT        ;Если включена прокатка 
       cpi mode_flag,1
       breq EXIT_MULT_ERR      
       dec pause1  
       brne loop21
       dec pause0
       brne loop20
EXIT_MULT:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP
       clr mode_flag
EXIT_MULT_ERR:
       cbi PORTB,BEEP
       ;-------------- Запись в EEPROM ---------
       cli	; Затем запрещаем прерывания.  
       ldi pause1,high(Multiple*2)
       ldi pause2,low(Multiple*2)
       mov r8,mult
       rcall EEWrite   
       sei 	; разрешаем прерывания             
       rjmp loop_key
UP_MULT:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP 
       inc MULT
       mov pause1,mult
       cpi pause1,31
       brlo LOOP_UP_MULT
       ldi pause1,10 
       mov mult,pause1            
LOOP_UP_MULT:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP
       rjmp LOOP_UP_MULT              
       rjmp MENU_MULT
DOWN_MULT:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP  
       dec mult
       mov pause1,mult
       cpi pause1,10
       brsh LOOP_DOWN_MULT
       ldi pause1,30  
       mov mult,pause1           
LOOP_DOWN_MULT:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_DOWN
       rjmp LOOP_DOWN_MULT 
       rjmp MENU_MULT                        
       ;-----------------------------------------------------     
NO_POPRAVKA:
       sbic PINA,KEY_MOTOR ;если не нажата кнопка проката
       rjmp UP_MENU1
       clr flag_beep ;Флаг сигнала готовности
       ldi flag_tempOk,1
UP_MENU1:       
       cpi mode_flag,1    ;Если ошибка датчика
       breq NO_KEY_UP
       cpi mode_flag,2
       brne UP_DALEE      ;Если не режим автоотключения
       clr mode_flag      ;Сбросить флаг режимов
       sbi PORTB,BEEP           
       rjmp NO_KEY
NO_KEY_UP: 
       rjmp LOOP_KEY
UP_DALEE:       
       sbis PINA,KEY_MOTOR
       rjmp UP_TEMPERATURE ;Если не включена прокатка
       sbi PORTB,BEEP    
       rcall pause   
       cbi PORTB,BEEP
       inc motor_set
       cpi motor_set,31
       brne PROVERKA_SPEED1 ;Уходим   
       ldi motor_set,7 
       rjmp PROVERKA_SPEED1
UP_TEMPERATURE:
       sbi PORTB,BEEP       
       sbic PINA,KEY_HOT   ;Если отключена кнопка нагрева
       rjmp NO_KEY       
       ldi pause1,10
       add set_temperature,pause1
       cpi set_temperature,220
       brlo BEEP_KEY1
       ldi set_temperature,50
BEEP_KEY1:
       rjmp BEEP_KEY
PROVERKA_SPEED1:
       rjmp PROVERKA_SPEED        
;------------- ОБЕ КНОПКИ ----------------------------------- 
KEY_PRESS:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP                         
       ldi mode_flag,5
LOOP_KEY_PRESS:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP 
       rjmp LOOP_KEY_PRESS
       sbis PINA,KEY_DOWN
       rjmp LOOP_KEY_PRESS                                
MENU_TIME:
       ldi pause0,70
loop14:
       ldi pause1,255
loop15:
       ldi pause2,255   
loop16:
       dec pause2    
       brne loop16 
       sbis PINA,KEY_UP
       rjmp UP_TIME
       sbis PINA,KEY_DOWN
       rjmp DOWN_TIME       
       sbis PINA,KEY_HOT     ;Если включена кнопка нагрева
       rjmp EXIT_TIME        
       sbic PINA,KEY_MOTOR
       rjmp EXIT_TIME        ;Если включена прокатка 
       cpi mode_flag,1
       breq EXIT_TIME_ERR      
       dec pause1  
       brne loop15
       dec pause0
       brne loop14
EXIT_TIME:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP
       clr mode_flag
EXIT_TIME_ERR:
       cbi PORTB,BEEP
        ;-------------- Запись времени в EEPROM ---------
       cli	; Затем запрещаем прерывания.   
       ldi pause1,high(Time*2)
       ldi pause2,low(Time*2)
       mov r8,OFF_time
       rcall EEWrite
       clr time_secund    ;Сброс таймера
       clr time_minut
       sei 	; разрешаем прерывания  
       rjmp loop_key
UP_TIME:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP 
       inc OFF_time
       mov pause1,OFF_time
       cpi pause1,46
       brlo LOOP_UP_TIME
       ldi pause1,10
       mov OFF_time,pause1             
LOOP_UP_TIME:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP
       rjmp LOOP_UP_TIME              
       rjmp MENU_TIME
DOWN_TIME:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP  
       dec OFF_time
       mov pause1,OFF_time
       cpi pause1,10
       brsh LOOP_DOWN_TIME
       ldi pause1,45 
       mov OFF_time,pause1                                
LOOP_DOWN_TIME:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_DOWN
       rjmp LOOP_DOWN_TIME 
       rjmp MENU_TIME                                                                                
;------- КНОПКА ВНИЗ ----------------------------------------
DOWN_MENU:
       clr time_secund    ;Сброс таймера
       clr time_minut
       cpi mode_flag,2
       brne DOWN_MENU_NO_OFF
       clr mode_flag
       sbi PORTB,MOTOR_POWER ;Включаем мотор
       sbi PORTB,BEEP
       rcall pause
       sbi PORTA,MOTOR_FORV     
       cbi PORTB,BEEP              
       rjmp NO_KEY       
DOWN_MENU_NO_OFF:       
       sbis PINA,KEY_HOT   ;Если включена кнопка нагрева
       rjmp NO_SPEED       ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp NO_SPEED       ;Если включена прокатка       
     ;------ Ожидание отпускания кнопки ----------   
       sbi PORTB,BEEP
       rcall pause   
       rcall pause     
       cbi PORTB,BEEP   
       rcall pause   
       rcall pause    
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                
       cbi PORTB,BEEP
       ldi pause0,30
loop7:
       ldi pause1,255
loop8:
       ldi pause2,255   
loop9:
       dec pause2    
       brne loop9
       sbic PINA,KEY_DOWN
       rjmp loop_key  
       sbis PINA,KEY_UP         ;Нажали обе кнопки  
       rjmp Key_press  
       sbis PINA,KEY_HOT        ;Если включена кнопка нагрева
       rjmp loop_key            ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp loop_key            ;Если включена прокатка             
       dec pause1  
       brne loop8
       dec pause0
       brne loop7 
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP                         
       ldi mode_flag,4
LOOP_SPEED:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_DOWN
       rjmp LOOP_SPEED              
MENU_SPEED:
       ldi pause0,70
loop10:
       ldi pause1,255
loop11:
       ldi pause2,255   
loop12:
       dec pause2    
       brne loop12 
       sbis PINA,KEY_UP
       rjmp UP_SPEED
       sbis PINA,KEY_DOWN
       rjmp DOWN_SPEED       
       sbis PINA,KEY_HOT     ;Если включена кнопка нагрева
       rjmp EXIT_SPEED       ;не вводим поправку
       sbic PINA,KEY_MOTOR
       rjmp EXIT_SPEED       ;Если включена прокатка 
       cpi mode_flag,1
       breq EXIT_SPEED_ERR      
       dec pause1  
       brne loop11
       dec pause0
       brne loop10
EXIT_SPEED:
       sbi PORTB,BEEP
       rcall pause   
       rcall pause                         
       rcall pause                         
       cbi PORTB,BEEP
       clr mode_flag
EXIT_SPEED_ERR:
       cbi PORTB,BEEP
       ;-------- Загрузка значения таймера из Flash -------
       mov pause0,motor_speed
       ldi pause1,30
       sub pause0,pause1          ;текущая-30
       ldi ZH,high(Timer_value*2) ;начальный адрес
       ldi ZL,low(Timer_value*2)          
       add ZL,pause0 
       clr pause0        
       adc ZH,pause0            
       cli
       lpm          ;Читаем из Flash
       out OCR2,r0  ;загружаем в таймер        
       sei
        ;-------------- Запись скорости в EEPROM ---------
       cli		; Затем запрещаем прерывания.
       ldi pause1,high(Speed*2)
       ldi pause2,low(Speed*2)
       mov r8,motor_speed
       rcall EEWrite 
       sei 		; разрешаем прерывания            
       rjmp loop_key
UP_SPEED:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP 
       inc motor_speed
       cpi motor_speed,71
       brlo LOOP_UP_SPEED
       ldi motor_speed,30             
LOOP_UP_SPEED:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_UP
       rjmp LOOP_UP_SPEED              
       rjmp MENU_SPEED
DOWN_SPEED:
       clr time_secund    ;Сброс таймера
       clr time_minut
       sbi PORTB,BEEP
       rcall pause                            
       cbi PORTB,BEEP  
       dec motor_speed
       cpi motor_speed,30
       brsh LOOP_DOWN_SPEED
       ldi motor_speed,70             
LOOP_DOWN_SPEED:
       rcall pause 
       rcall pause 
       rcall pause 
       sbis PINA,KEY_DOWN
       rjmp LOOP_DOWN_SPEED 
       rjmp MENU_SPEED                          
       ;----------------------------------------------------- 
NO_SPEED:          
       sbic PINA,KEY_MOTOR ;если не нажата кнопка проката
       rjmp DOWN_MENU1
       clr flag_beep     ;Флаг сигнала готовности
       ldi flag_tempOk,1
DOWN_MENU1:       
       clr time_secund   ;Сброс таймера
       clr time_minut
       cpi mode_flag,1   ;Если ошибка датчика
       breq LOOP_KEY
       cpi mode_flag,2
       brne DOWN_DALEE   ;Если режим автоотключения
       clr mode_flag     ;Сбросить флаг режимов
       sbi PORTB,BEEP           
       rjmp NO_KEY
DOWN_DALEE:       
       cpi mode_flag,2
       breq NO_KEY
       sbis PINA,KEY_MOTOR
       rjmp DOWN_TEMPERATURE ;Если не включена прокатка
       sbi PORTB,BEEP
       rcall pause      
       cbi PORTB,BEEP
       dec motor_set
       cpi motor_set,6
       brne PROVERKA_SPEED ;Уходим  
       ldi motor_set,30 
PROVERKA_SPEED:
       cp motor_count,motor_set
       brlo LOOP_KEY ;если motor_set меньше motor_count
       mov pause1,motor_set 
       dec pause1
       mov motor_count,pause1 
       rjmp LOOP_KEY
DOWN_TEMPERATURE:
       sbi PORTB,BEEP
       sbic PINA,KEY_HOT   ;Если отключена кнопка нагрева
       rjmp NO_KEY
       ldi pause1,10
       sub set_temperature,pause1
       cpi set_temperature,50
       brsh BEEP_KEY
       ldi set_temperature,210
BEEP_KEY:        
       rcall pause    
       cbi PORTB,BEEP   
       rjmp LOOP_KEY
NO_KEY:
       rcall pause   
       rcall pause     
       cbi PORTB,BEEP   
       rcall pause   
       rcall pause    
       sbi PORTB,BEEP
       rcall pause   
       rcall pause               
       cbi PORTB,BEEP   
LOOP_KEY:
       rcall pause   
       rcall pause   
       rcall pause   
       sbis PINA,KEY_UP
       rjmp LOOP_KEY    
       sbis PINA,KEY_DOWN
       rjmp LOOP_KEY    
       cbi PORTB,BEEP
       rjmp MENU       

;******** ПРЕОБРАЗОВАНИЕ ЗНАЧЕНИЯ АЦП В ГРАДУСЫ ******** 
ADCtoGradus:
;------ Вычитаем --------------------------          
    ldi loop,low(280) ;минимальное значение 
    ldi temp,high(280)
    sub loop,r0    ;младший
    sbc temp,r1    ;старший
    mov data,loop   
;------ Умножаем ---------------------
    ;ldi temp,MULT ;20
    mov temp,mult
    mul data,temp ;Умножить
;------ Делим на 10 ---------------------
    ldi temp,10   ;Делитель     
    clr loop           
    ldi data,-1    
minus1:
    sub r0,temp ;младший - 10
    sbc r1,loop
    inc data       
    brsh minus1                    
;------ Складываем ------------------------
    ;ldi temp,50 ;минимальная температура
    ;add data,temp
    cpi popravka_znak,0
    breq MINUS_GRADUS 
PLUS_GRADUS:    
    add data,popravka
    ret
MINUS_GRADUS:
    cp data,popravka
    brsh MINUS_GRADUS_Ok
    clr data
    ret  
MINUS_GRADUS_Ok:    
    sub data,popravka
    ret    
;-------- Деление 16-и бит ----------------       
decdig:
     ldi data,-1             
minus:
     sub indicate_digital,loop
     inc data               
     brsh minus           
     add indicate_digital,loop    
decod:
     cpi data,0x00
     breq S0
     cpi data,0x01
     breq S1
     cpi data,0x02
     breq S2
     cpi data,0x03
     breq S3
     cpi data,0x04
     breq S4
     cpi data,0x05
     breq S5
     cpi data,0x06
     breq S6
     cpi data,0x07
     breq S7
     cpi data,0x08
     breq S8
     cpi data,0x09
     breq S9
S0:  ldi data,0b00000101 ;0
     rjmp DD
S1:  ldi data,0b10101111 ;1
     rjmp DD
S2:  ldi data,0b01000110 ;2
     rjmp DD
S3:  ldi data,0b00100110 ;3
     rjmp DD
S4:  ldi data,0b10101100 ;4
     rjmp DD
S5:  ldi data,0b00110100 ;5
     rjmp DD
S6:  ldi data,0b00010100 ;6
     rjmp DD
S7:  ldi data,0b10100111 ;7
     rjmp DD
S8:  ldi data,0b00000100 ;8
     rjmp DD
S9:  ldi data,0b00100100 ;9
     rjmp DD
DD:  ret
;**************************
;    ПАУЗА
;**************************               	
pause:
     ldi pause1,255
retu22:
     ldi pause2,255   
retu23:
     dec pause2    
     brne retu23 
     dec pause1  
     brne retu22 
     ret 

EEWrite:
     sbic EECR,EEWE		; Ждем готовности памяти к записи. Крутимся в цикле
     rjmp EEWrite 		; до тех пор пока не очистится флаг EEWE
     cli			; Затем запрещаем прерывания.
     out EEARL,pause2 		; Загружаем адрес нужной ячейки
     out EEARH,pause1  		; старший и младший байт адреса
     out EEDR,R8 		; и сами данные, которые нам нужно загрузить
     sbi EECR,EEMWE		; взводим предохранитель
     sbi EECR,EEWE		; записываем байт
     ret			; возврат из процедуры
 
EERead:	
     sbic EECR,EEWE		; Ждем пока будет завершена прошлая запись.
     rjmp EERead		; также крутимся в цикле.
     out EEARL,pause2		; загружаем адрес нужной ячейки
     out EEARH,pause1 		; его старшие и младшие байты
     sbi EECR,EERE 		; Выставляем бит чтения
     in R8,EEDR 		; Забираем из регистра данных результат
     ret   

Timer_value: 
.db 255,247,239,232,225,218,212,207,201,196,191,186,182,178,173,170,166,162,159,156,153,150
.db 147,144,141,139,136,134,131,129,127,125,123,121,119,117,115,114,112,110,109,0
   
.eseg    
Popravka:
.db 0x00,0x00 ;поправка -0'C
Speed:
.db 0x1E,0x00 ;Скорость 300 мм./мин.
Time:
.db 0x0A,0 ;Время 10 минут
Multiple:
.db 0x14,0 ;Поправка 2,0