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

Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 10:21:16
diotec
Доброго время суток. Помогите пожалуйста начинающему. Задача такая. Есть две кнопки. Нажимается кнопка 1, после отпускания - кнопка 2. Переменная увеличивается на едуницу. При нажатии сначала кнопки 2, а затем кнопку 1, переменная уменьшается на еденицу. Когда переменная равна 0 выходной порт меняет свое значение. Язык Си, CodeVision. Помогите с алгоритмом плиз.

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 13:10:04
Аlex
Помогите с алгоритмом плиз.
Вы же его только что сами описали. :)
Чем конкретно помочь, что не получается ?

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 13:18:17
diotec
Не могу разделить два цикла, нажатие кнопки 1, а затем кнопки 2 - одно событие, а наоборот - другое.

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 13:41:20
diotec
На увеличение значения переменной работает
while (PIND.0==1){}
if (PINB.0==1)
{PORTB.0=0;}
else
{PORTB.0=1}
while (PIND.0==0){}
while (PIND.1==1){}
if (PINB.0==1)
{PORTB.0=0;}
else
{PORTB.0=1}
while (PIND.1==0){}
n++;

Кнопки - PORTD, вых. PORTB

Как использоавать те же кнопки,но с нажатием в обратном порядке на уменьшение значения переменной?

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 14:45:56
diotec
с написанием помогите пожалуйста

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 15:46:31
phenomen
Никто не мешает сохранить предыдущую нажатую кнопку в переменной. А потом судя по ее значении и работать.

словами:
если нажата кнопка, то:
  • если пред_кнопка = 0 то запоминаем нажатую кнопку
  • если пред_кнопка = 1(первая кнопка)(значение может быть другое) то если нажата кнопка 2 - переменная++ пред_кнопка=0
  • если пред_кнопка = 2(первая кнопка)(значение может быть другое) то если нажата кнопка 1 - переменная-- пред_кнопка=0
    (ждем отпускания кнопки)
    (другие действия)
Почитайте про оператор switch. И на нем попробуйте написать вот ети "если пред_кнопка..." А далее и поможем

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 22, 2012 19:01:41
diotec
Тайна?! switch? break?

Re: Подсчет количества нажатий кнопок

Добавлено: Вс дек 23, 2012 16:25:13
phenomen
Да, именно

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

switch(var)
{
case 0:
{//do something;}
break;
default:
break;
}

Re: Подсчет количества нажатий кнопок

Добавлено: Вт дек 25, 2012 00:39:55
vitalik_1984
Как то эти нажатия смахивают на обработку энкодера.
А насчет кнопок есть отдельная тема.
Могу еще подсказать насчет энкодера

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

#define LEFT (1<<0)
#define RIGHT (1<<1)
#define PIN_MASK (LEFT|RIGHT)

status =!PINB&PIN_MASK;
switch (status){
case 0x00:case PIN_MASK :old_status =status;break;
case LEFT: case RIGHT: change=old_status^status;break;
}
switch (change){case LEFT: n--;break;
case RIGHT:n++;break;}
change=0;
 
Код еще не проверял.

Re: Подсчет количества нажатий кнопок

Добавлено: Вт дек 25, 2012 07:16:33
cavr.ru
diotec
Добрый день!
Советую почитай основы тут ->

Затем тут, и практическая реализация тут в первой части и тут во второй части.
Потратив 15 минут, Вы спокойненько сможете реализовать задуманное. :)

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 09:43:09
diotec
Спасибо, за подсказку, разбираюсь.

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 17:06:12
diotec
Все таки не получается. Вот кусок:
#include <mega8.h>
#include <delay.h>

// Declare your global variables here
unsigned int n;
unsigned int m;
void plus (void) // Функция увеличения переменной на 1
{
if (PINB.1==0)
delay_ms(10);
while (PINB.1==1){}
if (PINB.2==0)
delay_ms(10);
while (PINB.2==1){}
n++;
}
void minus (void)//Функция уменьшения переменной на 1
{
if (PINB.2==0)
delay_ms(10);
while (PINB.2==1){}
if (PINB.1==0)
delay_ms(10);
while (PINB.1==1){}
n--;
}
void main(void)
PORTB=0x0E;
DDRB=0x01;

// Port C initialization
// Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
while (1)
{
if (PINB.1==0)//Кнопка 1
m=0;
if (PINB.2==0)//Кнопка 2
m=1;
switch(m)
{
case 0: plus();break;
case 1: minus();break;

}

if (n==1) PORTD.0=1; //Проверка значения переменной
if (n==2) PORTD.1=1;
if (n==3) PORTD.2=1;
if (n==4) PORTD.3=1;

};
}

Кнопка 1 - PORTB.1
Кнопка 2 - PORTB.2

Помогите мне пожалуйста.

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 20:16:52
vitalik_1984
Непонятны махинации с определением нажатия у вас нажатая кнопка 0 или 1?

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

f (PINB.1==0)
delay_ms(10);
while (PINB.1==1){}// <<---Тут может зависнуть насовсем, если нажатая кнопка 0
if (PINB.2==0)
delay_ms(10);
while (PINB.2==1){}
n++;
 
Тут лишний switch

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

{
if (PINB.1==0)//Кнопка 1
/*m=0;*/plus();
if (PINB.2==0)//Кнопка 2
/*m=1;*/minus();
//switch(m)
//{
//case 0: plus();break;
//case 1: minus();break;

//}    

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 20:27:21
menzoda
Я не знаю, что там конкретно не работает, но хочу сказать несколько слов по поводу вышеприведенного способа реализации этого всего. Хочу сказать, потому что выглядит это мягко говоря не очень - логика работы размазана по всему коду, особенно бросается в глаза куча циклов во всех местах, хотя можно обойтись одним-двумя.

Исходя из имеющихся на данный момент условий задачи я вижу следующий вариант решения:
0. Выполняем инициализацию периферии.
1. Сканируем нажатые кнопки. Если какая-либо кнопка нажата, то переходим в 2, иначе в 1.
2. Обрабатываем нажатие на кнопку, и соотв. образом изменяем значение переменной.
3. В зависимости от значения переменной выполняем нужное действие.
4. Переходим в 1.

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

В нашем конкретном случае у нас будет автомат с тремя состояниями. Условно назовем их начальным состоянием (0), состоянием увеличения переменной (1), и состоянием уменьшения переменной (2). Логику работы автомата можно описать следующим образом:
Состояние 0.
- Если нажата кнопка 1, то переходим в Состояние 1.
- Если нажата кнопка 2, то переходим в Состояние 2.
Состояние 1.
- Если нажата кнопка 1, то ничего не делаем.
- Если нажата кнопка 2, то увеличиваем значение переменной и переходим в Состояние 0.
Состояние 2.
- Если нажата кнопка 1, то уменьшаем значение переменной и переходим в Состояние 0.
- Если нажата кнопка 2, то ничего не делаем.

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

Конечно, можно было просто дать готовый кусок кода, но я все же надеюсь ты пойдешь путем настоящего джедая. Если нет - забудь все, что я тут написал, кто-нибудь да выложит рабочий код, который можно будет использовать особо в него не вникая. Если да - то пробуй и показывай, что получается.

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 20:33:41
vitalik_1984
menzoda, молодчик подошел с аналитической точки зрения :))
Я то глупец, сразу готовый код пихнул. Сырой, правда.

Тут еще важный момент, если эти кнопки не бывают нажатыми обе одновременно и только последовательное нажатие приводит к смене состояния, то нужно еще предусмотреть таймаут для исключения ложных срабатываний.
Например нажали одну,вторую, потом опять первую и ушли,
Далее нужно в другую сторону двигать, нажимаем на вторую и получается снова сработает.

Re: Подсчет количества нажатий кнопок

Добавлено: Ср дек 26, 2012 22:35:50
menzoda
vitalik_1984

Да, насчет этого можно подумать, просто автор не указал, как ему хотелось бы реагировать на такие ситуации.

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 29, 2012 12:30:00
phenomen
Похоже, что ТС нашел готовый код. Очередной бой проигран, увы...

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 29, 2012 14:54:16
menzoda
Очень жаль.

Re: Подсчет количества нажатий кнопок

Добавлено: Сб дек 29, 2012 21:21:17
vitalik_1984
М-да
СпойлерИзображение