8. Complete Program Examples

A. Blink LED 
 #define __SFR_OFFSET 0x00
#include "avr/io.h"

.global main

main:
 SBI DDRB, 5 ; Set PB5 (Pin 13) as Output

loop:
 SBI PORTB, 5 ; Turn on LED (Output HIGH)
 RCALL delay ; Call delay subroutine
 CBI PORTB, 5 ; Turn off LED (Output LOW)
 RCALL delay ; Call delay subroutine
 RJMP loop ; Repeat continuously

delay:
 LDI R18, 82 ; Outer loop counter
outer:
 LDI R24, lo8(60000) ; Inner loop counter (low byte)
 LDI R25, hi8(60000) ; Inner loop counter (high byte)
inner:
 SBIW R24, 1 ; Subtract word (R25:R24)
 BRNE inner ; Loop if not 0
 DEC R18 ; Subtract outer counter
 BRNE outer ; Loop outer if not 0
 RET ; Return to caller
 
 B. Reading Button and Controlling LED 
 #define __SFR_OFFSET 0x00
#include "avr/io.h"

.global main

main:
 ; Setup
 SBI DDRB, 5 ; PB5 (Pin 13) as Output (LED)
 CBI DDRD, 2 ; PD2 (Pin 2) as Input (Button)
 SBI PORTD, 2 ; Activate Pull-up on PD2

loop:
 SBIC PIND, 2 ; Skip next instruction if button pressed (LOW)
 RJMP led_off ; If not pressed, turn off LED
 
led_on:
 SBI PORTB, 5 ; Turn on LED
 RJMP loop ; Return to loop

led_off:
 CBI PORTB, 5 ; Turn off LED
 RJMP loop ; Return to loop
 
 C. Toggle LED with Button (Simple Debounce) 
 #define __SFR_OFFSET 0x00
#include "avr/io.h"

.global main

main:
 ; Initialization
 SBI DDRB, 5 ; PB5 as Output (LED)
 CBI DDRD, 2 ; PD2 as Input (Button)
 SBI PORTD, 2 ; Activate internal Pull-up
 CLR R20 ; R20 = LED status (0 = off)

wait_press:
 SBIC PIND, 2 ; Wait for button pressed (LOW)
 RJMP wait_press
 
 ; Button pressed - toggle LED
 SBRC R20, 0 ; Skip if bit 0 of R20 = 0 (LED off)
 RJMP turn_off
 
turn_on:
 SBI PORTB, 5 ; Turn on LED
 LDI R20, 1 ; Set status = on
 RJMP debounce

turn_off:
 CBI PORTB, 5 ; Turn off LED
 CLR R20 ; Set status = off

debounce:
 RCALL delay ; Delay for debounce
 
wait_release:
 SBIS PIND, 2 ; Wait for button released (HIGH)
 RJMP wait_release
 RCALL delay ; Delay debounce after release
 RJMP wait_press ; Return to wait for press

delay:
 LDI R18, 50
d_outer:
 LDI R24, lo8(10000)
 LDI R25, hi8(10000)
d_inner:
 SBIW R24, 1
 BRNE d_inner
 DEC R18
 BRNE d_outer
 RET