;encoder
.include "m8def.inc"

.def     Temp=R16
.def     NewState=R17 
					  
.def     OldState=R18   
					   

.def     Count=R20  
.def     Timer_Counter=R21  
.def     Flag=R22

rjmp RESET ; Reset Handler
rjmp 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
rjmp  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


clr OldState
ldi temp,255
out DDRC,temp 
ldi count,0
clr Timer_counter
clr Flag
///////////Инициализация таймеров////////
ldi temp,0b00000010  
out TCCR2,temp		 
ldi temp,0b10000001 
out TIMSK,temp      
ldi temp,0x8A      
out OCR2,temp	

ldi temp,0b00000011
out TCCR0,temp

sei


//////Бесконечный цикл//
Begin:

rjmp Begin
//////////////////////// Выбор бита порта С для вывода\\\\\\\\\\\\\\\\\\\\\\\\\\\
EXT_INT0:
inc Flag
BC0:
cpi Flag,0
brne BC1


BC1:
cpi Flag,1
brne BC2 

BC2:
cpi Flag,2
brne BC3

BC3:
cpi Flag,3
brne exit



exit:
clr Flag



reti


/////////////////// Сброс состояния порта C     \\\\\\\\\\\\\\\\\\\\\
TIM0_OVF:


ldi temp,0b00000000
out PORTC,temp 

reti
///////////////////процедура сканирования энкодера//////////////////////////
TIM2_COMP:

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 Cpi12
	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,4 
	
	brne exitLS

	clr count
	ldi temp,0b00000001
	out PORTC,temp



	exitLS:
	inc count
	
ret

RightShift:
	cpi count,4  
	
	brne exitRS
 

	clr count
	ldi temp,0b00000010
	out PORTC,temp


	
	exitRS:
	inc count
	ret





