Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм
Никогда не подумал бы, что задам этот вопрос, но после долгих размышлений решил задать.
В устройствах на МК с малым количеством кнопок управления очень часто есть вынужденная необходимость разделять короткое и долгое нажатие кнопок. И в связи с этим вопрос: какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?
Очевидно же, что в момент нажатия предсказать, будет кнопка долго нажата или недолго, невозможно. Поэтому при алгоритме ПО НАЖАТИЮ всегда будет сначала выполнена функция по короткому нажатию, а затем функция по долгому нажатию. При алгоритме ПО ОТПУСКАНИЮ, естественно, будет выполнена нужная функция, но не сразу, а... потом, когда кнопку отпустят.
В итоге в обоих алгоритмах пользователь может попасть в ситуацию, когда происходит не то, что он ожидает.
Вот и вопрос: что же удобнее?
В устройствах на МК с малым количеством кнопок управления очень часто есть вынужденная необходимость разделять короткое и долгое нажатие кнопок. И в связи с этим вопрос: какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?
Очевидно же, что в момент нажатия предсказать, будет кнопка долго нажата или недолго, невозможно. Поэтому при алгоритме ПО НАЖАТИЮ всегда будет сначала выполнена функция по короткому нажатию, а затем функция по долгому нажатию. При алгоритме ПО ОТПУСКАНИЮ, естественно, будет выполнена нужная функция, но не сразу, а... потом, когда кнопку отпустят.
В итоге в обоих алгоритмах пользователь может попасть в ситуацию, когда происходит не то, что он ожидает.
Вот и вопрос: что же удобнее?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Проще всего провести натурные испытания.
Сделай 4 кнопки (2 кор + 2 длин по разному срабатывающих) и включение светодиода скажем и дай эту конструкцию разным людям.
Пусть скажут какие кнопки им оказались очевидней, логичней, предсказуемей...
Скорее всего будет так: короткое нажатие по отпусканию, длинное по заложенному времени.
Сделай 4 кнопки (2 кор + 2 длин по разному срабатывающих) и включение светодиода скажем и дай эту конструкцию разным людям.
Пусть скажут какие кнопки им оказались очевидней, логичней, предсказуемей...
Скорее всего будет так: короткое нажатие по отпусканию, длинное по заложенному времени.
Глупый не задает вопросы. Глупый и так все знает.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Я потому вопрос на форуме и задал, чтобы избежать долгих "статистических" экспериментов - каждый наверняка имеет опыт в использовании малокнопочных устройств, как самодельных, так и "настоящих" (например, наручные электронные часы). Просто поделиться опытом - вот и будет статистика.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Zyklon-B
- Потрогал лапой паяльник
- Сообщения: 376
- Зарегистрирован: Сб апр 15, 2017 02:30:29
- Откуда: Россия
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
В некотрых моделях цифровых ТВ приставок, как пример DEXP HD2991 две кнопки последовательного переключения программ при длительном удержании работают как кнопки регулиррвки громкости, если кратковременно нажимать эти кнопки, переключаются каналы, если нажать и удерживать какую либо кнопку, через пару секунд начинает изменятся уровень громкости, при отпускании уровень громкость перестаёт «ползти».
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
каналы переключаются в момент нажатия кнопки или при отпускании? т.е. когда хочется изменить громкость - сначала канал переключится, или нет?Zyklon-B писал(а):если кратковременно нажимать эти кнопки, переключаются каналы, если нажать и удерживать какую либо кнопку, через пару секунд начинает изменятся уровень громкости,
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Zyklon-B
- Потрогал лапой паяльник
- Сообщения: 376
- Зарегистрирован: Сб апр 15, 2017 02:30:29
- Откуда: Россия
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
ARV
При отпускании.
Нет. При нажатии кнопки сначала ничего не происходит, если нажать и сразу отпустить кнопку, переключится канал, если удерживать кнопку, через пару секунд на экране появится шкала громкости и уровень громкости изменится в ту или иную сторону, в зависимости от того, какую кнопку удерживать.
каналы переключаются в момент нажатия кнопки или при отпускании?
При отпускании.
т.е. когда хочется изменить громкость - сначала канал переключится, или нет?
Нет. При нажатии кнопки сначала ничего не происходит, если нажать и сразу отпустить кнопку, переключится канал, если удерживать кнопку, через пару секунд на экране появится шкала громкости и уровень громкости изменится в ту или иную сторону, в зависимости от того, какую кнопку удерживать.
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
при длительном удержании работают как кнопки регулиррвки громкости, если кратковременно нажимать эти кнопки, переключаются каналы,
дрочево по китайски
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
ARV писал(а):какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?
О чем вы там так долго думали?
С точки зрения логики, если у устройства на одну и ту же кнопку есть разные функции длинное и короткое нажатие, то, как думаете, долго нажимая на кнопку, будет ожидать пользователь что отработает короткое нажатие?
Если есть длинные, то только на отпускание, если только короткие - то на нажатие (пользователю будет понятно, что длинных нет).

У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
По нажатии ожидается антидребезг, после подтверждения запуск процедуры по заданному вектору и выход на ожидание отпускания.
Само первое прохождение сразу за подтверждением меняет указатель исполняемой функции на "исполнение при ожидании отпускания". А там - или счетчик сканов или собственный таймер длительности выставляем...

Само первое прохождение сразу за подтверждением меняет указатель исполняемой функции на "исполнение при ожидании отпускания". А там - или счетчик сканов или собственный таймер длительности выставляем...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
дело в том, что, например, в Windows при двойном клике кнопкой мышки сначала генерируется событие "нажата кнопка мышки", а следом впридачу генерируется событие "двойное нажатие кнопки мышки". и программист сам должен разобраться, когда как реагировать.RoboC писал(а):О чем вы там так долго думали?
в описанной проблеме ситуация схожая
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- JMC.Hard
- Мучитель микросхем
- Сообщения: 445
- Зарегистрирован: Ср сен 16, 2020 20:38:41
- Откуда: Краснодарский край, г.Абинск
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?
Думаю, при обработке длительности нажатия -- однозначно, только по отпусканию.
Функция обработки нажатия кнопки должна отследить факт её нажатия (устранить дребезг), включить счётчик длительности, определить факт отпускания (опять же дребезг) и установить значение в течении которого кнопка была нажата (просто признак длительного нажатия).
В основной программе вызываем эту функцию и спрашиваем: кнопка была нажата и длительно -- выполняем "длительное" нажатие, если была нажата и не долго -- выполняем "короткое" нажатие, ну а если не была нажата -- само дальше идёт.
У меня как-то так "нарисовалось"
Лучше сделать и жалеть, чем жалеть, что не сделал ...
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
многое зависит от алгоритма сканирования....

- JMC.Hard
- Мучитель микросхем
- Сообщения: 445
- Зарегистрирован: Ср сен 16, 2020 20:38:41
- Откуда: Краснодарский край, г.Абинск
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Ннну да
Но в общих-то чертах он пойдёт в любом случае. Алгоритм сканирования (или матрица кнопок, или каждая на свой вход контроллера) пусть и обрабатывается в функции, отвечающей за опрос нажатия. Пусть это будет хоть "линейно", хоть по прерыванию, но в общих чертах я бы так и реализовал, как подумалось.
В основную программу должно возвращаться "факт нажатия" и "признак длительности"
Но в общих-то чертах он пойдёт в любом случае. Алгоритм сканирования (или матрица кнопок, или каждая на свой вход контроллера) пусть и обрабатывается в функции, отвечающей за опрос нажатия. Пусть это будет хоть "линейно", хоть по прерыванию, но в общих чертах я бы так и реализовал, как подумалось.
В основную программу должно возвращаться "факт нажатия" и "признак длительности"
Лучше сделать и жалеть, чем жалеть, что не сделал ...
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Привет КотаФеям.
Длинное ,короткое нажатие кнопок определяю используя такие флаги.
(KeyS_Data) переменная
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/
Вот мой пример на ASM.
Длинное ,короткое нажатие кнопок определяю используя такие флаги.
(KeyS_Data) переменная
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/
Вот мой пример на ASM.
- Вложения
-
- Key_in.asm
- (4.33 КБ) 314 скачиваний
- ДядяВован
- Мучитель микросхем
- Сообщения: 477
- Зарегистрирован: Вс окт 25, 2020 22:13:25
- Откуда: Смоленск
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Я обычно делаю так. Кнопка генерит три события: нажата, отпущена, долго нажата. Причем, после "долго нажата" не бывает "отпущена".
Реальные действия выполняются по "отпущена" и "долго нажата". Если кнопка типа тактовой, со щелчком, то "нажата" можно игнорить. Если кнопка "мягкая", типа метал. антивандальной, то по "нажата" делаем какой-то beep, ну при наличии пищалки естественно. По событию "долго нажата" ИМХО очень желательно издавать какой-нибудь звук.
Реальные действия выполняются по "отпущена" и "долго нажата". Если кнопка типа тактовой, со щелчком, то "нажата" можно игнорить. Если кнопка "мягкая", типа метал. антивандальной, то по "нажата" делаем какой-то beep, ну при наличии пищалки естественно. По событию "долго нажата" ИМХО очень желательно издавать какой-нибудь звук.
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
В прерывании проверяем нажата ли кнопка, если да - то инкрементируем счётчик нажатия, если нет - то проверяем счётчик времени удержания , если он не равен нулю то произошёл отпуск кнопки, устананавливаем флаг отпуска . В основном цикле проверяем не установлен ли флаг отпуска , если да, то в зависимости от значения счётчика удержания ... выполняем нужные процедуры.
Добавлено after 4 minutes 15 seconds:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм
В прерывании по таймеру имелось ввиду.
Добавлено after 4 minutes 15 seconds:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм
В прерывании по таймеру имелось ввиду.
Не спрашивай по ком звонит колокол, он звонит по тебе !
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Также придерживаюсь мысли, что в большинстве случаев корректный вариант - это короткое нажатие по отпусканию, длинное по заложенному времени.
Вариант реакции "короткое нажатие" по нажатию кнопки имеет место быть только в случае, когда длинное нажатие или даблклик развивают событие по короткому нажатию.
Как в той же винде. Клик по иконке перемещает на неё фокус - это типовое действие. А потом второй клик "добивает" иконку, запуская её.
И да, по нажатию кнопки действительно, можно издать какой то бип, что бы пользователь понял, что его услышали. Тогда по отпусканию выполнить действие, уже без бипа. Или по таймауту уже бипнуть второй раз и выполнить действие по длинному нажатию.
Вариант реакции "короткое нажатие" по нажатию кнопки имеет место быть только в случае, когда длинное нажатие или даблклик развивают событие по короткому нажатию.
Как в той же винде. Клик по иконке перемещает на неё фокус - это типовое действие. А потом второй клик "добивает" иконку, запуская её.
И да, по нажатию кнопки действительно, можно издать какой то бип, что бы пользователь понял, что его услышали. Тогда по отпусканию выполнить действие, уже без бипа. Или по таймауту уже бипнуть второй раз и выполнить действие по длинному нажатию.
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Тайминги антидребезга, определения удержания, паузы двойного нажатия ещё зависят от типа применённых кнопок. Ну и конечно присутствует известная доля субъективизма. За долгое время использование стандартных тактовых кнопок прижились такие тайминги:
- антидребезг 5-15 мс.
- время определения двойного нажатия: 200-340мс
- удержание: 350-900мс.
Еще нужно учитывать неодновременность нажатия и отпускания, при действиях с несколькими кнопками.
Пример кода для одной кнопки:
- антидребезг 5-15 мс.
- время определения двойного нажатия: 200-340мс
- удержание: 350-900мс.
Еще нужно учитывать неодновременность нажатия и отпускания, при действиях с несколькими кнопками.
Пример кода для одной кнопки:
Спойлер
Код: Выделить всё
#define KDEBOUNCE 11
#define KUPRESS 350
#define KDOUBLEMAX 300
static uint16_t Counter_KX = 0, Counter_KDouble = 0;
// период вызова: 1мс
// нажатие ----------
if (!K1_GET()) // нажато
{
if (Counter_KX < 10000) Counter_KX++; // считаем время в нажатом состоянии
if (Counter_KX == KUPRESS) // удержание
{
Flags |= BIT(KEY1_U);
Counter_KDouble = 0; // стоп счетчика паузы между двумя нажатиями
}
}
else // отпущено
{
if ((Counter_KX > KDEBOUNCE)&&(Counter_KX < KUPRESS)) // окончивщееся нажатие засчитано (длиннее паузы антидребезга и короче удержания)
{
if (Counter_KDouble == 0) // это первое нажатие
{
Counter_KDouble = 1; // разрешаем считать паузу между двумя нажатиями
}
else if ((Counter_KDouble > KDEBOUNCE)&&(Counter_KDouble < KDOUBLEMAX)) // это не первое нажатие и предыдущее нажатие было не позже заданного интервала
{
Flags |= BIT(KEY1_DP);
Counter_KDouble = 0; // стоп счетчика паузы между двумя нажатиями
}
}
Counter_KX = 0;
}
if (Counter_KDouble != 0) // если разрешено считаем время после отпускания
{
Counter_KDouble++;
if (Counter_KDouble >= KDOUBLEMAX) // достигли конца интервала определения второго нажатия
{
Flags |= BIT(KEY1_P); // засчитанно
Counter_KDouble = 0; // стоп счетчика паузы между двумя нажатиями
Counter_KX = 0; // вдруг еще нажато, перевзводим удержание
}
}
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Всем спасибо за мнения, соглашусь с большинством: реакция по отпусканию предпочтительнее.
С реализацией алгоритма проблем нет.
Не совсем понятно, зачем нужен 7-й бит? Есть же 4-й и более младшие, по-моему, однозначно сообщающие о том, что нажато или отжато.
С реализацией алгоритма проблем нет.
(KeyS_Data) переменная
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/
Не совсем понятно, зачем нужен 7-й бит? Есть же 4-й и более младшие, по-моему, однозначно сообщающие о том, что нажато или отжато.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго
Привет КотаФеям.
4 бит устанавливается и сбрасывается подпрограммой скана кнопок.
7 бит а также 6 и 5 биты сбрасывают при необходимости подпрограммы использующие ввод кнопок.
У меня некоторые подпрограммы следят за битами 6,5,4 и не учитывают факт отжатия кнопок.
7 бит можно считать как достоверное короткое нажатие.
4 бит устанавливается и сбрасывается подпрограммой скана кнопок.
7 бит а также 6 и 5 биты сбрасывают при необходимости подпрограммы использующие ввод кнопок.
У меня некоторые подпрограммы следят за битами 6,5,4 и не учитывают факт отжатия кнопок.
7 бит можно считать как достоверное короткое нажатие.


