#include <avr/io.h>
#include <util/delay.h>
int main(void) {
// Set PORTD pins 2 to 5 as output
DDRD |= (1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5);
while (1) {
// Inline assembly to cycle LEDs on and off
asm volatile (
"ldi r16, 0x04" "\n" // Initialize with the bit pattern for PD2
"ldi r20, 4" "\n" // Loop 4 times (for 4 LEDs)
"cycle_leds:" "\n"
"out %0, r16" "\n" // Output to PORTD
// Inline delay
"ldi r18, 20" "\n"
"ldi r19, 0" "\n"
"ldi r21, 0" "\n"
"delay_loop:" "\n"
"dec r21" "\n"
"brne delay_loop" "\n"
"dec r19" "\n"
"brne delay_loop" "\n"
"dec r18" "\n"
"brne delay_loop" "\n"
// End of delay
"lsl r16" "\n" // Shift left to move to the next LED
"dec r20" "\n" // Decrement the loop counter
"brne cycle_leds" "\n" // If not zero, repeat the loop
"out %0, r1" "\n" // Clear PORTD (r1 is assumed to be zero)
:
: "I" (_SFR_IO_ADDR(PORTD))
: "r16", "r18", "r19", "r20", "r21"
);
_delay_ms(500); // Delay between each full cycle
}
return 0;
}