Странно, вроде не сталкивался с дребезгом у мех. енкодера, попробуй так Выдрал кусок из старого проекта, работало все как часы.
#define st1 0b00
#define st2 0b10
#define st3 0b11
#define st4 0b01
signed char encoder_div;
unsigned char coder, old_coder;
void ENCODER(void)
{
coder=PORTC&0b00000011;
switch (coder)
{
case st1: if (old_coder==st4) ++encoder_div;
if (old_coder==st2) --encoder_div;
break;
case st2: if (old_coder==st1) ++encoder_div;
if (old_coder==st3) --encoder_div;
break;
case st3: if (old_coder==st2) ++encoder_div;
if (old_coder==st4) --encoder_div;
break;
case st4: if (old_coder==st3) ++encoder_div;
if (old_coder==st1) --encoder_div;
break;
}
old_coder=coder;
}