Цитата:
|
Но как это записать в прерывании не знаю.
|
Прерывание по таймеру используется только для тактирования последовательного цикла.
Цитата:
|
Итак:
1. Как только заметили ноль на пине, нужно подождать 40-50 мс и проверить ещё раз пин;
2. Если там по прежнему ноль, то это не помеха/дребезг.
3. Запустить при этом увеличение какой либо переменной.
4. Если на выходе стал 1 (кнопку отпустили) то остановить приращение переменной.
5. Посмотреть до скольки досчитали, если меньше отсечки "длинного нажатия", то это короткое нажатие, если больше - то это долгое нажатие
6. Сбросить всё, вернуться в режим ожидания.
|
Вы не учитываете, что при отпускании кнопки происходит такой же дребезг как и при нажатии. По вашему заданию не обойтись без отслеживания
изменения состояния пина. Поэтому алгоритм такой:
1. начало цикла
2. проверить изменение пина (для этого испольуется Prev_PIN_State)
если изменений нет -› начало цикла
если есть, запомнить значение пина (0 или 1) сделать задержку на дребезг (переменная Time), после задержки проверить значение пина. Если изменилось -› начало цикла
Если нет - кнопка сработала.
3. Если кнопку нажали, запустить таймер (переменная Time) для оценки времени удержания кнопки (больше или меньше 1сек )
если кнопку отпустили:
в режиме выключено - включить фонарь,
в режиме включено - выключить фонарь,
в режиме регулировка яркости - отставить фонарь включённым, выйдя из режима регулировки яркости.
4. Если во включенном режиме кнопка удерживалась 1сек включить режим регулировки яркости и регулировать.
5. -› начало цикла
Подробней уже не могу.
В коде вроде всё это так же подробно расписано в комментах.
Кстати, сократил код, выкинув ту фичу, про которую говорил раньше(возможность регулировать яркость сразу после включения, удерживая кнопку). Может так понятней будет.