Белов, А.В. Микроконтроллеры 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), а по результатам проверки — одно из вышеописанных действий. В случае, если кнопка все еще нажата, цикл мигания повторяется. Если кнопка отпущена — просто гасится светодиод.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==