;******************************************************************************** 
;AT90S1200  @  External 4Mhz
;--------------------------------------------------------------------------------
;Последовательное переключение светодиодов по внешнему прерыванию
;********************************************************************************
.include	"1200def.inc"

.def	Temp=R16
.def	Temp2=R17
.def	Temp3=R18
.def	Temp4=R19
.def	Temp5=R20
.def	Temp6=R21
.def	Temp7=R22
.def	Pin=R23


.cseg
.org 0

rjmp	RESET			;векторы прерываний
rjmp	INT_0

RESET:
clr	Temp
ldi	Temp,0xFF		;PORTB на выход(светодиоды)
out	DDRB,Temp			

ldi	Temp,0x03		;PD2 на вход(INT0)
out	DDRD,Temp

ldi	Temp,0b01000000		;разрешаем прерывание INT0
out	GIMSK,Temp

ldi	Temp,0x02		;настройка: вызов прерываниея по спадающему фронту (1->0)
out	MCUCR,Temp

sei				;разрешение прерываний
		
Start:	ldi	Pin,0x01	;Начало основного кода
					
loop:	mov	Temp,Pin	;цикл мигания светодиодом
	rcall	Delay		
	ldi	Temp,0x00
	rcall	Delay

	rjmp	loop

Delay:	out	PORTB,Temp	;цикл паузы включен/отключен
	ldi	Temp2,0
	ldi	Temp3,0
	ldi	Temp4,4

Dloop:	dec	Temp2
	brne	Dloop

	dec	Temp3
	brne	Dloop

	dec	Temp4
	brne	Dloop

	ret

INT_0:					;Обработка прерывания INT0
	in	Temp5,SREG		;Компилятор выдает предупреждение что команды push, pop на данном 			push	Temp5			;устройстве не поддерживаются, по причине отсуствия ОЗУ
						
					
	sbic	PORTD,2			;-
	rjmp	exit			; |
					; |						
	ldi	Temp6,0			; |
	ldi	Temp7,0			; |
					; |
ILoop:	dec	Temp6			;  >  Защита от дребезга контактов кнопки.
	brne	ILoop			; |
					; |
	dec	Temp7			; |
	brne	ILoop			; |
					; |						
	sbic	PORTD,2			; |
	rjmp	exit			;_| 

	cpi	Pin,0x08		;Если 0b00001000(последний светодиод), 
	breq	def			;то присвоить начальное значение 0b00000001
	lsl	Pin			;иначе, следующий светодиод (0001 -> 0010)
	mov	Temp,Pin		;присваеваем регистру новое значение
	rjmp	exit			;и выходим...
										
def:	ldi	Pin,0x01		;присвоение начального значения
					
exit:	pop	Temp5
	out	SREG,Temp5
	reti				;выход из обработчика
		