|
|||||||||||
PORTD = 0xff;. PORTD = 0x00;. PORTD |= 1<<3;. PORTD &= ~(1<<4);PORTD = 0xff; А установить " 0" на всех выводах порта D можно так. PORTD = 0x00; К каждому биту регистров PORTx можно обращаться и по отдельности так же, как в случае с регистрами DDRx. Например, команда PORTD |= 1< < 3; установит " 1" (сигнал высокого уровня) на выводе PD3. Команда PORTD & = ~(1< < 4); установит " 0" (сигнал низкого уровня) на выводе PD4. В AVR GCC сдвиг можно осуществлять и с помощью функции _BV(), которая выполняет поразрядный сдвиг и вставляет результат в компилируемый код. В случае использования функции _BV() две предыдущие команды будут выглядеть следующим образом. PORTD |= _BV(PD3); // установить " 1" на линии 3 порта D PORTD & = ~_BV(PD4); // установить " 0" на линии 4 порта D
Теперь попробуем написать несколько простых программ для лучшего понимания принципа работы с портами микроконтроллера. Первые наши программы будут состоять всего из нескольких строк, и в их задачу будет входить зажигание светодиода, подключенного к микроконтроллеру. Подключить светодиод к микроконтроллеру можно различными способами.
В зависимости от способа подключения светодиод будет загораться либо от сигнала высокого уровня, подаваемого на вывод PD1 микроконтроллера, как в первом случае, либо от сигнала низкого уровня в случае подключения, изображенного на втором рисунке.
/************************************************************************* ПРИМЕР ВКЛЮЧЕНИЯ СВЕТОДИОДА СИГНАЛОМ ВЫСОКОГО УРОВНЯ Пример подключения на рисунке 1 **************************************************************************/
#include < avr/io. h> int main( void ) { // начало основной программы DDRD = 0xff; // все выводы порта D сконфигурировать как выходы PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1 } // закрывающая скобка основной программы
/*********************************************************************** ПРИМЕР ВКЛЮЧЕНИЯ СВЕТОДИОДА СИГНАЛОМ НИЗКОГО УРОВНЯ Пример подключения на рисунке 2 ************************************************************************/
#include < avr/io. h>
int main( void ) { // начало основной программы DDRD = 0xff; // все выводы порта D сконфигурировать как выходы PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1 } // закрывающая скобка основной программы
Теперь попробуем мигнуть светодиодом, подключенным так, как это изображено на левом рисунке. Для этого используем функцию задержки _delay_ms(). Функция _delay_ms() формирует задержку в зависимости от передаваемого ей аргумента, выраженного в миллисекундах (в одной секунде 1000 миллисекунд). Максимальная задержка может достигать 262. 14 миллисекунд. Если пользователь передаст функции значение более 262. 14, то произойдет автоматическое уменьшение разрешения до 1/10 миллисекунды, что обеспечивает задержки до 6. 5535 секунд. (О формировании более длительных задержек можно прочитать в статье " Циклы в языке Си. Формирование задержки". ) Функция _delay_ms() содержится в файле delay. h, поэтому нам будет необходимо подключить этот файл к программе. Кроме того, для нормальной работы этой функции необходимо указать частоту, на которой работает микроконтроллер, в герцах.
/************************************* ПРИМЕР МИГАНИЯ СВЕТОДИОДОМ Пример подключения на рисунке 1 **************************************/
#define F_CPU 1000000UL // указываем частоту в герцах
#include < avr/io. h> #include < util/delay. h>
int main( void ) { // начало основной программы
DDRD = 0xff; // все выводы порта D сконфигурировать как выходы
PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1, //зажечь светодиод
_delay_ms(500); // ждем 0. 5 сек.
PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1, //погасить светодиод
_delay_ms(500); // ждем 0. 5 сек.
PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1, //зажечь светодиод
_delay_ms(500); // ждем 0. 5 сек.
PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1, //погасить светодиод
} // закрывающая скобка основной программы
Серия миганий светодиодом будет очень короткой. Для того чтобы сделать мигание непрерывным, можно организовать бесконечный цикл с помощью оператора безусловного перехода " goto". Оператор goto осуществляет переход к месту программы, обозначенному меткой. Имя метки не должно содержать пробелов. После имени метки ставится знак двоеточия. Между именем метки и двоеточием не должно быть пробелов.
/******************************************************* ПРИМЕР БЕСКОНЕЧНОГО МИГАНИЯ СВЕТОДИОДОМ Пример подключения на рисунке 1 ********************************************************/
#define F_CPU 1000000UL // указываем частоту в герцах
#include < avr/io. h> #include < util/delay. h>
int main( void ) { // начало основной программы
DDRD = 0xff; // все выводы порта D сконфигурировать как выходы
start: // метка для команды goto start
PORTD |= _BV(PD1); // установить " 1" (высокий уровень) на выводе PD1, //зажечь светодиод
_delay_ms(250); // ждем 0. 25 сек.
PORTD & = ~_BV(PD1); // установить " 0" (низкий уровень) на выводе PD1, //погасить светодиод
_delay_ms(250); // ждем 0. 25 сек.
goto start; // перейти к метке start
} // закрывающая скобка основной программы
|
|||||||||||
|