Пятница, 17.05.2024, 06:49
Главная
Приветствую Вас, Гость
Статистика



Онлайн лист

Онлайн всего: 1
Гостей: 1
Пользователей: 0



Реклама



Главная » Статьи » Микроконтроллеры

Наверх


Подключение кнопок к Atmega16
Одним из простых и удобных способов управления микроконтроллером являются кнопки. Сейчас покажу как просто подключить кнопки к микроконтроллеру atmega16 (по аналогии и к любому другому AVR).

Для начала схема:

подключение кнопок к atmega16

К порту А я подключил LCD на основе контроллера HD44780. На него будет выводится результат нажатия кнопок. Сами кнопки, в количестве двух штук, я подключил на порт B, на 0 и 1 пины, с одой стороны и на землю с другой стороны.

Эти две ножки я настроил на выходы и установил на них высокий уровень:
PORTB=0x03;
DDRB=0x03;

Теперь о том как все будет работать:
Пока кнопка отжата, на выходе,например PB0, будет высокий уровень(1). Если нажать кнопку то этот выход окажется подключенным к земле и уровень сменится с 1 на 0. Вот это изменение мы можем легко отследить и задать по нему какое то действие.

В работе с кнопками есть один нюанс - дребезг контактов, в двух словах: при фактическом нажатии кнопки происходит неоднократное замыкание и размыкание контактов, что не очень то и приятно и удобно. Так вот для борьбы с дребезгом есть несколько разных способов, но сейчас покажу самый простой, он не всегда подходит, но для начала и для простого проекта он вполне подойдет. Способ заключается в простой задержке. Т.е. когда микроконтроллер понял что кнопка была нажата, он включает задержку на заданное время, тем самым исключая возможность реакции на изменение состояния кнопки. В коде это выглядит так:

if(PINB.0==0) // Сравнение уровня на выходе PB0 с 0
{
delay_ms(200); // Задержка в 200 миллисекунд
Действие // какое то действие по нажатию кнопки
}

Получается все очень просто.

А теперь небольшой примерчик. Схема есть выше и к ней код:


 
#include ‹mega16.h›
#include ‹delay.h›
#include ‹stdio.h›
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include ‹lcd.h›
char lcd_buffer[33];
char i;

void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x03;
DDRB=0x03;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

lcd_init(16);
i=50;
lcd_putsf("50");
while (1)
{

if(PINB.0==0){
delay_ms(200);
i++;
sprintf(lcd_buffer,"%i%u",i/10,i%10);
lcd_clear();
lcd_puts(lcd_buffer);
}
if(PINB.1==0){
delay_ms(200);
i--;
sprintf(lcd_buffer,"%i%u",i/10,i%10);
lcd_clear();
lcd_puts(lcd_buffer);

}

};
}




Что делает эта программа. На экран она выводит число 50. При нажатии на кнопку, подключенную к PB0, число на экране увеличивается на 1, при нажатии на кнопку, подключенную к PB1, число уменьшается на 1. То есть по нажатиям на кнопки происходит изменение некоего параметра на 1. Очень простой пример управления.





Нравится
Категория: Микроконтроллеры | Добавил: Naprisar (26.09.2012)
Просмотров: 11232 | Комментарии: 7 | Теги: HD44780, ATmega16, кнопка, микроконтроллер, подключение кнопок к микроконтролле, LCD
Всего комментариев: 7
7 Хабиб  
0
Как подключить несколько независимых кнопок ?

6 radioatom8  
0
У меня CodeVisionAVR  на эти две строчки ругается

sprintf(lcd_buffer,"%i%u",i/10,i%10);

sprintf(lcd_buffer,"%i%u",i/10,i%10);

5 radioatom8  
0
Как вместотого чтобы  увеличения числа сделать мнею и его листать вверх или вниз?

3 Jeb  
0
Спасибо вам огромное за статью! Очень помогли! :-)

4 Naprisar  
0
Всегда пожалуйста, рад, когда написанное оказывается полезным.

1 ZigleR  
1
Спасибо за статью!

"Эти две ножки я настроил на выходы и установил на них высокий уровень:
PORTB=0x03;
DDRB=0x03; "

Я настраивал входами, т.е.
PORTA=0x00;
DDRA=0x00;
на пин нужно подать питание (через резистор например 10к) и через нормально разомкнутую кнопку заземлить. Если PINA.0 == 1 кнопка не нажата, если PINA.0 == 0 кнопка нажата

P.S. "Задержка в 50 миллисекунд" -> Задержка в 200 миллисекунд

2 Naprisar  
0
Оба способа рабочие, потому здесь кому как удобней. С задержкой поправился, спасибо))

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Наверх