
#include <reg51.h>

sbit    PHASE_A = P1^0;
sbit    PHASE_B = P1^1;

int     enc_delta;              // -32768 ... 32767

void t0_interrupt( void ) interrupt 1
{
  static char enc_last;
  char i;

  i = 0;
  if( PHASE_A )
    i = 1;
  if( PHASE_B )
    i ^= 3;                     // convert gray to binary
  i -= enc_last;                // difference new - last
  if( i & 1 ){                  // bit 0 = value (1)
    enc_last += i;              // store new as next last
    if( i & 2 )                 // bit 1 = direction (+/-)
      enc_delta--;
    else
      enc_delta++;
 }
}                               // 45 cycle


void main( void )
{
  TMOD = 0x02;                  // Mode 2: reload
  TH0 = -111;                   // 111 cylce (30kHz at XTAL = 20MHz)
  TR0 = 1;

  for(;;){
    P2 = enc_delta;
  }
}
