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()