Задача: Разработаем устройство управления светодиодом. Кнопка будет включать и выключать мигание светодиода. Пока кнопка нажата светодиод мигает с частотой 2,5 Hz, если кнопка отпущена светодиод не горит.

Алгоритм программы:

- Производим чтение порта D;
- Проверяем PD0, если он равен нулю включаем алгоритм мигания;
- Если PD0 равен единице выключаем алгоритм мигания и тушим светодиод;
- Переходим к началу основного цикла(первый пункт);
- Пишем алгоритм мигания светодиодом (зажигаем светодиод, пауза, гасим светодиод, пауза);
- Переходим к началу алгоритма(первый пункт).

Настраиваем порты ввода вывода как в занятии №2. Пишем основной цикл программы. Программа не содержит для нас новых операторов. Для создания задержки используется та же самая библиотека подпрограмм util/delay.h. Полный текст программы смотрите ниже.

/***************** Задание №3. Мигание светодиодом ***************/
#include <avr/io.h>
#include <util/delay.h> 
int main(void)
{
DDRD = 0x00; // порт D на вход
PORTD = 0xFF; // подключаем внутренние подтяг. резисторы
DDRB = 0xFF; // порт B на выход
PORTB = 0x00; // устанавливаем нули на выходе
while(1)
{
if(PIND&(1 << PD0)) // Проверяем нажатие кнопки
{
PORTB &= ~(1 << PB0); // Гасим светодиод
} 
else
{
PORTB &= ~(1 << PB0); // гасим светодиод
_delay_ms(200); // задержка 200 мс
PORTB |= (1 << PB0); // зажигаем светодиод
_delay_ms(200); // задержка 200мс
}
}
}

В статье были использованы материалы из книги Белова А.В. "Самоучитель разработчика устройств на AVR"