Incremental Rotary Encoder 400P/R

I posted this code in another thread. It might help you.

const char encTable[16] ={0, 1, -1, -0, -1, 0, -0, 1, 1, -0, 0, -1, -0, -1, 1, 0};//gives -1, 0 or 1 depending on encoder movement
byte encState;//remembering the encoder output and acting as index for encTable[]
byte inp;
volatile long actPos;//encoder position


void setup(){
    Serial.begin(115200);
    attachInterrupt(0, updateEnc, CHANGE);//monitor pin 2
    attachInterrupt(1, updateEnc, CHANGE);//monitor pin 3
}//setup()

void loop(){
  Serial.println(actPos);//report positioin twice a second
  delay(500);
}//loop()

void updateEnc(){
  encState = ((encState<<2)|((PIND>>2)&3))&15;//use encoder bits and last state to form index
  actPos += encTable[encState];//update actual position on encoder movement
}//updateEnc()