Страница 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) { // Кнопка нажата
делаем что-то;
}