 |
|
|
|
| Автор |
Сообщение |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 18 Апр 2007, 15:00 Заголовок сообщения: Алгоритм обработки кнопок (без матриц) |
|
|
Избитая тема, но не нашел нормального описания ... везде "чисто академичные случаи" ... или простые примеры с одной кнопкой на прерывании.
Для проработки вопроса предлагаю такие условия:
- нужна программа-минимум - без крутых наворотов ...
- рассматриваем небольшое к-во кнопок ... 4 штуки вполне хватит.
- не рассматриваем схемы подключения и сканирования кнопок.
- в основном цикле клавиатура представлена "словом состояния клавиатуры" - и больше никаких заморочек по клавиатуре.
- преывания внешние не используем ... доступен только таймер.
- не поднимаем спор о времени сканирования 10 или 20 мс и точка
- для расширений возможней кнопок допускаются варианты нажатий:
- различие по к-ву нажатий кнопок (одна/несколько)
- по времени нажатий (короткое/длительное)
- автоповтор НЕ ДЕЛАЕМ это уже круто
Жизненный цикл события нажатия кнопки можно разделить на следующие этапы:
- (0) сканируем состояния кнопок и записываем в внутренний буфер "слово текущего состояния кнопок" (МЕТОДЫ СКАНИРОВАНИЯ ЗДЕСЬ НЕ РАССМАТРИВАЕМ - о этом много написано)
- (1) избавляемся от дребезга
- (2) определяем состояние кнопки, записываем в "слово состояния клавиатуры"
- (3) в основной программе обрабатываем слово состояния клавиатуры и модифицируем его для сброса обработанного состояния.
Нашел один интересный пост - советую почитать ... но там уж очень крутая обработка описана ... слишком ресурсоемкая.
Для избежания разночтений предлагаю следующую терминологию
Состояния кнопки в данный момент (используется в драйвере клавиатуры - в основном цикле не видно и не используется)
0 -- кнопка придавлена
1 -- кнопка отжата
Состояния кнопки:
НЕ_НАЖАТА -- нормальное состояние кнопки ... кнопка вверху и никто ее не трогает
ПРЕДНАЖАТА -- первый переход линии с 1-0 ( 1->0 начало дребезга)
НАЖАТА -- факт нажатия кнопки ... после дребезга кнопку нажали (1->0 дребезг обработан)
ДОЛГО_НАЖАТА -- факт длительного удержания кнопки (0 ... 0 )
ОТПУЩЕНА -- факт отпускания кнопки (0->1)
Иные параметры:
Т_ДЛ -- время длительного нажатия кнопки
СОСТ_КЛ -- слово состояния клавиатуры (его организация не определена пока - это вопрос (2))
Все добавления терминологии буду дописывать в этот пост ... просматривайте его, если где что не ясно.
Прошу не приводить километражи асм-кода ... "у меня сделано так" ... нужен алгоритм, а не конкретная реализация ... так-как имея алгоритм можно реализовать на чем угодно.
Прошу думать, что Вы пишите, и думать всё ли вы написали - не бросайте, пжлст, по 5 постов подряд с предложением в каждом.
Свой надуманный вариант пока не предлагаю ... для "чистоты" Ваших мыслей.
_________________ AndryG |
|
| Вернуться к началу |
|
 |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 18 Апр 2007, 15:26 Заголовок сообщения: |
|
|
алгоритм - это считать количество 0 и 1 на входе - если преобладает то или иное - нажата или отжата. Грубо, но действенно.
_________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 18 Апр 2007, 16:13 Заголовок сообщения: |
|
|
действительно, но академически ... в таком стиле уже много написано ... куда и как мне дальше приткнуть эти 0 и 1 ? Как в программе устроить обработку этого потока, как его сохранить удобней, как его интерпретировать? Как удобней хранить и обрабатывать?
Давайте конкретизируем задачу.
Есть 4 (К0-К3) кнопки. Опрос клавиатуры ведется в таймере каждые 10 мс.
В устройстве предусмотрены варианты использования кнопок:
- одиночное короткое нажатие ( плюс, минус, перебор вариантов)
- одиночное длительное нажатие (смена режима, подтверждение выбора)
- множественное длительное нажатие (две и больше кнопки нажаты одновременно длительное время - заходим в особо важные настройки, отключаем/включаем особые режимы работы)
вариант длительного множественного нажатия не рассматриваем - это цирк будет - попасть одновременно и сразу отпустить три кнопки - точно цирк
Как это удобно организовать? Потом постараюсь масштабировать.
_________________ AndryG |
|
| Вернуться к началу |
|
 |
avr123.nm.ru Знатный посетитель (>20)

Зарегистрирован: 07.08.2006 Сообщения: 67
|
Добавлено: 18 Апр 2007, 17:10 Заголовок сообщения: |
|
|
| Я конденсаторы параллельно контактам уважаю.
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 19 Апр 2007, 7:10 Заголовок сообщения: |
|
|
| Цитата: | | - не рассматриваем схемы подключения и сканирования кнопок. |
Про конденсаторы и т.д. и .т.п все форумы говорят ... а дальше ни слова.
Есть что сказать - говорите ... нет - слушайте.
_________________ AndryG |
|
| Вернуться к началу |
|
 |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 19 Апр 2007, 7:17 Заголовок сообщения: |
|
|
| AndryG писал(а): | д куда и как мне дальше приткнуть эти 0 и 1 ? Как в программе устроить обработку этого потока, как его сохранить удобней, как его интерпретировать? Как удобней хранить и обрабатывать?
|
Берутся 2 счетчика - какое-то время опрашивается вход. Если читается 0, то инкремент счетчика 0, если 1 - инкремент счетчика 1. В конце 2 числа сравниваются.
Я первый раз такое увидел при обработке сигнала от механического энкодера - такая "трещотка", как на микроволновке - считает количество импульсов от поворота колеса и, в зависимости от того, в какую сторону крутят, увеличение или уменьшение. Вверху кнопка для фиксации.
_________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
banzayy Живет здесь... (>100)


Зарегистрирован: 12.09.2006 Сообщения: 287 Откуда: Луганск
|
Добавлено: 19 Апр 2007, 16:18 Заголовок сообщения: |
|
|
есть пример в книге, есть книги по СИ для AVR. Для просмотра установить плагин DjVu
| Описание: |
|
 Файлообменник |
| Название файла: |
AtmelBook(Гребнев).part1.rar |
| Размер файла: |
1.91 MB |
| Скачено: |
1848 раз(а) |
|
|
| Вернуться к началу |
|
 |
banzayy Живет здесь... (>100)


Зарегистрирован: 12.09.2006 Сообщения: 287 Откуда: Луганск
|
Добавлено: 19 Апр 2007, 16:19 Заголовок сообщения: |
|
|
это продолжение
| Описание: |
|
 Файлообменник |
| Название файла: |
AtmelBook(Гребнев).part2.rar |
| Размер файла: |
1.83 MB |
| Скачено: |
916 раз(а) |
|
|
| Вернуться к началу |
|
 |
AlexBoy Частый гость (>5)

Зарегистрирован: 05.04.2007 Сообщения: 8
|
Добавлено: 19 Апр 2007, 17:15 Заголовок сообщения: |
|
|
Если нужно регистрировать одновременное нажатие только одной кнопки то делаю примерно так:
Готовый код возвращается в KeyStatus
| Код: |
volatile unsigned char last = 0, KeyStatus = 0, WaitDelay = 0;
void ProcessKeys(void)
{
unsigned char cur, new_press, new_release;
if (WaitDelay) // задержка на дребезг
{
--WaitDelay;
return;
}
cur = GetStatus(); // опрос порта
new_press = (last^cur) & cur; // выделяем новые нажатия
new_release = (last^cur) & last; // выделяем новые отпускания
last = cur;
if (new_press)
{
KeyStatus = new_press;
WaitDelay = 10; // дребезг нажатия
return;
}
if (new_release)
{
WaitDelay = 10; // дребезг отпускания
}
}
|
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 20 Апр 2007, 9:43 Заголовок сообщения: |
|
|
Не могу скачать архивы с предыдущих постов ... почти до конца доходит и обрывает
Люди, у вас получилось нормсально скачать? У меня проблемы или у сервера?
_________________ AndryG |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|