Страница 1 из 1

помогите опросить кнопочку

Добавлено: Пт апр 23, 2010 22:31:02
vovik15
доброго времени суток,у меня небольшая проблемка,вот недввно начал разбираться с контроллерами,и возниклв проблема опроса кнопки,помогите пожалуйста!
PS
пытаюсь учиться програмировать на языке си
благодарен за любую оказанную помощ :))

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 02:00:53
pyzhman
#define knopka PINA.0
.
.
if(knopka)
{
//делаем то, что надо при нажатой кнопке
}
else
{
//делаем то, что надо при ненажатой кнопке
}

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 10:08:55
chief
vovik15 писал(а):пытаюсь учиться програмировать на языке си
На каком компиляторе работаешь?

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 11:38:38
b612
vovik15 писал(а):благодарен за любую оказанную помощ :))
проверяешь состояние кнопки 20-50 раз в секунду
если состояние кнопки изменилось (не важно нажали или отпустили) делаешь то, что нужно при нажатии(отпускании). и перестаёшь опрашивать примерно на 0.1-0.2 секунды
через 0.1-0.2 секунды возобновляешь опрос.

приостановка опроса нужна для подавления дребезга контактов и дрожания пальцев

обязательно нужно использовать флаг прошлого состояния кнопки чтобы сравнивать вновь считаное с тем, что было до этого
и обязательно одинаково реагировать (делать паузу 0.1-0,2сек) и при нажатии и при отпускании

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 11:44:48
vovik15
спосибо,работаю в компиляторе
codevision avr

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 14:41:24
maglev
b612 писал(а):
vovik15 писал(а):благодарен за любую оказанную помощ :))
проверяешь состояние кнопки 20-50 раз в секунду
если состояние кнопки изменилось (не важно нажали или отпустили) делаешь то, что нужно при нажатии(отпускании). и перестаёшь опрашивать примерно на 0.1-0.2 секунды
через 0.1-0.2 секунды возобновляешь опрос.
Правильно делать по-другому. В цикле непрерывно читаешь кнопку, если состояние изменилось - счетчик в ноль. Если состояние не меняется N циклов, то считаем его стабильным и обрабатываем. N зависит от частоты опроса, длительность те самые 0.1-0.2с. Величина N - обычно десятки.

Re: помогите опросить кнопочку

Добавлено: Сб апр 24, 2010 14:50:39
Pavel V.
Вот красивый способ подавления дребезга контактов, который я уже давно использую:

Код: Выделить всё

/* Key Accumulator */
static uint16_t KeyAcc = 0;

/* Key State */
static uint16_t Key = 0;

/*
 * Read Key
 */
void ReadKey() {
	KeyAcc = KeyAcc << 1;
	KeyAcc |= !(KEYPORT & KEYPIN);
	if(KeyAcc == 0xFFFF) Key = 1;
	if(KeyAcc == 0) Key = 0;
}
Для кучи кнопок, соответственно, используем массивы: KeyAcc[X], Key[X].

Re: помогите опросить кнопочку

Добавлено: Вс апр 25, 2010 02:12:41
neon-f
Подскажите, вот так нормально опрашивать кнопки и подавлять дребезг. Три кнопки подключены к портам PD3, PD4, PD5.

unsigned char button ;

******
void Code_key (void)
{
button=0x00;
if (PIND>>3<<5!=0b11100000) {button=PIND>>3<<5; delay_ms(100);}
while (PIND>>3<<5==button) {}
delay_ms(50);
}

на выходе переменная button имеет код нажатой кнопки, или равна 0 если кнопки не нажаты.
и ещё, как различать кратковременное нажатие кнопки, и долгое удержание.

Re: помогите опросить кнопочку

Добавлено: Вс апр 25, 2010 10:47:57
Alexeus
кратковременное и долгое удержание кнопок нужно с помощью таймера распознавать. настраиваешь таймер на какой то период и в прерывании таймера увеличиваешь переменную. в основной программе сравниваешь сколько накопилось в переменной. чем дольше держишь, тем большее число копится в переменной. после обработки нажатия клавиши переменную обнуляешь.

Re: помогите опросить кнопочку

Добавлено: Вс апр 25, 2010 17:10:57
Pavel V.
neon-f писал(а):Подскажите, вот так нормально опрашивать кнопки и подавлять дребезг. Три кнопки подключены к портам PD3, PD4, PD5.
Нет, ненормально. Вообще желательно сразу забыть про delay_ms(100);
Максимум где могут применяться задержки в циклах - это инициализация периферийных устройств.

В основном же цикле никаких задержек быть не должно.

Чем не устраивает мой пример?

Re: помогите опросить кнопочку

Добавлено: Вс апр 25, 2010 18:45:28
neon-f
Pavel V. писал(а):Чем не устраивает мой пример?
честно? - много незнакомых букв. я еще совсем зеленый в программировании. У меня опрос кнопок сделан в виде функции, т.е. когда мне нужно прочесть состояние кнопок, я обращаюсь к функции опроса, один раз опрашиваю и возврвщаюсь в основную программу. К тому же если не одна из кнопок не нажата, то задержка вообще не используется
_noise писал(а):Основной цикл - сам по себе задержка,
Я тоже так подумал, поэтому на отпускание кнопки поставил delay_ms(50), а на нажатие delay_ms(100);
_noise писал(а):приколоться: основной цикл = делай_мс() и опрос кнопок только, а все полезные действия по прерываниям?
а по моему реальный вариант......

Re: помогите опросить кнопочку

Добавлено: Вс апр 25, 2010 21:26:30
Pavel V.

Код: Выделить всё

/* Key Accumulator */
static uint16_t KeyAcc = 0; // Глобальная переменная для хранения последовательности состояний кнопки (аккумулятор)

/* Key State */
static uint16_t Key = 0; // Глобальная переменная состояния кнопки (после подавления дребезга)

/*
* Функция опроса состояния кнопки
*/
void ReadKey() {
   KeyAcc = KeyAcc << 1; // Сдвигаем аккумулятор влево на 1 бит
   KeyAcc |= !(KEYPORT & KEYPIN); // читаем состояние ножки KEYPIN на порту KEYPORT и добавляем новое значение к аккумулятору
   if(KeyAcc == 0xFFFF) Key = 1; // если 16 раз подряд на ножке лог. 0, то кнопка нажата
   if(KeyAcc == 0) Key = 0; // если 16 раз подряд на ножке лог. 1, то кнопка отпущена
}
Функцию ReadKey() необходимо вызывать либо из главного цикла, либо по прерыванию таймера. В основном цикле обрабатывать флаг Key.

Код: Выделить всё

if(Key) { // Кнопка нажата
    делаем что-то;
}