/**  Header Files ******************/     
#include <p18f4520.h> 
#include <timers.h>

/** Configuration Bits *************/     
#pragma config OSC = EC
(ommitting some boilerplate code)

/** Define Constants Here **********/
#define START_TIME 18661   // Part B

#pragma code
void main (void)
{
  ADCON1 = 0x0F;  // Part A
  TRISAbits.TRISA4 = 1;  // Part A
  TRISB = 0xF0;   // Part A
  PORTB = 0xFF;   // Part A

  // Part B
  OpenTimer0(TIMER_INT_ON &
             T0_16BIT &
             T0_SOURCE_INT &
             T0_PS_1_64);

  RCONbits.IPEN = 1;       // Part D
  INTCON2bits.TMR0IP = 0;  // Part D
  INTCONbits.GIEH = 1;     // Part B
  INTCONbits.GIEL = 1;     // Part D
  WriteTimer0(START_TIME); // Part A
  while (1) {
    if (PORTAbits.RA4 == 0) {
      PORTB = 0x00;
      WriteTimer0(START_TIME);
    }
  }
}

#pragma interruptlow low_isr
void low_isr(void)
{
  if(INTCONbits.TMR0IF) {						
    INTCONbits.TMR0IF = 0;
    WriteTimer0(START_TIME);
    PORTB = 0x0F;
  }
}