Показать сообщение отдельно
Непрочитано 11.04.2011, 23:38  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Жирненький МК для такой задачки - хватило бы и младшей "Тиньки" с головой...
Начну, как всегда, с вопросов:
- Где устанавливается флаг state до условия
Код:
if (state) {                          // и проверяем усл
?

Что Вы хотите получить - понятно. Давайте решим как...

Длинное нажатие определяется по переполнению счётчика.
Короткое нажатие определяется в момент отпускания кнопки.
Определяемся с переменными. Необходимо: счетчик для определения времени нажатия кнопки(в Вашем случае достаточно байта). Бит для хранения предыдущего состояния кнопки(для короткого нажатия). Его же можно использовать как флаг состояния. Счётчик циклов задержки на изменение компаратора ШИМ. В общем пока всё.

Алгоритм обработки таков: Структура обработчика прерывания
Если кнопка нажата
...Если флаг не установлен -› установить флаг. выход.
...Если флаг установлен -› инкремент счетчика.
......Если счётчик досчитал до длинного нажатия -› начинаем менять компаратор ШИМ. Декремент счётчика(увеличивать-то его больше никчему). выход.
Если кнопка не нажата -› проверяем флаг состояния кнопки
...Если флаг установлен - › проверяем счётчик времени нажатия кнопки
......Если меньше длинного
.........Если больше минимального времени -› включаем/выключаем фонарь. сброс переменных. выход.
.........Иначе - это был "дребезг". сброс переменных. выход.
...Если флаг не установлен -› сброс переменных. выход.

Где-то так.

Последний раз редактировалось omercury; 11.04.2011 в 23:48.
omercury вне форума