Тебе надо почитать, что такое конечный автомат:
http://ru.wikipedia.org/wiki/%D0%9A%D0% ... 0%B0%D1%82Дальше рисуешь простенькую схему состояний, у тебя будет два входных сигнала - состояние кнопки и состояние счетчика. типа:
1. Ожидание. Ничего не делаем.
сигнал1: нажата кнопка, переходим в состояние 2, включаем таймер
2. Работает таймер, ждем, пока отпустят кнопку
сигнал1: отпустили кнопку, при этом таймер ниже порога "короткого нажатия", выполняем действие по "короткому" нажатию, переходим в состояние 1
сигнал2: таймер перевалил порог "короткого нажатия", переходим в состояние 3
3. Выполняем (в цикле) действие при длительном удержании кнопки
сигнал 1: отпустили кнопку. Выполняем (опционально) финальное действие по длинному нажатию и переходим в состояние 1.
Как видишь, если кнопка не отпущена до того, как таймер перетикал за порог, "короткое" действие никогда не выполнится. Тут надо быть осторожным с переполнением таймера, например тормозить его при выходе за порог короткого нажатия. Потому что он нам уже не нужен.
Реализуется это обычно оператором switch по состоянию state. Дальше в каждом case описываешь состояние из своей таблички и все работает!
Добавлено спустя 8 минут 39 секунд:- Код: Выделить всё
static uint8_t state = 0;
switch (state) {
case 1: //idle state
if (buttonPushed = PRESSED) {
state = 2;
ButtonTimer = 0;
startButtonTimer();
}
break;
case 2: //short press area
if (buttonPushed = RELEASED && ButtonTimer < SHORT_THRESHOLD) {
state = 1;
stopButtonTimer();
doShortPress();
} else {
if (buttonPushed = RELEASED && ButtonTimer > SHORT_THRESHOLD) {
state = 3;
stopButtonTimer();
}
break;
case 3: //button is pressed
if (buttonPushed = RELEASED) {
state = 1;
doFinalLongPress();
} else {
if (buttonPushed = PRESSED) {
repeatLongPressTask();
}
break;
}
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.