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

 
 
> Удержание кнопки 6 секунд
decsal
сообщение Apr 3 2009, 07:13
Сообщение #1





Группа: Участник
Сообщений: 4
Регистрация: 25-05-08
Пользователь №: 37 799



Подскажите с алгоримом удержания кнопки 6 секунд.
Опрос кнопок реализован, оталось сделать что бы при нажатии выводилась уставка прибора, а при удержании 6 секунд войти в меню, прибора.
Я пока сделал, что при нажатии сразу в меню попадаю, но требуют вывод уставки и 6 секунд.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Apr 3 2009, 10:10
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



да...
пора уже коллекцию ФАКов собирать...
или ссылок на них...
чтобы заново каждый раз не вбивать...

Значит так. Проверенный самой Жизнью алгоритм.
1. По таймеру (T=1,2,5,10... ms) сканируем кнопки.
2. Если ничего не нажато, сбрасываем все флаги (эвенты)
3. Если что-то нажато, сравниваем с предыдущим состоянием.
Если совпадает, инкрементируем счётчик тиков. Если нет, сбрасываем счётчик и все флаги (дребезг)
4. Если счётчик >= задержки антидребезга, выставляем флаг KeyPressed
5. Если счётчик >= задержки залипания (1,2,6 секунд), выставляем флаг "Locked"

Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы

Цитата(Herz @ Apr 3 2009, 13:40) *
По-моему, по нажатию кнопки просто следует запускать таймер для определения времени нажатого состояния (с учётом возможного дребезга, конечно). И только после отжатия принимать решение о переходе в нужное место программы.

Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно.

Вот, дарю на память...
CODE

//********************************************************************************
// Функция сканирования клавиатуры (запускается по таймеру)
// © MrYuran
//********************************************************************************
void KbrdScan()
{
if(kbrd_in & lock) // Проверяем ключ блокировки клавиатуры
{
Mode |= Locked;
kbrd_out &= ~kbrd;
}
else
{
Mode &= ~Locked;
kbrd_out |= kbrd;
}

unsigned char temp = kbrd_in&0xf0;

if((temp != 0) || (Kbrd.scanned != 0)) // что-то нажато
{
if(temp != Kbrd.scanned) // дребезг
{
Kbrd.scanned = temp;
Kbrd.PressedTime = 0;
Kbrd.pressed = 0;
}
else // вроде уже не дребезг
{
Kbrd.scanned = temp;
Kbrd.PressedTime ++; // считаем время нажатия
if(Kbrd.PressedTime == press_delay) // кнопка считается нажатой
{
if(!(Kbrd.pressed & KeyLocked)) // если не залипла
{
//Beep(50); // пикаем
Kbrd.pressed = Kbrd.scanned | KeyTick; // выставляем код кнопки и тик
//Kbrd.PressedTime = 0;
}
}
if(Kbrd.PressedTime == lock_delay) // кнопка считается залипнутой
{
Kbrd.pressed |= KeyLocked; // выставляем флаг залипания
Kbrd.PressedTime = 0;
Kbrd.pressed |= KeyTick;
}
if(Kbrd.PressedTime == lock_interval) // быстрые тики при залочке
{
if(Kbrd.pressed & KeyLocked) // если залипнута
{
Kbrd.PressedTime = 0;
Kbrd.pressed |= KeyTick;
}
}
}
}
}


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Herz
сообщение Apr 3 2009, 10:46
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(MrYuran @ Apr 3 2009, 12:10) *
Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно.

Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете:
Цитата
Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы
, но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? rolleyes.gif
(Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно...
Go to the top of the page
 
+Quote Post
adc
сообщение Apr 3 2009, 11:18
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Цитата(Herz @ Apr 3 2009, 13:46) *
Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете:
, но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? rolleyes.gif
(Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно...


По отпусканию кнопки неудобно! Представте пользователя.. он нажал кнопку.. и ждет перехода в режим меню.. и думает -"прошло ли 6секунд или нет? можно ли отпускать клавишу?"... И что?
А если после нажатия считать интервал времени. Если прошло 6 секунд, а кнопка нажата то переходить в меню. Если отпустили раньше другое действие. Защита от залипания так: прошло , к примеру, 12секунд а кнопа нажата.. то ахтунг и т.д.
Причина редактирования: Устранение дублирования в содержании сообщения.


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- decsal   Удержание кнопки 6 секунд   Apr 3 2009, 07:13
- - Stanislav_S   Цитата(decsal @ Apr 3 2009, 11:13) Подска...   Apr 3 2009, 07:28
- - ukpyr   можно завести счетчик нажатия и запоминать предыду...   Apr 3 2009, 08:55
- - Herz   По-моему, по нажатию кнопки просто следует запуска...   Apr 3 2009, 09:40
- - ukpyr   ЦитатаИ только после отжатия принимать решение о п...   Apr 3 2009, 10:00
|- - Herz   Цитата(ukpyr @ Apr 3 2009, 12:00) и польз...   Apr 3 2009, 10:05
|- - Stanislav_S   Цитата(adc @ Apr 3 2009, 15:18) По отпуск...   Apr 3 2009, 12:04
|- - _Pasha   Цитата(Stanislav_S @ Apr 3 2009, 15:04) С...   Apr 4 2009, 14:54
|- - Stanislav_S   Цитата(_Pasha @ Apr 4 2009, 18:54) Этот м...   Apr 4 2009, 21:07
- - ukpyr   ЦитатаMrYuranне нужно никаких флагов, состояние кл...   Apr 3 2009, 12:02
- - rezident   Внесу свои 5 копеек. Поскольку как я понял у топик...   Apr 4 2009, 21:02
- - C.S.   Ребят, а подскажите, как лучше сделать обработку д...   May 7 2009, 09:52
|- - MrYuran   Цитата(C.S. @ May 7 2009, 13:52) У меня п...   May 7 2009, 10:36
- - C.S.   Значит, я мыслю верно, но туплю насчёт моментов на...   May 7 2009, 11:45
|- - MrYuran   Цитата(C.S. @ May 7 2009, 15:45) В общем ...   May 7 2009, 12:19
- - C.S.   Посмотрите пожалуйста алгоритм, если не сложно, на...   May 7 2009, 12:55
- - Genadi Zawidowski   в аттаче - файл keyboard.c все Ваши проблемы там р...   May 7 2009, 17:49
|- - C.S.   Цитата(Genadi Zawidowski @ May 7 2009, 21...   Jun 7 2009, 18:36
- - C.S.   Спасибо! Сейчас посмотрю, поразбираюсь.   May 7 2009, 17:56
- - C.S.   2Genadi Zawidowsk... А можно один вопросик? У нас ...   May 10 2009, 00:46
|- - Genadi Zawidowski   Цитата(C.S. @ May 10 2009, 04:46) 2Genadi...   May 10 2009, 06:10
|- - Genadi Zawidowski   Цитата(C.S. @ May 10 2009, 04:46) 2Genadi...   May 10 2009, 23:24
- - C.S.   Да, конечно. Интересно это всё на асм переводить %...   May 11 2009, 14:45
|- - Genadi Zawidowski   Цитата(C.S. @ May 11 2009, 18:45) Да, кон...   May 11 2009, 17:49
- - C.S.   *стало стыдно* Я делаю для себя. Знаю, что на проф...   May 12 2009, 07:59
|- - MrYuran   Цитата(C.S. @ May 12 2009, 11:59) думаю, ...   May 12 2009, 12:39
- - Genadi Zawidowski   ЦитатаЯ делаю для себя Если Вы заметили, этот прое...   May 12 2009, 09:24
|- - VladimirYU   Цитата(Genadi Zawidowski @ May 12 2009, 13...   May 12 2009, 09:58
|- - Genadi Zawidowski   Цитата(VladimirYU @ May 12 2009, 13:58) Е...   May 12 2009, 15:06
- - C.S.   Вас понял. В следующих девайсах попробую на СИ. Хо...   May 12 2009, 09:36
- - rezident   Сообщение модератора. Уважаемые, пользователи...   May 12 2009, 16:41
- - ukpyr   ЦитатаПока вожусь на Меге8 (то, что было) - думаю,...   Jun 7 2009, 19:06


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:06
Рейтинг@Mail.ru


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