;******************************************************************************** 
;AT90S1200  @  External 4Mhz
;--------------------------------------------------------------------------------
;Последовательное переключение светодиодов по внешнему прерыванию
;********************************************************************************
.include	"1200def.inc"

.def	Temp=R16
.def	Temp2=R17
.def	Temp3=R18
.def	Temp4=R19
.def	Temp5=R20
.def	Pin=R21


.cseg
.org 0

rjmp	RESET				;векторы прерываний
rjmp	INT_0

RESET:
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		
					
	sbic	PORTD,2			;-
	rjmp	exit			; |
					; |
	ldi	Temp5,0			; |
	ILoop:	dec	Temp5		;  >  Защита от дребезга контактов кнопки.
	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:		reti		;выход из обработчика
		