.include "m8def.inc"
.def tmp=r21
.def digit=r22
.def nomber=r23
;***** Преобразование двоичного числа в десятичное 

.def    fbinL=r16            ;двоичное значение, младший байт
.def    fbinH=r17            ;двоичное значение, старший байт
.def    tBCD0=r17            ;BCD значение, цифры 1 и 0
.def    tBCD1=r18            ;BCD значение, цифры 3 и 2
.def    tBCD2=r19            ;BCD значение, цифра 4
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
;регистре.
.cseg 
.org 0
   rjmp init
.org 0x001
rjmp rc_int0
.org 0x004
rjmp one_second
.org 0x006
reti
.org 0x007
reti
.org 0x008  ;16 битный таймер счетчик
reti
.org 0x009 ;Timer/Counter0 Overflow
rjmp timer_0 
.org 0x00E;ADC Conversion Complete
rjmp adc_ok   
.org 0x00F; EE_RDY EEPROM Ready
reti
.org 0x010 ;Analog Comparator
rjmp comparator   



   
.cseg


init:







; Инициализация указателя стека
		ldi tmp, low(RAMEND)
		out SPL, tmp
		ldi tmp, high(RAMEND)
		out SPH, tmp
		

		

;Инициализация PORTD,используем под lm7001> PD5=CE,PD6=CL,PD7=DATA 
  ldi tmp,0x00
  out ddrd,tmp
;Инициализация PORTC,используем PC0=DATA   PC1=STR PC2=OUT,PC3-CE 
  ldi tmp,0x3f
  out ddrc,tmp

;Инициализация PORTD0=+ PortD1=-
ldi tmp,0x03
  out portd,tmp

;Инициализация PORTB ;PB2,PB3,PB4 -подключаем к подтягивающим резисторам.
ldi tmp,0x1c
out portb,tmp


  ;sbi portb,1  



ldi tmp,0x83
out acsr,tmp ;выключим компаратор



ldi tmp,0x04;4;5 ;коэффициент предделителя для Timer/Counter0 =1024
out tccr0,tmp ;записываем в регистр предделителя TC0
               ;8000/1024=7812,5Гц

ldi tmp,0x7f; делим еще на 64 d7
out tcnt0,tmp ;

ldi tmp,0x41  ;разрешаем прерывание от TC0,TC2
out timsk,tmp     			     

clr r12;
STS 0x61,r12
STS 0x62,r12
STS 0x65,r12;запишем в регистр нули
STS 0x66,r12
STS 0x67,r12
STS 0x68,r12
STS 0x69,r12
STS 0x6C,r12
STS 0x6A,r12 ;по умолчанию мы не не выводим на экран частоту в процедуре fr_light
STS 0x70,r12
STS 0x72,r12
STS 0x73,r12
STS 0x74,r12
STS 0x75,r12
STS 0x76,r12
STS 0x77,r12
STS 0x80,r12
STS 0x81,r12
STS 0x6b,r12
ldi tmp,0x19;21 ;скорость опроса клавы
STS 0x6e,tmp

ser tmp; 
STS 0x87,tmp ; 
STS 0x8D,tmp ;
STS 0x93,tmp ; не светить точку в термометре 
STS 0x90,tmp
STS 0x88,tmp
STS 0x99,tmp

;стартовая частота
ldi tmp,0xD2;c9
STS 0x63,tmp



ldi tmp,0x0A ;cимвол "С".
STS 0x92,tmp

ldi tmp,0x0b ;cимвол градуса.
STS 0x91,tmp


ldi tmp,0x08;
STS 0x64,tmp


ldi tmp,0xAA ;по умолчанию в подменю "Установка часов" моргают минуты
STS 0x71,tmp 


ldi tmp,0x05;5 ;предделить на 128,получим прерывание в секунду.
out tccr2,tmp

ldi tmp,0x08 
out assr,tmp ;Разрешаем асинхронный режим таймера TC2


;Инициализация ADC
ldi tmp,0xEF    ;делитель частоты 128
out adcsra,tmp
;Используем внутренний источник опорного напряжения 2.56в.
;Выравнивание по левому краю,вывод ADC3
;ldi tmp,0xe6  ; Используем вывод ADS6
ldi tmp,0xe7  ;  Используем вывод ADS7
out admux,tmp ; 

;Инициализация внешних прирываний
;ldi tmp,0x02
;out mcucr,tmp ;прерывание INT0 срабатывает по заднему фронту
;ldi tmp,0x40
;out GICR,tmp ;разрешаем прерывание INT0

;Инициализация 16 битного таймера счетчика
ldi tmp,0x02
out tccr1b,tmp ;ставим предделитель 8,т.е на вход приходит 1мгц


clr r12
STS 0x9a,r12;по умолчанию тюнер выключен


rcall alarm_read ;читаем будильники


;rjmp timer_0  

sei ;разрешаем прерывания 
W1:	 



	 RJMP W1








alarm_read:  ;процедура чтения ячеек EEPROM будильников,и вывод в SDRAM

ldi r16,0x3d  ;
clr r17
rcall EERead  ;
STS 0x9c,r21
inc r16
rcall EERead
STS 0x9d,r21
;прочли 1й будильник

ldi r16,0x3f  ;
rcall EERead  ;
STS 0x9e,r21
inc r16
rcall EERead
STS 0x9F,r21

;прочли 2й будильник

ldi r16,0x41  ;
rcall EERead  ;
STS 0xa0,r21
inc r16
rcall EERead
STS 0xa1,r21

;прочли 3й будильник



ret




alarm_write:  ;процедура записи будильника

LDS r1,0x9b; cчитываем какой будильник писать

ldi tmp,0x01
cp r1,tmp
breq alr1

ldi tmp,0x02
cp r1,tmp
breq alr2

ldi tmp,0x03
cp r1,tmp
breq alr3
rjmp out_alarm_write

alr1:
LDS r22,0x9c
ldi r16,0x3d
clr r17
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp w_m1
rjmp E1_no
w_m1:
mov r21,r22
rcall EEWrite
E1_no:
inc r16
LDS r22,0x9d
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp w_h1
rjmp E2_no
w_h1:
mov r21,r22
rcall EEWrite
E2_no:
rjmp out_alarm_write


alr2:
LDS r22,0x9e
ldi r16,0x3f
clr r17
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp a2w_m1
rjmp aE1_no
a2w_m1:
mov r21,r22
rcall EEWrite
aE1_no:
inc r16
LDS r22,0x9f
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp a2w_h1
rjmp aE2_no
a2w_h1:
mov r21,r22
rcall EEWrite
aE2_no:

rjmp out_alarm_write


alr3:
LDS r22,0xa0
ldi r16,0x41
clr r17
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp alr3_m1
rjmp alr3_no
alr3_m1:
mov r21,r22
rcall EEWrite
alr3_no:
inc r16
LDS r22,0xa1
rcall EERead
cpse r22,r21 ;а изменились ли данные? может не стоит гробить память зря?
rjmp alr3_h1
rjmp alr3_h_no
alr3_h1:
mov r21,r22
rcall EEWrite
alr3_h_no:
clr r16
clr r22
clr r21


out_alarm_write:
clr tmp
STS 0x9b,tmp ;Очистили

ret











	 rc_int0:
	 cli
in r0,timsk             ;нужно при первом срабатывание имп.
ldi tmp,0x45
breq read_tc1          ;если TC1 запущен
out timsk,tmp   ;Не запущен запускаем
rjmp out_rc

read_tc1:

ldi tmp,0x41
out timsk,tmp;oстанавливаем счетчик

in r0,tcnt1l
STS 0x61,r0

LDS r0,0x62
inc r0
STS 0x62,r0

ldi tmp,0x45
out timsk,tmp   ;Не запущен запускаем



sei


out_rc:
	 reti



















adc_ok: 
cli


in r0,adch   ;пришло прирывание,считали значение
STS 0x75,r0 ; отправим в память,оно нам еще пригодится
;0x320 -2в 
ldi tmp,0x03
mov r12,tmp
ldi tmp,0x20
mov r11,tmp
;процедура приведения 12 разрядного числа к 8 разрядному;
ldi tmp,0x06
k:
lsl r11
rol r12
dec tmp
brne k

cpse r12,r0  ;вдруг нам повезло!
rjmp adc_out
ldi tmp,0xff
STS 0x73,tmp ;наверно станцию захватили))

adc_out:

ldi tmp,0x41  ;разрешаем прерывание от TC0
out timsk,tmp   

sei
reti




one_second:
cli
LDS r26,0x60; Загр сек
ldi tmp,0x3b
cp tmp,r26 
breq out_in_SDRAM_min
inc r26 ;cчетчик минут
STS 0x60,r26
rjmp out_second ;если не дошли до минуты выходим 

out_in_SDRAM_min:  ;добавим что то в ячейку памяти $0061
LDS  r27,0x61 ;cчитаем что у нас там
ldi tmp,0x3b
cp tmp,r27
breq out_in_SDRAM_hour ;если у нас 60мин,то добавляем часы
inc r27
STS 0x61,r27
clr r26 ;очищаем счетчик секунд по истечении минуты
STS 0x60,r26
rjmp out_second 

out_in_SDRAM_hour:
clr r27 ;очищаем счетчик минут
STS 0x61,r27 ;сбросили минуты

LDS  r27,0x62 ;cчитаем что у нас там
ldi tmp,0x3b
cp tmp,r27
breq out_in_SDRAM_clr ;если у нас 60часов,то сбросить все
inc r27
STS 0x62,r27
rjmp out_second 


out_in_SDRAM_clr:
clr r27      ;
STS 0x62,r27   ;  очищаем счетчик часов 
out_second:



LDS r1,0x81  ;cколько секунд натикало?
ldi tmp,0x0A
cpse r1,tmp
rjmp mov_time
clr tmp
STS 0x81,tmp;сбрасываем секунды
ldi tmp,0xFF
STS 0x80,tmp ;пора менять бегущую строку
LDS r1,0x6b
inc r1
STS 0x6b,r1


rjmp out_mov_time

mov_time:
inc r1
STS 0x81,r1


out_mov_time:


;*************Термометр

LDS r1,0x75 ;считали ADC
clr r0 ;будет старший байт значения температуры

ldi tmp,0x06
t:
lsr r1  ;будет старший байт значения
ror r0  ;будет младший байт значения
dec tmp
brne t

ldi tmp,0x1A;
mov r2,tmp    ; 31A -значение константы линейной функции  (ADC-31A)/4

ldi tmp,0x03;
mov r3,tmp

sub r0,r2   ;вычитаем 
sbc r1,r3   ;

;Делим 
ldi tmp,0x04  
mov r3,tmp


mov r2,r1
mov r1,r0

.DEF rd1l = R1 ; LSB 16-bit-number to be divided
.DEF rd1h = R2 ; MSB 16-bit-number to be divided
.DEF rd1u = R4 ; interim register
.DEF rd2 = R3 ; 8-bit-number to divide with
.DEF rel = R5 ; LSB result
.DEF reh = R6 ; MSB result
.DEF rmp = R21; multipurpose register for loading

;
; Divide rd1h:rd1l by rd2
;
div8:
clr rd1u ; clear interim register
clr reh ; clear result (the result registers
clr rel ; are also used to count to 16 for the
inc rel ; division steps, is set to 1 at start)
;
; Here the division loop starts
;
div8a:
clc ; clear carry-bit
rol rd1l ; rotate the next-upper bit of the number
rol rd1h ; to the interim register (multiply by 2)
rol rd1u
brcs div8b ; a one has rolled left, so subtract
cp rd1u,rd2 ; Division result 1 or 0?
brcs div8c ; jump over subtraction, if smaller
div8b:
sub rd1u,rd2; subtract number to divide with
sec ; set carry-bit, result is a 1
rjmp div8d ; jump to shift of the result bit
div8c:
clc ; clear carry-bit, resulting bit is a 0
div8d:
rol rel ; rotate carry-bit into result registers
rol reh
brcc div8a ; as long as zero rotate out of the result

;.DEF rel = R5 ; LSB result
;.DEF reh = R6 ; MSB result


mov r16,r5
mov r17,r6

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

rcall bsd

mov r2,r17
swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
rcall four_lsr_r2
STS 0x8f,r2 ;отправили в ОЗУ
mov r2,r17
rcall four_lsr_r2
STS 0x8e,r2 ;отправили в ОЗУ

;****************конец записи термометра********************




sei
reti


comparator:
;cli
;LDS r3,0x75 ;загрузили число срабатываний компаратора
;ldi tmp,0x02
;cpse tmp,r3 
;rjmp comp_out           ;нет не достигли
;ldi tmp,0xFF;если число срабатываний компаратора достигнуто
;STS 0x73,tmp
;clr tmp
;STS 0x75,tmp ;очищаем число срабатываний
;rjmp c_out

;comp_out:
;inc r3
;STS 0x75,r3
;c_out:
sei

reti







timer_0 :

;***************ЧАСЫ*********************************

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт


LDS r16,0x61 ;читаем значения минут
clr r17
rcall bsd
mov r2,r17
swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
rcall four_lsr_r2
STS 0x8c,r2 ;отправили в ОЗУ

mov r2,r17
rcall four_lsr_r2
STS 0x8b,r2 ;отправили в ОЗУ

LDS r16,0x62 ;читаем значения часов
clr r17
rcall bsd
mov r2,r17
swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
rcall four_lsr_r2
 ldi tmp,0xA0  ; point
 add r2,tmp    ;
STS 0x8a,r2 ;отправили в ОЗУ

mov r2,r17
rcall four_lsr_r2
STS 0x89,r2 ;отправили в ОЗУ			
	 
;---------------------------------------------------------------конец часы

;Высветим на дисплее HELLOU
;cli 

;***Моргалка****

LDS  r0,0x68 ;cчитаем что у нас там
ldi tmp,0xFF
cp tmp,r0
breq out1_morgalka ;если у нас 255
inc r0
STS 0x68,r0
rjmp out_morgalka

out1_morgalka:
;clr r0 
;STS 0x68,r0;

LDS  r0,0x69 ;cчитаем что у нас там
ldi tmp,0x09 ;10
cp tmp,r0
breq out2_morgalka ;если у нас 29
inc r0
STS 0x69,r0
rjmp out_morgalka

out2_morgalka:
clr r0 
STS 0x69,r0;
LDS  r0,0x70 ;cчитаем что у нас там
ldi tmp,0x02 ;29
cp tmp,r0
breq out3_morgalka ;если у нас 29
inc r0
STS 0x70,r0
rjmp out_morgalka
out3_morgalka:
clr r0
STS 0x70,r0;регистр управления морганием

;******************Управление бегущей строкой


LDS r0,0x80;80 ;разрешена ли Бегущая строка (00 -нет FF-да)
ldi tmp,0xFF
cpse r0,tmp
rjmp  o_ctr_m  ;нет
   ;да

LDS r1,0x6b ;загружаем переменную сдвига в право
ldi tmp,0x06 ;6
cp tmp,r1 ; а не сдвинулись ли мы 6 раза?
breq stop_moving ;да	

ldi tmp,0x0c ;12 
cp tmp,r1 ; а не сдвинулись ли мы 12 раза?
breq stop_moving ;да	

ldi tmp,0x12 ;18
cp tmp,r1 ; а не сдвинулись ли мы 18 раза?
breq rst_moving ;да


ldi tmp,0x17 ;24
cp tmp,r1 ; а не сдвинулись ли мы 24 раза?
breq rst_moving ;да

inc r1
STS 0x6b,r1
rjmp o_ctr_m

rst_moving:

clr r1
STS 0x6b,r1
STS 0x81,r1
rjmp o_ctr_m

stop_moving:
ldi tmp,0x00
STS 0x80,tmp


o_ctr_m:


out_morgalka:




;ldi digit,0x16 ;Н
;ldi nomber,0x04 ;номер разряда который нужно засветить.
;rcall indicator


;ldi digit,0x43 ;E
;ldi nomber,0x05 ;номер разряда который нужно засветить.
;rcall indicator

;ldi digit,0x67 ;L
;ldi nomber,0x06 ;номер разряда который нужно засветить.
;rcall indicator

;ldi digit,0x22 ;O
;ldi nomber,0x07 ;номер разряда который нужно засветить.
;rcall indicator

;ldi digit,0x26 ;U
;ldi nomber,0x08 ;номер разряда который нужно засветить.
;rcall indicator










;ldi r25,255
;mz:ldi r26,255
;mz1:dec r26 
;brne mz1
;dec r25
;brne mz
;ldi r25,10
;mzx:ldi r26,5
;mzx1:dec r26 
;brne mzx1
;dec r25
;brne mzx

;;Счетчик номера разряда который активный в данный момент времени
;ldi tmp,0x08
;LDS r7,0x77  ;выгружаем с ячейки управлением сегментов
;cp tmp,r7
;breq clr_count
;inc r7
;STS 0x77,r7  ;загружаем обратно
;rjmp o_clr_count

;clr_count:
;clr r7
;STS 0x77,r7

;o_clr_count:

;ldi r27,0xff

;inc r11
;mov r5,r11
;cp r27,r11
;brne www 
;inc r12
;clr r6
;mov r6,r12

LDS r24,0x6d ;что в опросе клавы?
;ldi tmp,0x01;21
LDS tmp,0x6e ;скорость опроса клавы
cp tmp,r24
brne wewe

;sbis pind,0
;rcall olix

;sbis pind,1
;rcall hiol

;Опрос клавиатуры,и реализация меню
sbi portc,1; вдруг там что то есть.

cbi portc,0
nop
nop
nop
nop
nop
nop
sbis pinb,4
rcall menu;  нажата кнопка меню
sbis pinb,2
rcall left_button;нажата кнопка LEFT
sbis pinb,3
rcall up_button ;нажата кнопка UP

sbi portc,0;вернем как было)
nop
nop
cbi portc,1
nop
nop
nop
nop
nop
nop
sbis pinb,4
rcall ok_button;  нажата кнопка OK
sbis pinb,2
rcall down_button ;нажата кнопка DOWN
sbis pinb,3
rcall right_button ;нажата кнопка RIGHT
nop
nop
sbi portc,1;вернем как было)


clr r24
STS 0x6d,r24

wewe:
LDS r24,0x6d
inc r24
STS 0x6d,r24


;---------Включение
LDS r0,0x9A
ldi tmp,0xFF
cp tmp,r0
breq on_power2

LDS r0,0x66 ;cчитываем нажаты ли кнопки
Ldi tmp,0xEE ;код кнопки down
cp tmp,r0
breq on_power
Ldi tmp,0xDD ;код кнопки down
cp tmp,r0
breq on_power
clr r0
STS 0x66,r0
rjmp no_power




on_power:
clr r0
STS 0x66,r0
STS 0x65,r0
ldi tmp,0xff
STS 0x9a,tmp ;включаем питание
;--------------------------------

on_power2:




;********************************МЕНЮ*****************************************

LDS  tmp,0x65; считали из памяти переменную меню
ldi r29,0x00

cpse tmp,r29 ;сравним-а не нажимали ли мы кнопку меню ??
rjmp vibor ;нет;нажимали
rjmp inductor ;Да-не нажимали

vibor:
ldi r29,0x01
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 1 раз??
rjmp vibor2 ;нет
rjmp alarm1 ;да

vibor2:
ldi r29,0x02
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 2 раз??
rjmp vibor3 ;нет
rjmp alarm2 ;да

vibor3:
ldi r29,0x03
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 3 раз??
rjmp vibor4 ;нет
rjmp alarm3 ;да

vibor4:
ldi r29,0x04
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 4 раз??
rjmp vibor5 ;нет
rjmp set_time ;да

vibor5:
ldi r29,0x05
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 5 раз??
rjmp vibor6 ;нет
rjmp autoscan ;да


vibor6:
ldi r29,0x06
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 6 раз??
nop;rjmp inductor;vibor3 ;нет
rjmp ch_co ;да

inductor:













;************************** Вывод на экран 


;EERead:	
;	SBIC 	EECR,EEWE		; Ждем пока будет завершена прошлая запись.
;	RJMP	EERead			; также крутимся в цикле.
;	OUT 	EEARL, R16		; загружаем адрес нужной ячейки
;	OUT  	EEARH, R17 		; его старшие и младшие байты
;	SBI 	EECR,EERE 		; Выставляем бит чтения
;	IN 	R21, EEDR 		; Забираем из регистра данных результат
;	RET


LDS r16,0x76 ;cчитываем номер нажатой ячейки
clr r17      ;Отображаем ячейку
rcall bsd      ; покажем номер ячейки в которой сидим

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

 
 ldi digit,0xff ;P
ldi nomber,0x08 ;номер разряда который нужно засветить.
rcall indicator
 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2
 rcall znakogen  ;вызываем омена
ldi nomber,0x03 ;светим 1й разряд
rcall indicator ;посылаем в дисплей

rcall fack_zero
mov r2,r17
rcall four_lsr_r2
rcall znakogen 
ldi nomber,0x02 ;светим 2й разряд
rcall indicator

ldi digit,0x13 ;P
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator



LDS  r16,0x76 ;считываем номер нажатой ячейки
Ldi r17,0x02 ;2
MUL r16,r17  ;умножим на 2
mov r16,r0
clr r17 ;cтарший бит

rcall EERead ;вызываем из памяти
STS 0x63,r21
inc r16
rcall EERead
STS 0x64,r21


clr tmp
STS 0x6A,tmp ;запрещаем светить  в процедуре fr_light

rcall fr_light
rcall lm7001

;rcall znakogen 

;ldi nomber,0x05 ;светим 4й разряд
;rcall indicator


;*******************"Бегущая строка"********************


;LDS  r1,0x70 ;cчитаем что у нас в мигалке
;ldi tmp,0x00
;cp tmp,r1
;breq no_moving ;нельзя сдвигать светим

;clr r0
;STS 0x70,r0;регистр управления морганием



ldi tmp,0x86;номер ячейки в которой хранится символ разряда n
LDS r1,0x6b ;переменная сдвига в право
add r1,tmp ;cуммируем получаем адрес ячейки
clr r27    ; очищаем XH
mov r26,r1 ; записуем XL

LD r2,X ;cчитываем c ячейки что светить  в 1м разряде

rcall znakogen  ;вызываем омена
ldi nomber,0x08 ;светим 1й разряд
rcall indicator ;посылаем в дисплей
rcall pause

ldi tmp,0x85;номер ячейки в которой хранится символ разряда n
LDS r1,0x6b ;переменная сдвига в право
add r1,tmp ;cуммируем получаем адрес ячейки
clr r27    ; очищаем XH
mov r26,r1 ; записуем XL

LD r2,X ;cчитываем c ячейки что светить  в 2м разряде


rcall znakogen 
ldi nomber,0x07 ;светим 2й разряд
rcall indicator
rcall pause

ldi tmp,0x84;номер ячейки в которой хранится символ разряда n
LDS r1,0x6b ;переменная сдвига в право
add r1,tmp ;cуммируем получаем адрес ячейки
clr r27    ; очищаем XH
mov r26,r1 ; записуем XL

LD r2,X ;cчитываем c ячейки что светить  в 3м разряде

rcall znakogen  ;вызываем омена
ldi nomber,0x06 ;светим 3й разряд
rcall indicator ;посылаем в дисплей
rcall pause

ldi tmp,0x83;номер ячейки в которой хранится символ разряда n
LDS r1,0x6b ;переменная сдвига в право
add r1,tmp ;cуммируем получаем адрес ячейки
clr r27    ; очищаем XH
mov r26,r1 ; записуем XL

LD r2,X ;cчитываем c ячейки что светить  в 4м разряде


rcall znakogen  ;вызываем омена
ldi nomber,0x05 ;светим 4й разряд
rcall indicator ;посылаем в дисплей
rcall pause

ldi tmp,0x82;номер ячейки в которой хранится символ разряда n
LDS r1,0x6b ;переменная сдвига в право
add r1,tmp ;cуммируем получаем адрес ячейки
clr r27    ; очищаем XH
mov r26,r1 ; записуем XL

LD r2,X ;cчитываем c ячейки что светить  в 4м разряде


rcall znakogen  ;вызываем омена
ldi nomber,0x04 ;светим 5й разряд
rcall indicator ;посылаем в дисплей
rcall pause

;ldi tmp,0x87;номер ячейки в которой хранится символ точки
;LDS r1,0x6b ;переменная сдвига в право
;add r1,tmp ;cуммируем получаем адрес ячейки
;clr r27    ; очищаем XH
;mov r26,r1 ; записуем XL

;LD r2,X ;cчитываем c ячейки что светить  в 4м разряде


;rcall znakogen  ;вызываем омена
;ldi nomber,0x06 ;светим 3й разряд
;rcall indicator ;посылаем в дисплей
;rcall pause


;***********Конец бегущей строке*********
   ;да




LDS  r1,0x70;70 ;cчитаем что у нас там
ldi tmp,0x01;01
cp tmp,r1
breq out_r

ldi digit,0xFF ;тушим все
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

rjmp out_r2
out_r:
;clr r25
ldi digit,0xFD;FD ;точка
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator










out_r2:

no_mo:
no_power:


ldi tmp,0x7f; делим еще на 64
out tcnt0,tmp 



ldi tmp,0x40  ;запрещаем прерывание от себя,иначе не будут работать все последующие
out timsk,tmp
sei


reti  ; выходим



fr_light:   ;процедура вывода на экран частоты принимаемой станции

;***************************************************************************
;* 16x16 Bit Unsigned Multiplication
.def	mc16uL	=r16		;multiplicand low byte
.def	mc16uH	=r17		;multiplicand high byte
.def	mp16uL	=r18		;multiplier low byte
.def	mp16uH	=r19		;multiplier high byte
.def	m16u0	=r18		;result byte 0 (LSB)
.def	m16u1	=r19		;result byte 1
.def	m16u2	=r20		;result byte 2
.def	m16u3	=r21		;result byte 3 (MSB)
.def	mcnt16u	=r22		;loop counter

;***** Code

LDS r16,0x63 ;считываем младший бит значениея делителя
LDS r17,0x64 ;cчитываем старший бит значения делителя


ldi r18,0x05 ;умножаем на 5(шаг 50кгц)
clr r19 ;очистили старший байт

clr r20 ;очистим на всякий случай-
clr r21 ;-вдруг там уже что то хранится
clr r22 ;


mpy16u:	clr	m16u3		;clear 2 highest bytes of result
	clr	m16u2
	ldi	mcnt16u,16	;init loop counter
	lsr	mp16uH
	ror	mp16uL

m16u_1:	brcc	noad8		;if bit 0 of multiplier set
	add	m16u2,mc16uL	;add multiplicand Low to byte 2 of res
	adc	m16u3,mc16uH	;add multiplicand high to byte 3 of res
noad8:	ror	m16u3		;shift right result byte 3
	ror	m16u2		;rotate right result byte 2
	ror	m16u1		;rotate result byte 1 and multiplier High
	ror	m16u0		;rotate result byte 0 and multiplier Low
	dec	mcnt16u		;decrement loop counter
	brne	m16u_1		;if not done, loop more
	

ldi r20,0x2e  ; Задаем значение промежуточной частоты 1070
ldi r21,0x04  ;

sub r18,r20   ;вычитаем так как частота гетеродина выше
sbc r19,r21   ;


mov r16,r18
mov r17,r19
clr r18
clr r19

rcall bsd

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2

 STS 0x86,r2 ; записываем 1й разряд
  STS 0x98,r2 ;дублируем для коректной работы бегущей строки

 LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l1 ;нет

rcall znakogen  ;вызываем омена
ldi nomber,0x08 ;светим 1й разряд
rcall indicator ;посылаем в дисплей
rcall pause

fr_l1:
 
mov r2,r17
rcall four_lsr_r2
STS 0x85,r2 ; записываем 2й разряд
 STS 0x97,r2 ;дублируем для коректной работы бегущей строки
LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l2 ;

rcall znakogen 
ldi nomber,0x07 ;светим 2й разряд
rcall indicator
rcall pause

fr_l2:

 mov r2,r18
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2
 ldi tmp,0xA0  ; point
 add r2,tmp    ;

 STS 0x84,r2 ; записываем 3й разряд
  STS 0x96,r2 ;дублируем для коректной работы бегущей строки
 
 LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l3 ;нет

 rcall znakogen  ;вызываем омена
ldi nomber,0x06 ;светим 3й разряд
rcall indicator ;посылаем в дисплей
rcall pause
fr_l3:

mov r2,r18
rcall four_lsr_r2
STS 0x83,r2 ; записываем 4й разряд
 STS 0x95,r2 ;дублируем для коректной работы бегущей строки

 LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l4 ;нет

rcall znakogen 
ldi nomber,0x05 ;светим 4й разряд
rcall indicator
rcall pause
fr_l4:



rcall fack_zero;процедура гашения нуля
mov r2,r19
STS 0x82,r2 ; записываем 5й разряд
 STS 0x94,r2 ;дублируем для коректной работы бегущей строки

 LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l5 ;нет


rcall znakogen 
ldi nomber,0x04 ;светим 5й разряд
rcall indicator
rcall pause

fr_l5:



 

   LDS r3,0x6A  ;разрешен ли вывод на дисплей?
 ldi tmp,0xff
 cpse r3,tmp
 rjmp fr_l6 ;нет

ldi digit,0xfd  ;светим точку
ldi nomber,0x06 ;светим 3й разряд
rcall indicator
rcall pause

fr_l6:
ret


pause: ;нужно для повышения яркости

;LDS r28,0x74
;ldi r29,0x01
;cpse r28,r29
;rjmp ou1
;rjmp out_pause
;ou1:

ldi r28,0x1f
u2: ldi r29,0xff
  u: dec r29
   brne u
   dec r28
   brne u2 
  out_pause:

   ret




four_lsr_r2:
lsr r2   ;
lsr r2   ; 
lsr r2   ;
lsr r2   ;
ret



alarm1:
ldi tmp,0x01
STS 0x9b,tmp
rcall alarm_corection
clr tmp
STS 0x9b,tmp
sei
reti

alarm2:

ldi tmp,0x02
STS 0x9b,tmp
rcall alarm_corection
clr tmp
STS 0x9b,tmp

sei
reti



alarm3:  ;процедура установки 3го будильника
ldi tmp,0x03
STS 0x9b,tmp
rcall alarm_corection
clr tmp
STS 0x9b,tmp
sei
reti




alarm_corection:

;ячейка SDRAM 0x9b -номер будильника который коректим

LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xAA
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp no_alarm1_ok ;нет
rjmp yes_alarm1 ;да



no_alarm1_ok:
LDS  r0,0x67;считаем с ""регистра"" разрешения меню,т.е. вошли ли мы в меню
ldi tmp,0xFF
cpse tmp,r0 ;сравним-а вошли ли мы в меню??
rjmp out_alarm1 ;нет
                  ;да
rjmp yes_alarm1_2 


yes_alarm1:
LDS  r0,0x72;считаем с ""регистра"" ok
ldi tmp,0x01
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp out_yes_alarm1 ;нет
  ;да
  clr tmp
STS 0x67,tmp;очищаем  меню   выходим
STS 0x72,tmp 
STS 0x66,tmp
rcall alarm_write

rjmp out2_alarm1 ;out_alarm1



out_yes_alarm1:
inc r0
STS 0x72,r0
clr r0
STS 0x66,r0 ;


ldi tmp,0xff
STS 0x67,tmp;разрешим работе под меню



yes_alarm1_2:


LDS r1,0x9b  ;считываем какой будильник коректить

ldi tmp,0x01
cp r1,tmp
breq c_arm1
ldi tmp,0x02
cp r1,tmp
breq c_arm2
ldi tmp,0x03
cp r1,tmp
breq c_arm3
rjmp out2_alarm1

c_arm1:
LDS r8,0x9c
LDS r9,0x9d
rjmp ok_c_arm


c_arm2:
LDS r8,0x9e
LDS r9,0x9f
rjmp ok_c_arm

c_arm3:
LDS r8,0xa0
LDS r9,0xa1

ok_c_arm:

rcall time_correction    ; вызов процедуры корекции времени 
;входные параметры
;r8-значение минут
;r9-значение часов
LDS r1,0x9b  ;считываем какой будильник писать

ldi tmp,0x01
cp r1,tmp
breq w_arm1
ldi tmp,0x02
cp r1,tmp
breq w_arm2
ldi tmp,0x03
cp r1,tmp
breq w_arm3


w_arm1:
STS 0x9c,r8
STS 0x9d,r9
rjmp out2_alarm1

w_arm2:
STS 0x9e,r8
STS 0x9f,r9
rjmp out2_alarm1

w_arm3:
STS 0xa0,r8
STS 0xa1,r9
rjmp out2_alarm1


rjmp out2_alarm1

out_alarm1:

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x42 ;Б
ldi nomber,0x04 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x0C;E ;У
ldi nomber,0x05 ;номер разряда который нужно засветить.
rcall indicator

LDS r1,0x9b  ;считываем какой будильник cветить

ldi tmp,0x01
cp r1,tmp
breq l_arm1
ldi tmp,0x02
cp r1,tmp
breq l_arm2
ldi tmp,0x03
cp r1,tmp
breq l_arm3





l_arm1:

ldi digit,0xBE ;1
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator
rjmp out_arm_l

l_arm2:
ldi digit,0x83 ;2
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator
rjmp out_arm_l

l_arm3:
ldi digit,0x8A ;3
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator

out_arm_l:

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator


out2_alarm1:

clr tmp
STS 0x9b,tmp;
ret

















set_time:

LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xAA
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp no_set_time_ok ;нет
rjmp yes_set_time ;да



no_set_time_ok:
LDS  r0,0x67;считаем с ""регистра"" разрешения меню,т.е. вошли ли мы в меню
ldi tmp,0xFF
cpse tmp,r0 ;сравним-а вошли ли мы в меню??
rjmp out_set_time ;нет
                  ;да
rjmp yes_set_time2 







yes_set_time:
LDS  r0,0x72;считаем с ""регистра"" ok
ldi tmp,0x01
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp out_yes_set_time ;нет
  ;да
  clr tmp
STS 0x67,tmp;очищаем подменю,выходим
STS 0x72,tmp
STS 0x66,tmp
rjmp out_set_time



out_yes_set_time:
inc r0
STS 0x72,r0
clr r0
STS 0x66,r0 ;


ldi tmp,0xff
STS 0x67,tmp;разрешим работе под меню


yes_set_time2:



;Показуем текущее время и ничего не делаем
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт
;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4

LDS  r8,0x61;cчитываем значение минут
LDS  r9,0x62;cчитываем значение часов
rcall time_correction    ; вызов процедуры корекции времени 
;входные параметры
;r8-значение минут
;r9-значение часов

STS  0x61,r8;переписываем значение минут
STS  0x62,r9;переписываем значение часов
rjmp out2_set_time

out_set_time:

ldi digit,0xFF ;ничего не светим
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x0E ;У
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x61 ;С.
ldi nomber,0x02 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0x1E ;Ч
ldi nomber,0x04 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x12 ;A
ldi nomber,0x05 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x61 ;C
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x46 ;b
ldi nomber,0x07 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x77 ;I
ldi nomber,0x08 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator

out2_set_time:






sei ;разрешаем прерывания
reti ;выход из процедуры


time_correction:    ;процедура корекции времени 
;входные параметры
;r8-значение минут
;r9-значение часов

;ldi tmp,0xaa ;нажата ок?
;LDS  r1,0x66
;cpse r1,tmp
;rjmp work_tc; нет

;ldi tmp,0xaa ;разрешено подменю??
;LDS  r1,0x67
;cpse r1,tmp
;rjmp out_tc; нет
;clr tmp    ;да
;STS 0x66,tmp;очищаем ок
;STS 0x67,tmp;очищаем разрешение подменю
;STS 0x65,tmp;очищаем разрешение подменю
;rjmp out_tc

;work_tc:

ldi tmp,0xaa ;моргать минутами или часами???
LDS  r1,0x71
cpse r1,tmp
rjmp m_set_time; часами
      ;мин -выполняем следующую команду
LDS  r1,0x70 ;cчитаем что у нас там
ldi tmp,0x01
cpse r1,tmp
 rjmp h_set_time     ;зажигать цифры не нужно

 m_set_time:  ;cветим не моргая


mov  r16,r8 ;считываем счетчик минут
clr r17; неможет быть значения старшего байта-всего то 60мин может быть,а не 255.
rcall bsd;преобразовуем к двоечно дисятичному виду




;поехали выводить цифирки на экран
 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
rcall four_lsr_r2

rcall znakogen  ;вызываем дух знакогенератора
ldi nomber,0x08 ;светим 1й разряд
rcall indicator ;посылаем в дисплей

mov r2,r17
rcall four_lsr_r2

rcall znakogen 
ldi nomber,0x07 ;светим 2й разряд
rcall indicator

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator



ldi tmp,0xbb ;моргать минутами или часами???
LDS  r1,0x71
cpse r1,tmp
rjmp h_set_time; минутами
      ;часами -выполняем следующую команду
LDS  r1,0x70 ;cчитаем что у нас там
ldi tmp,0x01
cpse r1,tmp
 rjmp out_tc      ;зажигать цифры не нужно


 h_set_time:

 ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator

mov r16,r9; считываем часы
clr r17 ;неможет быть значения старшего байта-всего то 60мин может быть,а не 255.
rcall bsd

mov r2,r17
swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
rcall four_lsr_r2

rcall znakogen  ;вызываем омена(а вы попробуйте обзовите так процедуру-фиг работает)
ldi nomber,0x06 ;светим 3й разряд
rcall indicator ;посылаем в дисплей

mov r2,r17
rcall four_lsr_r2

rcall znakogen 
ldi nomber,0x05 ;светим 4й разряд
rcall indicator


ldi digit,0xFD ;светим точку
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xFF ;ничего не светим
ldi nomber,0x03 ;номер разряда который нужно засветить.
rcall indicator



ldi tmp,0xDD ;нажата ли кнопка +(UP)???
LDS  r1,0x66;считали с регистра кнопок
cpse r1,tmp
rjmp down_set_time; нет не нажата,выйдем
      ;да нажата!

ldi tmp,0xAA ;че выставлять то?? минуты,часы?
LDS  r1,0x71;считали с регистра чем мы "моргали"
cpse r1,tmp
rjmp hour_set; моргали часами
      ;моргали минутами

mov  r1,r8 ;cчитаем что у нас там в минутах?
ldi tmp,0x3B;60
cpse r1,tmp
rjmp good_min
clr r1
rjmp bad_min
good_min:
inc r1       ;+1
bad_min:
mov r8,r1  ;отправили обратно в минуты
clr r1;
STS 0x66,r1; стерли нажатие кнопки
rjmp out_tc     ;вышли в конец процедуры


 hour_set:  ;
mov  r1,r9 ;cчитаем что у нас там в часах?
ldi tmp,0x17;23
cpse r1,tmp
rjmp good_hour
clr r1
rjmp bad_hour
good_hour:

inc r1       ;+1 к часам
bad_hour:
mov r9,r1  ;отправили обратно в часы
clr r1;
STS 0x66,r1; стерли нажатие кнопки
rjmp out_tc      ;вышли в конец процедуры


down_set_time: 

ldi tmp,0xEE ;нажата ли кнопка -(DOWN)???
LDS  r1,0x66;считали с регистра кнопок
cpse r1,tmp
rjmp out_tc;out2_set_time; нет не нажата,выйдем
      ;да нажата!

ldi tmp,0xAA ;че выставлять то?? минуты,часы?
LDS  r1,0x71;считали с регистра чем мы "моргали"
cpse r1,tmp
rjmp dec_hour_set; моргали часами
      ;моргали минутами

mov  r1,r8 ;cчитаем что у нас там в минутах?
clr tmp 
cpse r1,tmp; не  0 ли у нас там???
rjmp d_good_min ;нет
clr r1;
STS 0x66,r1; ДА! ;стерли нажатие кнопки
rjmp out_tc  ;вышли ничего не делая
d_good_min:
dec r1       ;-1
mov r8,r1  ;отправили обратно в минуты
clr r1;
STS 0x66,r1; стерли нажатие кнопки
rjmp out_tc     ;вышли в конец процедуры


 dec_hour_set:  ;
mov  r1,r9 ;cчитаем что у нас там в часах?
clr tmp 
cpse r1,tmp; не  0 ли у нас там???
rjmp d_good_hour ;нет
clr r1;
STS 0x66,r1; ДА! ;стерли нажатие кнопки
rjmp out_tc  ;вышли ничего не делая

d_good_hour:
dec r1       ;-1 к часам
mov r9,r1  ;отправили обратно в часы
clr r1;
STS 0x66,r1; стерли нажатие кнопки


out_tc:


ret





autoscan:

;ldi tmp,0x40  ;запрещаем прерывание от TC0
;out timsk,tmp   
;sei





LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xAA
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp no_autoscan_ok ;нет
rjmp yes_autoscan_ok ;да



no_autoscan_ok:
LDS  r0,0x67;считаем с ""регистра"" разрешения меню,т.е. вошли ли мы в меню
ldi tmp,0xFF
cpse tmp,r0 ;сравним-а вошли ли мы в меню??
rjmp light_autoscan ;нет
                  ;да
rjmp yes_autoscan2 




yes_autoscan_ok:
LDS  r0,0x72;считаем с ""регистра"" ok
ldi tmp,0x01
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp out_yes_autoscan ;нет
  ;да               ;**************************ВЫХОД!!!
  clr tmp
STS 0x67,tmp;очищаем подменю
STS 0x72,tmp;oчищаем регистр нажатия ок
STS 0x74,tmp;очистка запуска автоскана
clr r0; устанавливаем в нуль номера ячейки
STS 0x76,r0; 
STS 0x66,r0
ldi tmp,0xe7  ;  Используем вывод ADS7
out admux,tmp ; 
rjmp out2_autoscan



out_yes_autoscan:
inc r0
STS 0x72,r0 ;+1 в счетчик ок
clr r0      ; 
STS 0x66,r0 ;очистим нажатие кнопки "ок"

ldi tmp,0xff;
STS 0x67,tmp;разрешим работе под меню


yes_autoscan2:

LDS  r0,0x74;считаем с ""регистра"" шагов
ldi tmp,0x00
cpse tmp,r0 ;сравним-а запущен ли автоскан?
rjmp doing_autoscan;нет
rjmp go_autoscan ;да

  ;да

go_autoscan:

ser tmp
STS 0x6A,tmp ;светим частоту в процедуре fr_light

clr r4
inc r4
STS 0x74,r4

ldi tmp,0xe6  ; Используем вывод ADS6
out admux,tmp ; 


;ldi tmp,0x0b
;out acsr,tmp; инициализируем аналоговый компаратор

;LDI	R16,(0<<ACD)|(0<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
;	OUT	ACSR,R16	; Забрасываем в регистр



;IN	R16,SFIOR	; Достаем SFIOR
;	ORI	R16,(0<<ACME)	; Выставялем в нем бит ACME
;	OUT	SFIOR,R16

	

ldi tmp,0xb6 ;   Задаем значение нижнеей частоты 88.00мгц+10.70=9870/5=1974 ;7B6 
STS 0x63,tmp ;

ldi tmp,0x07 ;
STS 0x64,tmp ;

ldi tmp,0x01 ;
STS 0x74,tmp ;

doing_autoscan:


LDS r0,0x75 ;подгрузили напряжение
low_v:
ldi tmp,0x03
mov r12,tmp
ldi tmp,0x20
mov r11,tmp
;процедура приведения 12 разрядного числа к 8 разрядному;
ldi tmp,0xff
mov r13,tmp

low_v2:
dec r13
breq low_v_out

clr r10
dec r11
sbc r12,r10


ldi tmp,0x06
kk:
lsl r11
rol r12
dec tmp
brne kk

cp r12,r0
brne low_v2


ldi tmp,0xff
STS 0x73,tmp ;наверно станцию захватили))

low_v_out:






LDS  r0,0x73;считаем с ""регистра"" aвтоскана
ldi tmp,0xFF
cpse tmp,r0 ;настроились ли мы на станцию?
rjmp inc_autoscan            ;нет  
rjmp station_ok			;да

inc_autoscan :
LDS r3,0x70 ; используем моргалку
ldi tmp,0x01
cpse tmp,r3 
rjmp out22_autoscan
LDS r0,0x63 
LDS r1,0x64

ldi tmp,0x09;
cp tmp,r1   ;сравниваем старший байт делителя-не превысили ли мы 108мгц
brne ok_fr_inc_sc 
ldi tmp,0x46 ;сравниваем младший байт делителя
cp tmp,r0
brne ok_fr_inc_sc
rjmp fr_out_bad
ok_fr_inc_sc: 
clr r4
clr r5
inc r4
add r0,r4    ;+50кгц
adc r1,r5
STS 0x63,r0
STS 0x64,r1

rcall lm7001
fr_out_bad:
rcall fr_light;
clr r3
sts 0x70,r3
rjmp v4bm
out22_autoscan:
rcall fr_light
v4bm:
clr r17
LDS  r16,0x76
rcall bsd

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2
 rcall znakogen  ;вызываем омена
ldi nomber,0x03 ;светим 1й разряд
rcall indicator ;посылаем в дисплей
rcall fack_zero  ;гашение нуля
mov r2,r17
rcall four_lsr_r2
rcall znakogen 
ldi nomber,0x02 ;светим 2й разряд
rcall indicator

ldi digit,0x13 ;P
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator



rjmp out2_autoscan
  

station_ok:

;LDI	R16,(1<<ACD)|(0<<ACBG)|(0<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
;OUT	ACSR,R16	; Вырубили компаратор

rcall fr_light

ldi digit,0xFF ;нисветим ничем
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0x61 ;C
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xFF ;нисветим ничем
ldi nomber,0x02 ;номер разряда который нужно засветить.
rcall indicator

clr r17
LDS  r16,0x76
rcall bsd

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2
 rcall znakogen  ;вызываем омена
ldi nomber,0x03 ;светим 1й разряд
rcall indicator ;посылаем в дисплей

rcall fack_zero
mov r2,r17
rcall four_lsr_r2
rcall znakogen 
ldi nomber,0x02 ;светим 2й разряд
rcall indicator



LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xDD
cpse tmp,r0 ;сравним-а нажата ли кнопка up у нас?
rjmp write_autoscan ;нет
                 ;да
clr r0
STS 0x73,r0 ;cброс,сканим дальше
STS 0x66,r0;cброс нажатой кнопки
;LDI	R16,(0<<ACD)|(0<<ACBG)|(1<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
;	OUT	ACSR,R16	; Врубили компаратор
	rjmp inc_autoscan 


write_autoscan:
LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xCC
cpse tmp,r0 ;сравним-а нажата ли кнопка right у нас?
rjmp out2_autoscan ;нет
 ;Да
LDS  r0,0x76
ldi tmp,0x1E 
cp tmp,r0
breq write_all_autoscan      ;записали ли мы 30 канал? -да
           ;нет

    ;EEWrite:
    ;	R16   младший байт адреса ячейки
	;	R17   старший байт адреса ячейки
	;   R21 данные которые нужно записать



ldi tmp,0x02
mul r0,tmp;умножаем на 2

clr r17
mov r16,r0
LDS r21,0x63 ;младший бит делителя 
rcall EEWrite ;записуем в EEPROM
inc r0
mov r16,r0
LDS r21,0x64 ;cтарший бит делителя
rcall EEWrite

ldi digit,0x8a ;З.
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator

ldi tmp,0xff
ux:rcall pause2
dec tmp
brne ux

LDS  r0,0x76;+1
inc r0
STS 0x76,r0; отправили в счетчик записаных каналов
clr r0
;STS 0x73,r0 ;cброс,сканим дальше
STS 0x66,r0;очистка нажатия кнопки
rjmp out2_autoscan



write_all_autoscan:
clr r0; устанавливаем в нуль номер ячейки
STS 0x76,r0; 
STS 0x65,r0; ;выходим с меню
STS 0x73,r0; очистили переменную захвата станции
STS 0x67,r0; запретили процедуру подменю
STS 0x66,r0;очистка кнопок
STS 0x74,r0;очистка запуска автоскана
;LDI	R16,(1<<ACD)|(0<<ACBG)|(0<<ACIE)|(1<<ACIS1)|(1<<ACIS0)
;OUT	ACSR,R16	; Вырубили компаратор

rcall pause2
rcall pause2


rjmp out2_autoscan


light_autoscan:

ldi digit,0xFF ;ничего не светим
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x4A ;S
ldi nomber,0x04 ;номер разряда который нужно засветить.
rcall indicator




ldi digit,0x63 ;С.
ldi nomber,0x05 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0x12 ;A
ldi nomber,0x06 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xD6 ;n
ldi nomber,0x07 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xFF ;ничего не светим
ldi nomber,0x08 ;номер разряда который нужно засветить.
rcall indicator


out2_autoscan:

ldi tmp,0x40  ;запрещаем прерывание от TC0
out timsk,tmp 
sei ;разрешаем прерывания
reti ;выход из процедуры


EEWrite:
    ;	R16   младший байт адреса ячейки
	;	R17   старший байт адреса ячейки
	;   R21 данные которые нужно записать
    SBIC	EECR,EEWE		; Ждем готовности памяти к записи. Крутимся в цикле
	RJMP	EEWrite 		; до тех пор пока не очистится флаг EEWE
 
	CLI				; Затем запрещаем прерывания.
	OUT 	EEARL,R16 		; Загружаем адрес нужной ячейки
	OUT 	EEARH,R17  		; старший и младший байт адреса
	OUT 	EEDR,R21 		; и сами данные, которые нам нужно загрузить
 
	SBI 	EECR,EEMWE		; взводим предохранитель
	SBI 	EECR,EEWE		; записываем байт
 
	;SEI 				; разрешаем прерывания
	RET 				; возврат из процедуры
 
 EERead:	
	SBIC 	EECR,EEWE		; Ждем пока будет завершена прошлая запись.
	RJMP	EERead			; также крутимся в цикле.
	OUT 	EEARL, R16		; загружаем адрес нужной ячейки
	OUT  	EEARH, R17 		; его старшие и младшие байты
	SBI 	EECR,EERE 		; Выставляем бит чтения
	IN 	R21, EEDR 		; Забираем из регистра данных результат
	RET



ch_co:    ;редактор каналов  

LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xAA
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp no_ch_co_ok ;нет
rjmp yes_ch_co_ok ;да



no_ch_co_ok:
LDS  r0,0x67;считаем с ""регистра"" разрешения меню,т.е. вошли ли мы в подменю
ldi tmp,0xFF
cpse tmp,r0 ;сравним-а вошли ли мы в меню??
rjmp light_ch_co ;нет
                  ;да
rjmp go_ch_co




yes_ch_co_ok:  ;нажата ли кнопка ок

LDS  r0,0x72;считаем с ""регистра"" ok
ldi tmp,0x00 ;0 раз
cp r0,tmp
breq init_ch_co ;походу просто вошли в меню
ldi tmp,0x02
cp r0,tmp
breq two_ok_ch_co
LDS  r0,0x66;считаем с ""регистра"" кнопок
ldi tmp,0xAA
cpse tmp,r0 ;сравним-а нажата ли кнопка ок у нас?
rjmp go_ch_co ;нет
;да!!!!
LDS r0,0x72
inc r0
STS 0x72,r0 ;+1 в счетчик ок
rjmp yes_ch_co_ok ;отправим на суд-а че делать со вторым нажатием???



;очевидно ок был нажата раз для входа в меню,зничит инициализация сделана

rjmp go_ch_co

two_ok_ch_co:

LDS r0,0x6C    ;была ли корекция частоты???
ldi tmp,0x01   ;
cp tmp,r0
breq  write_ch_co          ;Да
;Нет,походу мы хотим выйти вобще из меню
clr tmp
;STS 0x67,tmp;очищаем подменю
STS 0x72,tmp;oчищаем регистр нажатия ок
clr r0; устанавливаем в нуль номера ячейки
STS 0x76,r0; 
STS 0x67,r0;запрещаем работу подменю
STS 0x6C,r0
STS 0x66,r0
sei   
reti   

write_ch_co:
cli

ldi digit,0x8a ;З.
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator

;ldi digit,0xFF ;А.
;ldi nomber,0x02 ;номер разряда который нужно засветить.
;rcall indicator


LDS  r16,0x76 ;загружаем номер ячейки
Ldi r17,0x02 ;2
MUL r16,r17  ;умножим на 2
mov r16,r0
clr r17 ;cтарший бит
LDS r21,0x63 ;младший бит делителя 
rcall EEWrite
inc r16

LDS r21,0x64 ;старший бит делителя 
rcall EEWrite

ldi tmp,0x01 ;
STS 0x72,tmp  ;типо мы первый раз в меню
clr tmp
STS 0x6c,tmp; сброс "коррекции"
clr r0      ; 
STS 0x66,r0 ;очистим нажатие кнопки "ок"


rcall pause2


rjmp go_ch_co



init_ch_co:
LDS r0,0x72
inc r0
STS 0x72,r0 ;+1 в счетчик ок
clr r0      ; 
STS 0x66,r0 ;очистим нажатие кнопки "ок"

ldi tmp,0xff;
STS 0x67,tmp;разрешим работе под меню



clr tmp
STS 0x76,tmp  ;ставим в нуль счетчик ячейки




go_ch_co:


LDS  r16,0x6c ;считываем была ли корекция частоты???
ldi tmp,0x01
cp tmp,r16
breq ok_corect


LDS  r16,0x76 ;
Ldi r17,0x02 ;2
MUL r16,r17  ;умножим на 2
mov r16,r0
clr r17 ;cтарший бит

inc r16
rcall EERead

ser r17
cp r17,r21
brne ok_fr
ldi tmp,0xb6
STS 0x63,tmp
ldi tmp,0x07 ;записываем частоту по умолчанию 88мгц
STS 0x64,tmp
rjmp ok_corect

ok_fr:        ;не нули в ячейки,считываем и загружаем
dec r16
clr r17    
rcall EERead
STS 0x63,r21
inc r16
rcall EERead
STS 0x64,r21


ok_corect: ;была корекция частоты просто светим


ser tmp
STS 0x6A,tmp ;разрешаем вывод на дисплей  в процедуре fr_light

rcall fr_light
rcall lm7001

 
clr r17   ;
LDS  r16,0x76  ;
rcall bsd      ; покажем номер ячейки в которой сидим

;.def    tBCD0   =r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1   =r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2   =r19            ;BCD значение, цифра 4
;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт

 mov r2,r17
 swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 rcall four_lsr_r2
 rcall znakogen  ;вызываем омена
ldi nomber,0x03 ;светим 1й разряд
rcall indicator ;посылаем в дисплей

rcall fack_zero
mov r2,r17
rcall four_lsr_r2
rcall znakogen 
ldi nomber,0x02 ;светим 2й разряд
rcall indicator

ldi digit,0x13 ;P
ldi nomber,0x01 ;номер разряда который нужно засветить.
rcall indicator


sei
reti

light_ch_co:


ldi digit,0xFF ;С.
ldi nomber,0x04 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0x63 ;С.
ldi nomber,0x04 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0x16 ;Н
ldi nomber,0x05 ;номер разряда который нужно засветить.
rcall indicator


ldi digit,0xfd ;точка
ldi nomber,0x05 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x63 ;С.
ldi nomber,0x07 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0x22 ;O
ldi nomber,0x08 ;номер разряда который нужно засветить.
rcall indicator

ldi digit,0xfd ;точка
ldi nomber,0x08 ;номер разряда который нужно засветить.
rcall indicator

sei
reti





pause2:
ldi tmp,0xff
zzz:dec tmp
brne zzz
ret









 






menu:
clr tmp;
STS 0x66,tmp;cотрем с регистра кнопок,что бы оно само не нажало "ок"
STS 0x67,tmp;cотрем с регистра разрешения подменю
STS 0x9b,tmp;сoтрем номер будильника

LDS  tmp,0x65;считаем с ""регистра"" меню,вдруг там что то есть 
ldi r29,0x07
cpse tmp,r29 ;сравним-а нажимали ли мы кнопку меню 7 раз??
rjmp plus_menu  ;нет
clr tmp  ;да
STS 0x65,tmp;запишем в регистр нули.
rjmp out_menu ;выйдем от греха подальше

plus_menu:
inc tmp
STS 0x65,tmp;запишем в ""регистр""
out_menu:
ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость


ret


ok_button:
ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость
ldi tmp,0xAA;
STS 0x66,tmp; отправили в SDRAM
ret

left_button:
ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость

clr r0
STS 0x6b,r0; сбрасываем бегущую строку

clr tmp
STS 0x80,tmp ;cбрасываем бегущую строку


ldi tmp,0xBB;
STS 0x66,tmp; отправили в SDRAM
STS 0x71,tmp ;выбираем часы

LDS r0,0x76
clr r2
cp r0,r2
breq  o_l_b
dec r0
STS 0x76,r0

clr r0
STS 0x6c,r0 ;Очищаем вдруг нажата + -

o_l_b:
ret

right_button:

ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость

clr r0
STS 0x6b,r0; сбрасываем бегущую строку

clr tmp
STS 0x80,tmp ;cбрасываем бегущую строку


ldi tmp,0xCC;
STS 0x66,tmp; отправили в SDRAM
ldi tmp,0xAA
STS 0x71,tmp ;выбираем мин

LDS r0,0x76
ldi tmp,0x1E ;30
cp tmp,r0 ;достигли 30 канала?
breq clr_ch
inc r0
STS 0x76,r0
clr r0
STS 0x6c,r0 ;Очищаем вдруг нажали + -
rjmp o_inc_ch

clr_ch:
clr r0
STS 0x76,r0 ;Очищаем память каналов
STS 0x6c,r0 ;очищаем вдруг нажали + -


o_inc_ch:
ret

up_button:
ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость

LDS r0,0x65
ldi tmp,0x06
cp tmp,r0
brne no_ch_co_v
clr r12
ldi tmp,0x01
mov r9,tmp
LDS r10,0x63
LDS r11,0x64
add r10,r9
adc r11,r12

ldi tmp,0x09
cp tmp,r11
brne ok_fr_up
ldi tmp,0x47
cp tmp,r10
breq no_ch_co_v

ok_fr_up:
STS 0x63,r10
STS 0x64,r11
ldi tmp,0x03
STS 0x6e,tmp ;ставим повышенную скорость
;rcall lm7001
ldi tmp,0x01
STS 0x6c,tmp; была корекция канала!
no_ch_co_v:

ldi tmp,0xDD;
STS 0x66,tmp; отправили в SDRAM

ret

down_button:
hiol:

ldi tmp,0x19;21
STS 0x6e,tmp ;ставим нормальную скорость

LDS r0,0x65
ldi tmp,0x06
cp tmp,r0
brne no_ch_co_dn
clr r12
ldi tmp,0x01
mov r9,tmp
LDS r10,0x63
LDS r11,0x64
sub r10,r9
sbc r11,r12
;adc r11,r13

ldi tmp,0xb5 ; младший байт минимального значения коэфф деления
cp r10,tmp
brne ok_d_f
ldi tmp,0x07 ; cтарший байт минимального значения коэфф деления
cp r11,tmp
breq no_ch_co_dn

ok_d_f:
STS 0x63,r10
STS 0x64,r11
;rcall lm7001
ldi tmp,0x05
STS 0x6e,tmp ;ставим повышенную скорость

ldi tmp,0x01
STS 0x6c,tmp; была корекция канала!
no_ch_co_dn:

ldi tmp,0xEE;
STS 0x66,tmp; отправили в SDRAM
ret

znakogen:
;Знакогенератор 


ldi tmp,0x01 
sub tmp,r2
breq q1
ldi tmp,0x02 
sub tmp,r2
breq q2
ldi tmp,0x03 
sub tmp,r2
breq q3
ldi tmp,0x04 
sub tmp,r2
breq q4
ldi tmp,0x05 
sub tmp,r2
breq q5
ldi tmp,0x06 
sub tmp,r2
breq q6
ldi tmp,0x07 
sub tmp,r2
breq dz7
ldi tmp,0x08 
sub tmp,r2
breq q8
ldi tmp,0x09 
sub tmp,r2
breq q9
ldi tmp,0x00 
sub tmp,r2
breq q0
ldi tmp,0x0A 
sub tmp,r2
breq q10
ldi tmp,0x0B 
sub tmp,r2
breq q11
ldi tmp,0x0C 
sub tmp,r2
breq q12
rjmp whith_point



rjmp q13

q1:
ldi digit,0xBE ;Знакогенератор "1" для общего анода
ret

q2:
ldi digit,0x83 ;Знакогенератор "2" для общего анода
ret

q3:
ldi digit,0x8a ;Знакогенератор "3" для общего анода
ret

q4:
ldi digit,0x1E ;Знакогенератор "4" для общего анода
ret

q5:
ldi digit,0x4a ;Знакогенератор "5" для общего анода
ret

q6:
ldi digit,0x42 ;Знакогенератор "6" для общего анода
ret

dz7:
ldi digit,0xBA ;Знакогенератор "7" для общего анода
ret

q8:
ldi digit,0x02 ;Знакогенератор "8" для общего анода
ret

q9:
ldi digit,0x0A ;Знакогенератор "9" для общего анода
ret

q0:
ldi digit,0x22 ;Знакогенератор "0" для общего анода
ret

q10:
ldi digit,0x63 ;Знакогенератор "С" для общего анода
ret

q11:
ldi digit,0x1b ;Знакогенератор "символ градуса" для общего анода
ret

q12:
ldi digit,0xfd;b ;Знакогенератор "точка" для общего анода
ret

q13:
ldi digit,0xff ;Знакогенератор "ничего не светит" для общего анода
ret

;**************цифры с точкой
A1:
ldi digit,0xBC ;Знакогенератор c точкой "1" для общего анода
ret

A2:
ldi digit,0x81 ;Знакогенератор "2 " для общего анода
ret

A3:
ldi digit,0x88 ;Знакогенератор "3" для общего анода
ret

A4:
ldi digit,0x1C ;Знакогенератор "4" для общего анода
ret

A5:
ldi digit,0x48 ;Знакогенератор "5" для общего анода
ret

A6:
ldi digit,0x40 ;Знакогенератор "6" для общего анода
ret

A7:
ldi digit,0xB8 ;Знакогенератор "7" для общего анода
ret

A8:
ldi digit,0x00 ;Знакогенератор "8" для общего анода
ret

A9:
ldi digit,0x08 ;Знакогенератор "9" для общего анода
ret

A0:
ldi digit,0x20 ;Знакогенератор "0" для общего анода
ret


whith_point:
ldi tmp,0xA1 
sub tmp,r2
breq A1
ldi tmp,0xA2 
sub tmp,r2
breq A2
ldi tmp,0xA3 
sub tmp,r2
breq A3
ldi tmp,0xA4 
sub tmp,r2
breq A4
ldi tmp,0xA5 
sub tmp,r2
breq A5
ldi tmp,0xA6 
sub tmp,r2
breq A6
ldi tmp,0xA7 
sub tmp,r2
breq A7
ldi tmp,0xA8 
sub tmp,r2
breq A8
ldi tmp,0xA9 
sub tmp,r2
breq A9
ldi tmp,0xA0 
sub tmp,r2
breq A0
rjmp q13









indicator:

clr r1;                ;перевод двоичного значения в разряды.
sec ;1>C
cv:
rol r1         ;сдвигаем в лево
dec nomber
brne cv
;mov nomber,r1 ;сохраняем переведенное значение


;процедура вывода данных на дисплей
rcall razr  ;8
rcall dig   ;f
rcall razr  ;7 
rcall dig   ;b
rcall razr  ;6
rcall dig   ;g
rcall razr  ;5
rcall dig   ;d
rcall razr  ;4
rcall dig   ;e
rcall dig   ;a
rcall razr  ;3
rcall dig   ;h
rcall razr  ;2
rcall dig   ;c
rcall razr  ;1
 



rjmp outofspace

razr:
lsl r1   ;сдвигаем регистр в лево
brcs bb        ;cмотрим что у нас вывалилось с регистра
	          ;вывалился нуль. 
cbi portc,0   ;ставим нуль на лапе DATA
sbi portc,1  ;стробируем 1
cbi portc,1  ;стробируем 0
rjmp bc       ;надо прыгнуть иначе пойдем выполнять следующуу команду
bb:            ;вывалилась 1
sbi portc,0   ;ставим единицу на лапе DATA
sbi portc,1  ;стробируем 1
cbi portc,1  ;стробируем 0   
bc:	

ldi r27,150
yycc: ldi r28,2
yybb: dec r28
brne yybb
dec r27
brne yycc

ret



dig:
lsl digit    ;сдвигаем регистр в лево
brcs a        ;cмотрим что у нас вывалилось с регистра
	          ;вывалился нуль. 
cbi portc,0   ;ставим нуль на лапе DATA
sbi portc,1  ;стробируем 1
cbi portc,1  ;стробируем 0
rjmp ax       ;надо прыгнуть иначе пойдем выполнять следующуу команду
a:            ;вывалилась 1
sbi portc,0   ;ставим единицу на лапе DATA
sbi portc,1  ;стробируем 1
cbi portc,1  ;стробируем 0   
ax:	
ret

outofspace:
sbi portc,2  ;защелка 1
cbi portc,2  ;защелка 0



ret




 bsd:


;mov r16,r10;r10
;mov r17,r11
;***** Преобразование двоичного числа в десятичное 

;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт
;.def    tBCD0=r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1=r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2=r19            ;BCD значение, цифра 4
;Примечание: Переменные fbinH и tBCD0 должны размещаться в одном
;регистре.

;***** Код

bin16BCD5:
        ldi     tBCD2, -1
bin16BCD5_loop_1:
        inc     tBCD2
        subi    fbinL, low(10000)
        sbci    fbinH, high(10000)
        brsh    bin16BCD5_loop_1
        subi    fbinL, low(-10000)
        sbci    fbinH, high(-10000)
        ldi     tBCD1, -0x11
bin16BCD5_loop_2:
        subi    tBCD1, -0x10
        subi    fbinL, low(1000)
        sbci    fbinH, high(1000)
        brsh bin16BCD5_loop_2
        subi    fbinL, low(-1000)
        sbci    fbinH, high(-1000)
bin16BCD5_loop_3:
        inc     tBCD1
        subi    fbinL, low(100)
        sbci    fbinH, high(100)
        brsh bin16BCD5_loop_3
        subi    fbinL, -100
        ldi     tBCD0, -0x10
bin16BCD5_loop_4:
        subi    tBCD0, -0x10
        subi    fbinL, 10
        brsh bin16BCD5_loop_4
        subi    fbinL, -10
        add     tBCD0, fbinL

		
       ret


	







lm7001:

LDS r5,0x63 
LDS r6,0x64 


sbi portc,3   ;ставим единицу на лапе CE


ldi tmp,0x08 
rcall zm7001

mov r5,r6
ldi tmp,0x08
rcall zm7001


ldi tmp,0xc8
mov r5,tmp

ldi tmp,0x08
rcall zm7001

cbi portc,3  ;cтавим 0 на лапе CE


ret 

zm7001:
xa:

lsr r5   ;сдвигаем регистр в право
brcs xx        ;cмотрим что у нас вывалилось с регистра
	          ;вывалился нуль. 
cbi portc,4;0   ;ставим нуль на лапе DATA
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sbi portc,5;1  ;стробируем 1 выв CLC
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi portc,5;1  ;стробируем 0
rjmp xc       ;надо прыгнуть иначе пойдем выполнять следующуу команду
xx:            ;вывалилась 1
sbi portc,4;0   ;ставим единицу на лапе DATA
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
sbi portc,5;1  ;стробируем 1
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi portc,5;1  ;стробируем 0   
nop
nop
nop
nop
nop
nop
nop
nop
nop
xc:	
dec tmp
brne xa

ret


fack_zero: ;процедура гашения нуля

;.def    fbinL=r16            ;двоичное значение, младший байт
;.def    fbinH=r17            ;двоичное значение, старший байт
;.def    tBCD0=r17            ;BCD значение, цифры 1 и 0
;.def    tBCD1=r18            ;BCD значение, цифры 3 и 2
;.def    tBCD2=r19            ;BCD значение, цифра 4

; mov r2,r17
 ;swap r2 ;  убиваем значение 1й цифры,оставляя значение 0й цифры
 ;rcall four_lsr_r2

 ;mov r2,r17
;rcall four_lsr_r2
;STS 0x85,r2 ; записываем 2й разряд

mov r2,r17
rcall four_lsr_r2
clr tmp
cpse r2,tmp
rjmp no_fuck_r17
ldi r17,0xFF ;гасим 2 разряд
no_fuck_r17:
clr tmp
cp r19,tmp
brne out_fack
ldi r19,0xFF ;гасим 5 разряд
out_fack:
ret







;sei
;pop r23
;out sreg,r23
;pop r23
;reti

.eseg








