Определить направление вращения двухбитного инкрементального энкодера можно довольно простым способом. При этом не нужно организовывать ветвления из структур if-then, которые оценивают оба бита при каждом переходе.
Здесь применяется операция исключающего ИЛИ над младшим битом новой выборки и старшим битом старой выборки.
// Декодирование сигналов инкрементального энкодера
uint new;
uint old;
bool direction;
int count=0;
/* Получаем последнюю 2-битовую выборку */
new = get_new_bits(); // Ваша функция для получения новой выборки
/* операция исключающего ИЛИ над младшим битом новой выборки и старшим битом старой выборки.*/
direction = (new&1) ^ (old>>1)
/* Переменная direction хранит направление вращения */
/* Делаем из новой выборки старую выборку */
old = new;
/* Мы можем использовать переменную direction для инкрементирования или декрементирования счетчика для поддержания положения вращения */
if(direction) counter--; else counter++;
Перевод © digitrode.ru