Сам код
Спойлер
Код: Выделить всё
;Переключение светодиодов
.include "D:\Atmel\include\m8adef.inc"
.def temp=r17
.def time=r18
;частота 4 МГц
;= Start macro.inc ==============
;= End macro.inc ================
; RAM =========
.DSEG
; FLASH =======
.CSEG
.ORG 0
RJMP Reset ; (RESET)
.ORG INT0addr
RJMP Button ; (INT0) External Interrupt Request 0
.ORG INT1addr
RETI ; (INT1) External Interrupt Request 1
.ORG OC2addr
RETI ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG OVF2addr
RETI ; (TIMER2 OVF) Timer/Counter2 Overflow
.ORG ICP1addr
RETI ; (TIMER1 CAPT) Timer/Counter1 Capture Event
.ORG OC1Aaddr
RETI ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
.ORG OC1Baddr
RETI ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
.ORG OVF1addr
RETI ; (TIMER1 OVF) Timer/Counter1 Overflow
.ORG OVF0addr
RJMP Timer ; (TIMER0 OVF) Timer/Counter0 Overflow
.ORG SPIaddr
RETI ; (SPI,STC) Serial Transfer Complete
.ORG URXCaddr
RETI ; (USART,RXC) USART, Rx Complete
.ORG UDREaddr
RETI ; (USART,UDRE) USART Data Register Empty
.ORG UTXCaddr
RETI ; (USART,TXC) USART, Tx Complete
.ORG ADCCaddr
RETI ; (ADC) ADC Conversion Complete
.ORG ERDYaddr
RETI ; (EE_RDY) EEPROM Ready
.ORG ACIaddr
RETI ; (ANA_COMP) Analog Comparator
.ORG TWIaddr
RETI ; (TWI) 2-wire Serial Interface
.ORG SPMRaddr
RETI ; (SPM_RDY) Store Program Memory Ready
;==========программа===========
Reset:
LDI temp,Low(RAMEND) ;инициализация стека
OUT SPL,temp
LDI temp,High(RAMEND)
OUT SPH,temp
LDI temp,$FF ;порт B на выход
OUT DDRB,temp
LDI temp,$01 ;зажигаю первый светодиод
OUT PortB,temp
LDI temp,$04 ;подтягивающий резистр на INT0
OUT PortD,temp
LDI temp,(1<<TOIE0) ;разрешаю прерывания по переполнению Timer0
OUT TIMSK,temp
LDI temp,(1<<ISC01) ;прерывание по спаду INT0
OUT MCUCR,temp
LDI temp,(1<<INT0) ;разрешить прерывание INT0
OUT GICR,temp
SEI
prog: RJMP prog ;бесконечный цикл, будь он неладен...
Button:
LDI time,128 ;время задержки таймера 0.5 с
LDI temp,$00 ;запрет прерывания INT0
OUT GICR,temp
LDI temp,$03 ;запуск таймера 1:64
OUT TCCR0,temp
RETI
Timer:
DEC time
BREQ Stop_timer
RETI
Stop_timer:
LDI temp,$00 ;остановка таймера 1:64
OUT TCCR0,temp
IN temp,PortB ;чтение PortB
CPI temp,$80 ;если зажен последний диод, то зажечь первый
BREQ Restart
LSL temp ;иначе логический сдвиг влево
OUT PortB,temp ;зажечь следующий
LDI temp,(1<<INT0) ;разрешить прерывание INT0
OUT GICR,temp
RETI
Restart:
LDI temp,$01
OUT PortB,temp
LDI temp,(1<<INT0) ;разрешить прерывание INT0
OUT GICR,temp
RETI
; EEPROM ======
.ESEG ;EEPROM
Схема, только там указанно 5 светодиодов, на самом деле их 8, просто схематично показано подключение
Спойлер

видео
