вперёд дребезг назад вернулись в исходное
знак (s) 0 0000 0000 00101010 1111 1111 1111 1 1
фаза 1 0231 0231 02020202 0132 0132 0132 0 1
счётчик 0 1 2 3 2 1 0
Собственно, алгоритм и появился при работе с колесом диаметром pi, с самодельным оптическим энкодером с фазами по 30-4- градусов, прислоненного к тросу. "Вот мы разматываем, счётчик прибавил 10см, а вот наматываем, а почему он убавляет те же самые 10 см в другом месте?!"
насчёт if((tmp1 & 0xC0) == (biphase & 0xC0)) return; там так и есть, предыдущее значение ксорится с настоящим, и если ничего не изменилось в старших битах будут нули, тогда return
У меня неправильно то, что фазы заведены на разные порты и поэтому считываются не одновременно, но так уж получилось.