Очень важно уметь подключать кнопки к вашим устройствам на основе МК. Трудно себе представить какое-либосовременное электронное устройство без кнопок управления.
Электронная кнопка.
Вот простй пример использования кнопок который мы рассмотрим в данной статье.
Краткое описание: суть нашей программы весьма проста . У нас есть 8 светодиодов на которые мы будем выводить двоичное число. В начале работы МК наше число ==0 но мы при помощи кнопок сможем увеличивать его значение на 1 либо уменьшать на 1.
Вот блок схема опроса кнопки(общий вид)
Код программы:
#define F_CPU 1000000UL //выбор частоты тактирования (1Мгц) #include <avr/io.h> //подключение заголовочного файла (содержит физические адреса регистров МК) #include <util/delay.h> //подключение заголовочного файла (описание функции _delay_ms() и _delay_us())
int main(void) //главная функция (начало программы) { DDRB= 0b11111111; //определяем PORTB на выход PORTB=0b11111111; //устанавливаем 5V на всех ножках порта B
DDRD = 0b11111100; //устанавливаем первые две ножки на вход остальные на выход PORTD= 0b00000011; //подключаем к первым двум ножкам подт резисторы остальные уст в 0
unsigned char N=0; //создаем счетную переменную
char Flag1=0; // создаем флажок для кнопки 1 char Flag2=0; // создаем флажок для кнопки 2 //не обязательно создавать 2 переменных можно использовать биты одной переменной используя побитовые операции можно сделать 8 флажков используя только одну переменную типа char
while(1) //бесконечный цикл { PORTB=N; //выводим переменную
if(!(PIND&1)) // опрашиваем кнопку 1(+) { Flag1=1; //кнопка нажата (устанавливаем флаг в 1) _delay_ms(10); //задержка (защита от дребезга) }
if(( Flag1==1 )&&(PIND&1)) //условие если кнопка была нажата а потом отпущена { N+=1; Flag1=0; } // увеличиваем счетную переменную на единицу и сбрасываем флажок
if(!(PIND&2)) // опрашиваем кнопку 2(+) { Flag2=1; //кнопка нажата (устанавливаем флаг в 1) _delay_ms(10); //задержка (защита от дребезга) }
if(( Flag2==1 )&&(PIND&2)) //условие если кнопка была нажата о потом отпущена { N-=1; Flag2=0; } // уменьшаем счетную переменную на единицу и сбрасываем флажок
} }
Есть и другие способы подключения кнопок. Описанный выше способ является весьма наглядным и простым. Важно понимать:
1) Дребезг контактов — при нажатии кнопки происходит многократная смена напряжения с 5V до 0V что может привести к многократной регистрации нажатия кнопки. Для того чтобы этого не происходило мы используем програмную задержку _delay_us().
2) Побитовые операции- (&-битовое «И». |-битовое «ИЛИ». ~-побитовая «НЕ». ^-битовое «ИСКЛ ИЛИ») это операции над битами чисел.
3)Опрос напряжения на ножке происходит при помощи регистра PIN(A.B.C…) в этом 8 разрядном регистре хранится информация о приложенных напряжениях к ножкам соответствующего порта. unsigned char N=0; //создаем переменную для хранения состояний ножек на порте B N=PINB; //присваиваем переменной значение регистра PIN
Регистр PIN(A.B.C…) предназначен только для чтения.Например, если в переменнуюN записалось число 0b00000001; это означает, что на первой ножке напряжение 5V а на других ножках 0V.
|