|
Удержание кнопки 6 секунд |
|
|
|
Apr 3 2009, 07:13
|
Группа: Участник
Сообщений: 4
Регистрация: 25-05-08
Пользователь №: 37 799

|
Подскажите с алгоримом удержания кнопки 6 секунд. Опрос кнопок реализован, оталось сделать что бы при нажатии выводилась уставка прибора, а при удержании 6 секунд войти в меню, прибора. Я пока сделал, что при нажатии сразу в меню попадаю, но требуют вывод уставки и 6 секунд.
|
|
|
|
|
 |
Ответов
|
Apr 3 2009, 10:10
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Apr 3 2009, 10:46
|

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

|
Цитата(MrYuran @ Apr 3 2009, 12:10)  Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно. Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете: Цитата Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы , но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? (Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно...
|
|
|
|
|
Apr 3 2009, 11:18
|

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

|
Цитата(Herz @ Apr 3 2009, 13:46)  Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете: , но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? (Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно... По отпусканию кнопки неудобно! Представте пользователя.. он нажал кнопку.. и ждет перехода в режим меню.. и думает -"прошло ли 6секунд или нет? можно ли отпускать клавишу?"... И что? А если после нажатия считать интервал времени. Если прошло 6 секунд, а кнопка нажата то переходить в меню. Если отпустили раньше другое действие. Защита от залипания так: прошло , к примеру, 12секунд а кнопа нажата.. то ахтунг и т.д.
Причина редактирования: Устранение дублирования в содержании сообщения.
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|