;encoder
.include "m8def.inc"

.def     Temp=R16
.def     NewState=R17
					  
.def     OldState=R18   
					   

.def     Count=R20  
.def     Flag=R21  
.def     Count1=R22

.cseg
.org 0
rjmp RESET ; Reset Handler
reti ;EXT_INT0 ;IRQ0 Handler
reti ;EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
reti ;TIM2_OVF ; Timer2 Overflow Handler
reti ;TIM1_CAPT ; Timer1 Capture Handler
reti ;TIM1_COMPA ; Timer1 CompareA Handler
reti ;TIM1_COMPB ; Timer1 CompareB Handler
reti ;TIM1_OVF ; Timer1 Overflow Handler
reti  ;TIM0_OVF ;Timer0 Overflow Handler
reti ;SPI_STC ; SPI Transfer Complete Handler
reti ;USART_RXC ; USART RX Complete Handler
reti ;USART_UDRE ; UDR Empty Handler
reti ;USART_TXC ; USART TX Complete Handler
reti ;ADC ; ADC Conversion Complete Handler
reti ;EE_RDY ; EEPROM Ready Handler
reti ;ANA_COMP ; Analog Comparator Handler
reti ;TWSI ; Two-wire Serial Interface Handler
reti ;SPM_RDY ; Store Program Memory Ready Handler


RESET:
/////////////////////Инициализация стека ////////
ldi Temp,high(RamEnd)
out SPH,Temp
ldi Temp,low(RamEnd)
out SPL,Temp

////////////////////Init i/o//////////////////////////
clr OldState
ldi temp,255
out DDRC,temp 
ldi temp,0b00000011
out DDRD,temp
ldi count,0
ldi count1,0
clr Flag

///////////Инициализация таймеров////////
ldi temp,0b00000010
out TCCR2,temp		 
ldi temp,0b10000000 
out TIMSK,temp      
ldi temp,0xFF
out OCR2,temp	



sei


//////Бесконечный цикл//
Begin:

rjmp Begin




///////////////////процедура сканирования энкодера и кнопки//////////////////////////
TIM2_COMP:

in temp,PIND
cpi temp,0b00000000
brne exitBut
inc Flag
cpi Flag,4
brne br
clr Flag
exitBut:
br:
IN NewState,PINB 
cbr NewState,0b11111100 
			 
Cpi OldState,0 
brne Cpi1 
	Cpi NewState,2
	brne Cpi11
	Rcall RightShift
	Cpi11:
	Cpi NewState,1
	brne Cpi12
	rcall LeftShift
	
	
	Cpi12:
	mov OldState,NewState 


reti
Cpi1:

Cpi OldState,1
brne Cpi2 
	Cpi NewState,0 
	brne Cpi21
	Rcall RightShift
	Cpi21:
	Cpi NewState,3
	brne Cpi22
	rcall LeftShift
	
	
	Cpi22:
	mov OldState,NewState 


reti
Cpi2:

Cpi OldState,2
brne Cpi3 
	Cpi NewState,3
	brne Cpi31
	Rcall RightShift
	Cpi31:
	Cpi NewState,0
	brne Cpi32
	rcall LeftShift
	
	
	Cpi32:
	mov OldState,NewState 
	

reti
Cpi3:

Cpi OldState,3
Brne Cpi4 
	Cpi NewState,1
	brne Cpi41
	Rcall RightShift

	Cpi41:
	Cpi NewState,2
	brne Cpi42
	rcall LeftShift
	
	Cpi42:
	mov OldState,NewState 
Cpi4:

reti

////////////////////////////////////////////////////////////////

LeftShift:
	cpi count,2
	
	brne exitLS

	clr count
	BC0:
cpi Flag,0
brne BC1
ldi temp,0b00000001
	out PORTC,temp

BC1:
cpi Flag,1
brne BC2 
ldi temp,0b00000100
	out PORTC,temp
BC2:
cpi Flag,2
brne BC3
ldi temp,0b00010000
	out PORTC,temp
BC3:
cpi Flag,3
brne exit1
ldi temp,0b00000001
	out PORTD,temp


exit1:

	
	

rjmp exitLS1
	
	
	exitLS:
	inc count
exitLS1:

	
;	rcall Delay
ret

RightShift:
	cpi count1,2
	
	brne exitRS
 

	clr count1
VC0:
cpi Flag,0
brne VC1
ldi temp,0b00000010
	out PORTC,temp

VC1:
cpi Flag,1
brne VC2 
ldi temp,0b00001000
	out PORTC,temp
VC2:
cpi Flag,2
brne VC3
ldi temp,0b00100000
	out PORTC,temp
VC3:
cpi Flag,3
brne exit2
ldi temp,0b00000010
	out PORTD,temp


exit2:
	rjmp exitRS1


	
	exitRS:
	inc count1

exitRS1:


	;rcall Delay
	ret



