@AlexGyver, я отвечал по конкретному случаю, описанному в первом сообщении и по приведенному примеру. В частности, речь о том, что имеется блокирующий цикл отрисовки дисплея, который (далее начинаются предположения, поскольку информация так и не была представлена), как обычно работают программно эмулированные стандартные интерфейсы, запрещает прерывания на период передачи данных. Т.е., при использовании прерывания по изменению статуса порта, есть большая вероятность, что, в момент изменения статуса порта, прерывания заблокированы. Конечно, последнее прерывание будет кэшироваться, но понятно, что последовательности переключения, которая нужна для определения поворота, не будет. Поворот будет пропущен. Возможно, не один тик, а много, всё зависит от времени запрета прерываний. То, что автор всё собрал на одном прерывании существенно усугубляет ситуацию. Прерывание по таймеру от потери не спасает также, но, как минимум, упрощает жизнь тем, что оно вызывается 1 раз, а не 4.
Каждый тик энкодера, в идеале, продуцирует 4 последовательных события. Если энкодер не имеет подавителя дребезга или просто плохого качества, каждое из 4-х событий может вызывать до 3-6 импульсов дребезга с весьма непредсказуемой частотой, количество прерываний резко возрастает, часть из них теряется по причине того, что не закончилась обработка предыдущего прерывания (в обработчике прерываний они запрещены), что там надетектирует в этом случае код малопонятно. Часть этих проблем (но не все!) снимает прерывание по таймеру: его работа не зависит от дребезга, а вызов осуществляется с заданной и достаточно большой периодичностью, позволяющей сделать минимальную обработку в самом прерывании. Это, кстати, вторая ошибка: обработка действия внутри прерывания.
Почему это ошибка? Просто потому, что реальная обработка для получения результата занимает гораздо большее время, и будет всё равно выполняться в заблокированном loop. Впрочем, для простейшего кода типа "обнаружить кручение" это может и прокатить (реализовать с помощью counters), а вот если требуется ещё отслеживать кнопку, то - увы. Например, три щелчка в одну сторону, нажатие, три щелчка в другую сторону, нажатие, если не будет интерпретировано сразу же, может означать что угодно, например, два последовательных нажатия без поворота.
Короче, здесь много косяков. Не для всякого "быдлокода" работает Ваша библиотека.