25.01.2013, 00:11
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Помогите с обработкой кнопок в CVAVR
Сразу сильно не пинайте, я только учусь.
Обрабатываю однократное нажатие кнопок в CVAVR:
PHP код:
|
if(!PINB.1){ //ели нажата кнопка 1, то однократно
if(!PINB.2) Key=3; //отрабатывается Key=4, а если кнопка2,
else Key=4;} //то отрабатывается Key=3
else Key=0; //ели ничего не нажато
|
Кнопка на PINB.1 отрабатывается нормально, а на PINB.1 не работает.
Что не так?
Последний раз редактировалось Dimitrij; 25.01.2013 в 00:13.
|
|
|
|
25.01.2013, 00:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.11.2008
Адрес: г.Смоленск
Сообщений: 2,018
Сказал спасибо: 348
Сказали Спасибо 1,024 раз(а) в 552 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Исправте последнее предложение.
У вас PINB.2 будет отрабатываться, если нажата PINB.1.
Задумывалось то как?
|
|
|
|
25.01.2013, 00:43
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Сообщение от Saadov
|
Задумывалось то как?
|
Если нажать на кнопку1 (PINB.1), то однократно сработает Key=4,
а ели на кнопку2 (PINB.2), то однократно сработает Key=3.
Если код такой:
PHP код:
|
if(!PINB.1) Key=4;
else Key=0;
if(!PINB.2) Key=3;
else Key=0;
|
то срабатывает только Key=3
Что-то совсем запутался.
|
|
|
|
25.01.2013, 01:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.11.2008
Адрес: г.Смоленск
Сообщений: 2,018
Сказал спасибо: 348
Сказали Спасибо 1,024 раз(а) в 552 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
PHP код:
|
int kn, Key = 0; while(1) { if(!PINB.1){ kn = 0; delay_ms(20); while (PINB.1 == kn); Key=4; }; if(!PINB.2){ kn = 0; delay_ms(20); while (PINB.2 == kn); Key=3; }; };
|
В вашем случае мы нажали PINB.1 и присвоили переменной Key значение 4, дальше у нас по ходу действия программы проверяется нажата ли PINB.2, если не нажата, то Key присваивается значение 0, т.е вы почти сразу же обнуляете Key.
Код выше работает так, вы нажали кнопку, ждем 20 мсек пока пройдет дребезг, снова проверяем не изменилось ли состояние кнопки, ждем пока изменится и присваиваем переменной нужное значение.
|
|
|
|
25.01.2013, 01:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.11.2008
Адрес: г.Смоленск
Сообщений: 2,018
Сказал спасибо: 348
Сказали Спасибо 1,024 раз(а) в 552 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Ах да, если ни одна кнопка не нажата, то у вас Key будет равен 0, если хоть одна нажата, то при обработке значения Key, просто обнуляете Key, т.е.
PHP код:
|
switch(Key){
case 4: Key = 0; //делаем что-то, если нажата кнопка 1
break;
case 3: Key = 0; //делаем что-то, если нажата кнопка 2
break;
};
|
|
|
|
|
25.01.2013, 01:47
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Сообщение от Saadov
|
Код выше работает так, вы нажали кнопку, ждем 20 мсек пока пройдет дребезг, снова проверяем не изменилось ли состояние кнопки, ждем пока изменится и присваиваем переменной нужное значение.
|
Но мне нужно, чтобы при отпускании кнопки значение переменной вернулось в исходное (Key=0), а при Вашем коде оно не возвращается.
У меня загвоздка как раз в том, чтобы при отпускании кнопки вернуть исходное значение.
Может, я изначально не так поставил вопрос?
Код функции:
PHP код:
|
unsigned char KEYPRESS (void);
int kn, Key = 0;
unsigned char KEYPRESS ()
{
if(!PINB.1){ kn = 0; delay_ms(20); while (PINB.1 == kn); Key=4; };
if(!PINB.2){ kn = 0; delay_ms(20); while (PINB.2 == kn); Key=3; };
return(Key);
};
|
|
|
|
|
25.01.2013, 02:37
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Можно так сделать: при нажатии однократно вернётся ненулевое значение, в остальных случаях возвращает 0
PHP код:
|
unsigned char KEYPRESS (void);
unsigned char oldPIN1=1; unsigned char oldPIN2=1;
unsigned char KEYPRESS () { if(!PINB.1) { if(oldPIN1) { oldPIN1=0; return 4; } } else oldPIN1=1; if(!PINB.2) { if(oldPIN2) { oldPIN2=0; return 3; } } else oldPIN2=1; return 0; }
|
Последний раз редактировалось Yurkin2007; 25.01.2013 в 02:44.
|
|
|
|
25.01.2013, 11:39
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Сообщение от Saadov
|
делаем что-то, если нажата кнопка
|
Что-то в этом коде я ничего не пойму. Как программа поймет, на каком порту какая кнопка нажата?
|
|
|
|
25.01.2013, 11:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Key=0;
if(!PINB.1) Key=4;
if(!PINB.2) Key=3;
При одновременно нажатых кнопках Key=3;
Если надо обрабатывать обе кнопки - вам к битовым операциям
Key=0;
if(!PINB.1) Key |= (1 ‹‹ 1);
if(!PINB.2) Key |= (1 ‹‹ 2);
Нажатия конопок:
ничего не нажато - 0
Нажата первая кнопка - 2
Нажата вторая кнопка - 4
Нажаты обе кнопки - 6
Последний раз редактировалось Wiza_; 25.01.2013 в 11:52.
|
|
|
|
25.01.2013, 12:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Помогите с обработкой кнопок в CVAVR
Сообщение от Wiza_
|
Key=0;
if(!PINB.1) Key=4;
if(!PINB.2) Key=3;
При одновременно нажатых кнопках Key=3;
Если надо обрабатывать обе кнопки - вам к битовым операциям
Key=0;
if(!PINB.1) Key |= (1 ‹‹ 1);
if(!PINB.2) Key |= (1 ‹‹ 2);
Нажатия конопок:
ничего не нажато - 0
Нажата первая кнопка - 2
Нажата вторая кнопка - 4
Нажаты обе кнопки - 6
|
сдвиги то зачем?
Key = PINB & 6;
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:31.
|
|