;******************************************************************************** 
;AT90S1200  @  External 4Mhz
;********************************************************************************

.include	"1200def.inc"

.def	Temp=R16
.def	Temp2=R17
.def	Temp3=R18
.def	Temp4=R19
.def	Temp5=R20
.def	Pin=R21			;Выбор ноги порта для мигания одним светодиодом
				;PD0->PD1->PD2->PD3


.cseg
.org 0

rjmp	Init			;вектор "RESET"а
rjmp	INT_0			;вектор INT0

Init:				;инициализация
ldi	Temp,0xFF		;PORTB на выход
out	DDRB,Temp			

ldi	Temp,0x00		
out	DDRD,Temp

ldi	Temp,0x04		;PD2 вход с подтяжкой
out	PORTD,Temp

ldi	Temp,0x02		;настройка: вызов прерывания по спадающему фронту (1->0)
out	MCUCR,Temp

ldi	Temp,0b01000000		;разрешаем прерывание INT0
out	GIMSK,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:		ldi	Temp5,0			;обработка прерывания INT0
		ldi	Temp2,0
		
ILp:		dec	Temp5			;задержка антидребезга
		brne	ILp
					
		dec	Temp2
		brne	ILp
				
		cpi	Pin,0x08		;если пин равен 0b1000, то 
		breq	def			;выполнить def(начальное значение)
		lsl	Pin			;иначе, сдвинуть на следующий
		rjmp	exit			;выход порта и выйти из подпрограммы 
						;обработки прерывания
		def:	ldi	Pin,0x01
	
	exit:	reti

		

