реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
ReAl
сообщение Feb 12 2010, 05:56
Сообщение #31


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Corvus @ Feb 11 2010, 15:47) *
А простой инкремент/декремент чем не угодил? rolleyes.gif

Если Вы о коде Oleg IT - то вдумайтесь просто в этот код :-)
Там на трёх 32-битных переменных реализовано тридцать два 3-битовых счётчика и они все инкрементируются одновремённо теми несколькими операторами.
vertical counters называется.

Да ещё и переносы счётчиков авоматически все сгруппированы в одно 32-битное слово "напротив соответствующих им кнопок".
Да ещё и сбрасываются счётчики кнопок, у которых значение не установилось, также "коротким движением руки" и без горсти if.

По другому, "простым инкрементом" это так компактно и быстро не выйдет.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 12 2010, 06:58
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
я лично на точно таких же принципах

о чем тогда речь?

на счет автоповторов. единичное нажатие регистрируется как единичное нажатие и приводит к некоторому действию. Действие происходит быстро. Если скорость повторения действий при нажатой кнопке не ограничивать, то в следствие частого опроса клавиатуры рискуем произ0вести несколько действий за одно нажатие (это мы думаем, что оно одно, а программа видит нажатую кнопку и действует как и положено). Вы вероятно имели ввиду, что одно нажатие должно приводить к одному действию? Это правильно, но на мой взгляд код компактнее если регулировать этот вопрос через "зону нечувствительности". Одним выстрелом два зайца - одно действие за одно нажатие и переход в автоповтор.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
muravei
сообщение Feb 12 2010, 08:18
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(smk @ Feb 12 2010, 09:58) *
в следствие частого опроса клавиатуры рискуем произ0вести несколько действий за одно нажатие

Чтобы так сильно не рисковать smile.gif стоит проверять не только нажатие , но и отпускание (с той же борьбой с дребезгом)
Go to the top of the page
 
+Quote Post
Corvus
сообщение Feb 12 2010, 09:09
Сообщение #34


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 24-04-08
Из: Зеленоград
Пользователь №: 37 056



Цитата(ReAl @ Feb 12 2010, 08:56) *
Если Вы о коде Oleg IT

Нет, я про сообщение Lexdaw.
А пример Oleg IT интересный.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 12 2010, 09:30
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Код
Чтобы так сильно не рисковать  стоит проверять не только нажатие , но и отпускание (с той же борьбой с дребезгом)

Это верно, но в моем случае удобней так как я сделал.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
andr_doy
сообщение Feb 12 2010, 09:50
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 12-09-06
Пользователь №: 20 300



давно и с большим успехом пользую следущий код
//.............................................................................
static unsigned char debounce_sw_left(void)
{
static uint16_t state2 = 0; //holds present state
state2 = (state2 << 1) | (! bit_is_clear(PORT_LEFT, PIN_LEFT)) | 0xE000;
if (state2 == 0xF000) return 1;
if (state2 == 0xE000) return 2;
return 0;
}
//.............................................................................
сдесь и подавление дребезга как на нажатие так и на отпускание

пример для одной кнопки
процедура вызывается по прерыванию от таймера

если будем анализировать код возврата 1 то получим кнопку с действием нажал и пока не отпустил
а если код возврата 2 то кнопка с автоповтором

у меня вызывается с по таймеру в 1 мс при том в конкретном прерывании сканируем только одну кнопку

если их к примеру 8 то все кнопки будут опрошены за 8мс

работает настолько все четко я даже сам удивляюсь
попробуйте
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 12 2010, 13:42
Сообщение #37


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ReAl @ Feb 12 2010, 09:56) *
Да ещё и переносы счётчиков авоматически все сгруппированы в одно 32-битное слово "напротив соответствующих им кнопок".
Да ещё и сбрасываются счётчики кнопок, у которых значение не установилось, также "коротким движением руки" и без горсти if.

По другому, "простым инкрементом" это так компактно и быстро не выйдет.

А счёт там идёт до скольки? До 8?
Через сколько вызовов функции получим валидное значение в debounced_state?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 12 2010, 14:26
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(smk @ Feb 12 2010, 11:58) *
Действие происходит быстро. Если скорость повторения действий при нажатой кнопке не ограничивать, то в следствие частого опроса клавиатуры рискуем произ0вести несколько действий за одно нажатие (это мы думаем, что оно одно, а программа видит нажатую кнопку и действует как и положено).
Это проблема вовсе не клавиатуры, а UI (User Interface - пользовательский интерфейс) и к клавиатуре она не имеет непосредственного отношения.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 07:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016