Программа внутри <asm>
;-----------------------------------------------------------------------------
; Примитивная стартовая программа для ATMega16
;
; При нажатии/отпускании кнопки, подключенной между ногой 1 и землей,
; будет зажигаться/гаснуть светодиод, подключенный через резистор 1К между ногой 2 и землей
;-----------------------------------------------------------------------------
; Присваиваем для удобства численные значения символическим именам портов (согласно даташиту)
;
.equ PINB = 0x16 ; Адрес входного порта B
.equ DDRB = 0x17 ; Адрес регистра направлений порта B
.equ PORTB = 0x18 ; Адрес выходного порта B
.equ PB0 = 0 ; Номера бит порта B
.equ PB1 = 1 ;
;-----------------------------------------------------------------------------
; Присваиваем для удобства численные значения символическим именам ног (согласно схеме включения)
;
.equ led = PB0 ; Сюда подключен светодиод (нога 1)
.equ button = PB1 ; Сюда подключена кнопка (нога 2)
;-----------------------------------------------------------------------------
main: ; Метка начала программы (просто для справки)
sbi DDRB,led ; Делаем ногу 1 выходом (там светодиод), остальные останутся входами
sbi PORTB,button ; Включаем резистор подтяжки на ноге 2 (там кнопка)
loop1: ; Метка для цикла
sbic PINB,button ; Если кнопка нажата - пропускаем следующую команду
rjmp led_off ; Если нет - переходим к метке led_off
sbi PORTB,led ; Сюда попали только когда кнопка нажата - включаем светодиод
rjmp loop1 ; и начинаем цикл снова - с метки loop1
led_off: ; Метка для перехода, сюда попадаем только когда кнопка не нажата
cbi PORTB,led ; Выключаем светодиод
rjmp loop1 ; и начинаем цикл снова - с метки loop1
;-----------------------------------------------------------------------------
.exit ; Обязательная директива конца текста
;-----------------------------------------------------------------------------
</asm>