Перейти к содержанию
    

Удержание кнопки 6 секунд

У меня пока что флаги PRESSED и LOCKED стоят битами (на все кнопки), и ещё есть биты, которые показывают нажатие каждой кнопки.

Может, завести для каждой клавиши свой набор флагов? :blink:

У меня был один набор флагов на всю клавиатуру (4 кнопки).

Комбинации одновременных нажатий максимум из 2-х кнопок (больше нажать затруднительно :) ).

Все кнопки заведены на один порт, соответственно скан-код - общий на все кнопки. Фактически это состояние порта с наложенной маской в 4 бита.

Любое изменение кода (нажатие/отжатие кнопок) воспринимается как дребезг и сбрасывает флаги.

 

Если кнопки полностью автономные и нужно их обсчитывать по отдельности, тогда нужно для каждой свой набор флагов.

 

З.Ы. Пишу на АСМе, на Си мне вообще ни черта не понятно

Вот это зря... Что непонятно...

А насчёт 100 байт - что такое 100 байт в масштабах галактики!

Иногда лишний флажок компилятора помогает утоптать код на несколько кил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит, я мыслю верно, но туплю насчёт моментов нажатия и отпускания.

1. Определили нажатие кнопки.

2. Считаем счётчик. По достижении защиты от дребезга выставим информацию "Кнопка ХХ нажата"

3. Считаем дальше. Досчитали до какого-то значения, выставляем информацию "Кнопка ХХ нажата долго"

4. Определили отпускание. Ставим информацию "Кнопка ХХ отпущена".

 

Основная программа, как мне видится, должна работать так:

Найден флаг "Кнопка ХХ нажата" -> скинули флаг (чтобы не пройти это услвие второй раз), обработали реакцию на нажатие

Аналогично с "Кнопка ХХ нажата долго" и с "Кнопка ХХ отпущена".

 

То-есть, по моей логике получается три варианта флагов. Меня смущает само мышление - так вообще люди делают? Я могу завести тогда (пока мало кнопок) - три регистра, по числу кнопок, и в каждом битами ставить свои флаги?

 

З.Ы. Хм, а что такое 100 байт в масштабах меги 8? ;)

Пока писал на АСМе, и никак не могу представить СИ в МК - он как-то тут неявно... в асме всё чётко - LDI Rx, 123. А в СИ это как-то непривычно.

 

В общем меня интересует именно обход последующих реакций "нажатия" на кнопку, если пользователь её ещё не отпустил.

При этом скан у меня идёт по таймеру. Вот я и думаю в направлении флагов - после обработки реакции на нажатие флаг сбрасывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем меня интересует именно обход последующих реакций "нажатия" на кнопку, если пользователь её ещё не отпустил.

При этом скан у меня идёт по таймеру. Вот я и думаю в направлении флагов - после обработки реакции на нажатие флаг сбрасывается.

Вот в том куске, который я выкладывал, есть ещё флажок "Key_Tick", который выставляется для вызова обработчика кнопки.

Идея была такая. Например, при коротких нажатиях на кнопки "Вверх/Вниз" нужно было изменять параметр на 1. После залипания (через 1с) должна начинаться быстрая "прокрутка" (10 тиков в секунду).

Соответственно, сделал так:

После антидребезговой паузы ставлю первий "тик".

После залочки тики следуют с уменьшенными интервалами.

По каждому тику вызывается обработчик, в конце которого Key_Tick сбрасывается.

Ну и вообще комбинацией этих флагов можно описать практически любую ситуацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите пожалуйста алгоритм, если не сложно, на предмет камней. Нарисовал на примере одной кнопки.

KeyScan.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в аттаче - файл keyboard.c все Ваши проблемы там решены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Genadi Zawidowsk...

А можно один вопросик? У нас же kbd_press при таком написании: switch (++ kbd_press) сначала инкрементируется, потом сравнивается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Genadi Zawidowsk...

А можно один вопросик? У нас же kbd_press при таком написании: switch (++ kbd_press) сначала инкрементируется, потом сравнивается?

да, так и задумано...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Genadi Zawidowsk...

А можно один вопросик? У нас же kbd_press при таком написании: switch (++ kbd_press) сначала инкрементируется, потом сравнивается?

Надеюсь, Вы заметили что эта строка относится к автоповтору, а не к фиксации удержанного нажатия клавиши?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, конечно. Интересно это всё на асм переводить %)

ОХ! вот, оказываеттся, чем Вы занимаетесь! Сказали бы - я тихо бы молчал... У Вас, я понимаю, времени еще много впереди?

А попробовать свою задачу на С изобразить времени нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

*стало стыдно* Я делаю для себя. Знаю, что на профессиональный уровень не выйду. Наверное, интересно повозиться.

Хочу в итоге получить управляемый диммер. Пока вожусь на Меге8 (то, что было) - думаю, туда СИ и реалтайм под диммер не влезут просто.

Зато, в принципе, переводя, можно поучиться и оптимизировать и понимать, что происходит в проце.

Хотя, конечно, я могу быть старомодным... ибо лет 5 назад возился с MCS51, потом забросил.

 

В любом случае спасибо. Постараюсь не поднимать флуд на тему СИ vs ASM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делаю для себя

Если Вы заметили, этот проект, что отдан на растерзание - тоже сделан для себя, для радиолюбительских целей.

С желанием повозиться поспорить не могу, но вот этим проектом я вожусь уже довольно долго - около двух лет - и желание дорабатывать и менять его не зависит от языка. Просто "возня" переходит на другой уровень - на функциональность, на ясность кода, на то, что доставляет больше удовольствия - в конце концов на пользование готовыми изделиями.

 

Я возился со всем (почти со всем) кроме mcs51. И работающее изделие на новом для меня AVR появилось за несколько часов после того, как я принес домой первый купленный мною в магазине ATMega162 и спаял stk200. С ассемблером разбираться не стал - а просто засунул в него один из старых проектов для Intel386.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вас понял. В следующих девайсах попробую на СИ. Хотя асм кое-где интереснее... все же.

Ну это, как и на компе. Если надо пару кнопочек - то берём, скажем, VB. Если точность и быстроту - например VC++. Что-то среднее - дельфи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... а просто засунул в него один из старых проектов для Intel386.

Если не секрет, как Вам это удалось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...