Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

218 Микроконтроллеры AVR от азов программирования... 3 void main(void) 1 tfinclude <tiny2313.h> 2 tfinclude <delay.h> 4 PORTB=OxFF; // Инициализация порта В 5 DDRB=OxFF; 6 P0RTD=0x7F; // Инициализация порта D 7 DDRD=OxOO; 8 ACSR=0x80; // Инициализация аналогового компаратора 9 while (1) 10 if (PIND.0==1) // Проверка нажатия кнопки 11 { P0RTB.0=1, } // Тушим светодиод 12 else i 13 1 P0RTB.0=1, // Тушим светодиод 14 15 delay ms(200) , PORTS. 0=0; // Задержка // Зажигаем светодиод 16 delay_ms(200); // Задержка Как вы уже наверно догадываетесь, осуществить задержку в про ­ грамме, написанной на языке СИ, будет гораздо проще, чем на Ассемблере. Листинг 5.8 содержит один из вариантов подобной про ­ граммы. Программа не содержит новых для нас операторов, поэтому сразу перейдем к ее описанию. Для создания задержки используется та же самая библиотека подпрограмм, что и в предыдущем примере (листинг 5.6). Однако, в нашем случае, мы берем другую функцию из этой библиотеки. Функцию delay_ms (задержка в миллисекундах). Рассмотрим подробнее работу программы. Все команды инициализации в новой программе взяты из предыдущего примера и перенесены оттуда без изменений. Различия начинаются в главном цикле программы. Оператор i f в строке 10 производит проверку младшего разряда регистра PD на равенство единице. Если разряд равен единице (кнопка не нажата), то выполняется строка 11 (запись в РВО единицы). Эта строка выполняется все время, пока кнопка не нажата. В этом случае светодиод остается поту ­ шенным. Если нажать кнопку, младший разряд PD окажется равным нулю. В этом случае вместо строки 11 выполняются строки 13 — 16. Они представляют собой процедуру мигания светодиода. Эта проце ­ дура работает следующим образом. В строке 13 светодиод тушится. Затем осуществляется задержка на 200 мс (срока 14). В строке 15 светодиод зажигается. После этого опять осуществляется задержка (строка 16). То есть выполняется один цикл мигания. Так как вся конструкция if — else находится внутри основного цикла, после окончания цикла мигания все операции повторяются сначала. То есть снова выполняется проверка состояния кнопки (строка 10), а по результатам проверки — одно из вышеописанных действий. В случае, если кнопка все еще нажата, цикл мигания повторяется. Если кнопка отпущена — просто гасится светодиод.

RkJQdWJsaXNoZXIy MTExODQxMg==