

.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m128def.inc"
.def	t1	=r16; ТЕМП ВСЯКОЙ ВСЯЧИНЫ
.def	t2  =r17; НОМЕР ВЫЗЫВАЙМОЙ ПОДПРОГРАММЫ
.def	t4	=r18; НОМЕР РАЗРЯДА ИНДИКАЦИИ
.def 	temp	=r19;
.def	temp1	=r20;
.def	temp2	=r21;
.def 	temp4	=r22;
.def 	temp5	=r23;
.equ	Interval	=256-50; коэфицент деления таймера
.equ	del2	=$2; режим преддилителя таймера ( /8)
.equ	del3	=1;не понятно зачем нужнай задержка)) вообщем её нет
;---------------------------------------------
.dseg  
digit:		.byte 8
disp:		.byte 8
dispdec:	.byte 8
key:		.byte 8
;------------------------------------------
digit1:		.byte 8
disp1:		.byte 8
dispdec1:	.byte 8
key1:		.byte 8
;-------------------------------------------
BufRd1:		.byte 8
BufRd2:		.byte 8
BufRd3:		.byte 8
BufWr1:		.byte 8
BufWr2:		.byte 8
BufWr3:		.byte 8
;---------------------------------------------
delay1:		.byte 8
delay2:		.byte 8
delay3:		.byte 8
delay4:		.byte 8
delay5:		.byte 8
delay6:		.byte 8
delay7:		.byte 8
delay8:		.byte 8
delay9:		.byte 8
delay10:		.byte 8
;------------------------------------------------
te1:		.byte 8
te2:		.byte 8
te3:		.byte 8
te4:		.byte 8
te5:		.byte 8
te6:		.byte 8
te7:		.byte 8
te8:		.byte 8
te9:		.byte 8
te10:		.byte 8
.cseg
.org $0
	jmp RESET ; Reset Handler
.org $20
	jmp TIM0_OVF ; Timer0 Overflow Handler
	;комманды инициализации
RESET:
	ldi Temp,1 
	ldi Temp1,0
	clr t2
	clr r0
	clr	t4
	clr	r27
	ldi	t1,HIGH(RAMEND)	;инициализация стека
	out	SPH,t1		
	ldi	t1,LOW(RAMEND)	
	out	SPL,t1
	ldi yH,high(digit*2)
	ldi yL,low(digit*2)
;---------------------------------------------------------------
;заполняем память числами от 0 до 8
go:
	st	y,t2
	clr t1
	add	yl,temp
	adc	yh,t1
	inc t2
	cpi	t2,9
	brne go
;настраиваем порты навывод	
	ser t1	
	out	DDRD,t1		
	out DDRB,t1
;---------------------------------------------------------
	ldi yH,high(digit*2)
	ldi yL,low(digit*2)
	ldi	t2,$0
;------------------------------------------------------------------
;инициализация таймера		
	ldi	t1,Interval
	out	TCNT0,t1
	ldi t1,del2
	out	TCCR0,t1
	ldi	t1,1<<TOIE0
	out	TIMSK,t1			
	sei
;----------------------------------------------------------------
start:
	nop
	nop	
	ldi	t1,(1<<SE)+(0<<SM0)+(0<<SM1)+(0<<SM2) ;микроконтроллер
	out	MCUCR,t1		;в Idle mode при переходе
	sleep				; в режим sleep
st1:
	nop
	jmp start

;обработка прерывания Таймера0	
TIM0_OVF:

	ldi t1,$0
	out	TCCR0,t1
	ldi	t1,0<<TOIE0
	out	TIMSK,t1
;остановка таймера
;--------------------------------------------------------------	
;еще один делитель непзнаю покачто зачем)
	inc temp5
	cpi	temp5,del3
	brne st3
	ldi temp5,$0
;------------------------------------------------
;проверяем номер вызываймой подпрограммы	
;если больше 20 то уставливаем счётчик подпрограм на 0
	cpi t2,$21
	brne st2
	ldi t2,$0
	call st2


;---------------------------------------------------------------------
st2:
	ldi	t1,Interval	;перезапуск таймера
	out	TCNT0,t1
	ldi t1,del2
	out	TCCR0,t1
	ldi	t1,1<<TOIE0
	out	TIMSK,t1
	sei
	call pprograms
	inc t2
	reti

st3:
	ldi	t1,Interval	;перезапуск таймера
	out	TCNT0,t1
	ldi t1,del2
	out	TCCR0,t1
	ldi	t1,1<<TOIE0
	out	TIMSK,t1
	sei
	reti

pprograms:
	cpi t2,0
	brne pprog1
	call LedDispDec
pprog1:	
	cpi t2,$1
	brne pprog2
	call LedDispDrv
pprog2:	
	cpi t2,$2
	brne pprog3
	call ZXb
pprog3:		
	cpi t2,$3
	brne pprog4
	call ZXb
pprog4:	
	cpi t2,$4
	brne pprog5
	call ZXb
pprog5:	
	cpi t2,$5
	brne pprog6
	call ZXb
pprog6:
	cpi t2,$5
	brne pprog7
	call ZXb
pprog7:
	cpi t2,$6
	brne pprog8
	call ZXb 
pprog8:	
	cpi t2,$7
	brne pprog9
	call ZXb
pprog9:	
	cpi t2,$8
	brne pprog10
	call ZXb
pprog10:		
	cpi t2,$10
	brne pprog11
	call ZXb
pprog11:	
	cpi t2,$12
	brne pprog12
	call ZXb
pprog12:
	cpi t2,$13
	brne pprog13
	call ZXb
pprog13:
	cpi t2,$14
	brne pprog14
	call ZXb
pprog14:
	cpi t2,$15
	brne pprog15
	call ZXb
pprog15:	
	cpi t2,$16
	brne pprog16
	call ZXb
pprog16:	
	cpi t2,$17
	brne pprog17
	call ZXb
pprog17:		
	cpi t2,$18
	brne pprog18
	call ZXb
pprog18:	
	cpi t2,$19
	brne pprog19
	call ZXb
pprog19:	
	cpi t2,$20
	brne pprog20
	call ZXb
pprog20:
	call ZXb			
	ret
LedDispDec:
	nop
	ret

LedDispDrv:
	nop  

;1---------------------------------------------------------------  
ZXa1:
	ldi	temp2,$0			;гасим индикатор
	out	PORTD,temp2

	cpi t4,$0				; щётчик разрядов
	brne ZXa2;
	inc	t4;
	ldd	temp4,y+0
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00000001		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;2---------------------------------------------------------------
ZXa2:
	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$1
	brne ZXa3
	inc	t4
	ldd	temp4,y+1
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00000010		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;3--------------------------------------------------------------- 
ZXa3:

	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$2
	brne ZXa4
	inc	t4
	ldd	temp4,y+2	 
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00000100		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;4---------------------------------------------------------------
ZXa4:

	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$3
	brne ZXa5
	inc	t4
	ldd	temp4,y+3
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00001000		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9									  	
;5---------------------------------------------------------------
ZXa5:

	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$4
	brne ZXa6
	inc	t4
	ldd	temp4,y+4
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00010000		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;6---------------------------------------------------------------
ZXa6:
	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$5
	brne ZXa7
	inc	t4
	ldd	temp4,y+5
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b00100000		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;7--------------------------------------------------------------- 
 ZXa7:
 	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$6
	brne ZXa8
	inc	t4
	ldd	temp4,y+6
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b01000000		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;8---------------------------------------------------------------
ZXa8:
	ldi	temp2,$0;или FF вообщем гасим индикатор
	out	PORTD,temp2
	cpi t4,$7
	brne ZXa9
	inc	t4
	ldd	temp4,y+7
	call decoder			;Вызваем декодер	;		
    out PortB,Temp2			;выводим знак на индикатор
	ldi	t1,0b10000000		;выбираем  нужный разряд     
    out PortD,t1		    ;выводим нужный раряд на индикатор        
	rjmp ZXa9
;---------------------------------------------------------------
	nop
ZXa9:
	cpi t4,$8
	brne ZXa10
	ldi	t4,$0
ZXa10:
	nop
	ret
ZXb:
	nop
	ret
decoder:
	cpi	temp4,0	
	brne dig1
	ldi	temp2,0b00111111
	ret
dig1:
	cpi	temp4,1	
	brne dig2
	ldi	temp2,0b00000110
	ret

dig2:
	cpi	temp4,2	
	brne dig3
	ldi	temp2,0b01011011
	ret
dig3:
	cpi	temp4,3	
	brne dig4
	ldi	temp2,0b01001111
	ret

dig4:
	cpi	temp4,4	
	brne dig5
	ldi	temp2,0b01100110
	ret

dig5:
	cpi	temp4,5	
	brne dig6
	ldi	temp2,0b01101101
	ret

dig6:
	cpi	temp4,6	
	brne dig7
	ldi	temp2,0b01111101
	ret

dig7:
	cpi	temp4,7	
	brne dig8
	ldi	temp2,0b00000111
	ret

dig8:
	cpi	temp4,8	
	brne dig9
	ldi	temp2,0b01111111
	ret
dig9:
	cpi	temp4,9	
	brne digA
	ldi	temp2,0b11111111
	ret
digA:
	cpi	temp4,10	
	brne digB
	ldi	temp2,0b11111111
	ret
digB:
	cpi	temp4,11	
	brne digC
	ldi	temp2,0b11111111
	ret
digC:
	cpi	temp4,12	
	brne digD
	ldi	temp2,0b11111111
	ret
digD:
	cpi	temp4,13	
	brne digE
	ldi	temp2,0b11111111
	ret
digE:
	cpi	temp4,14	
	brne digF
	ldi	temp2,0b11111111
	ret
digF:
	cpi	temp4,15	
	brne digG
	ldi	temp2,0b11111111
	ret
digG:	
	ldi	temp2,0b11111111
	ret











