Ese código no te servirá si está en un bucle, porque si el encoder está parado en una de las dos posiciones descritas en los "if" se irán incrementando o decrementando hasta el infinito.
Debes meterlo en una interrupción por flanco ascendente o descendente para que te funcione, y te puedes ahorrar una de las dos condiciones de cada IF puesto que sabes cuál es el estado del pin que lanzó la interrupción.
depende del tipo de encoder. yo compre un pack de 10 a sureelectronics (el chino de ebay). estos tienen como 20 pasos por vuelta, y cada paso hace un "tick" que se siente al tacto. en cada tic hacen todo el recorrido del codigo gray (2bits). ademas, mientras esta en reposo no conduce ninguno de los 2, por lo que como tiene un pull up siempre esta a "1".
mi codigo quedo muy simple:
void INT_EXT_isr(void){ //monitoriza rotary encoder
flagGiro = TRUE;
Sentido = ENC_B;
}
flagGiro es un flag para avisar al programa que se giro el encoder.
Sentido es un short que indica a que lado se giro el encoder.
El pin A del encoder esta conectado a la interrupcion externa.
ENC_B es el pin del pic donde tengo conectado el pin B del encoder.
la int_ext esta configurada en flaco descendente.
con algunas modificaciones podrias usar un bucle para comprobar el estado del encoder, siempre y cuando se comporte como el mio