/********************************************************************
 * FileName:        (change filename of template).c
 * Processor:       PIC18F4520
 * Compiler:        MPLAB C18 v.3.06
 *
 * This file does the following....
 *
 *
 *       Author               Date              Comment
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// (Your name here) 

/**  Header Files **************************************************/
#include <p18f4520.h>
#include <stdio.h>
#include <adc.h>
#include <timers.h>
#include "LCD Module.h"
/** Configuration Bits *********************************************/
#pragma config OSC = INTIO67
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config BOREN = OFF
#pragma config XINST = OFF

/** Define Constants Here ******************************************/
#define SAMPLE 100
#define PRESSED 0

/** Local Function Prototypes **************************************/
void low_isr(void);
void high_isr(void);
void sampleFunction(void);
void updateLCD(void);

/** Declare Interrupt Vector Sections ****************************/
#pragma code high_vector=0x08

void interrupt_at_high_vector(void) {
    _asm goto high_isr _endasm
}

#pragma code low_vector=0x18

void interrupt_at_low_vector(void) {
    _asm goto low_isr _endasm
}

/** Global Variables ***********************************************/
int sampleVariable = 0;
int stopwatchCounter = 0;
char line1[17];
char counting = 0;
/*******************************************************************
 * Function:        void main(void)
 ********************************************************************/
#pragma code
void main(void) {
    // Set the clock to 4 MHz
    OSCCONbits.IRCF2 = 1;
    OSCCONbits.IRCF1 = 1;
    OSCCONbits.IRCF0 = 0;

    // Pin IO Setup
    OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_12_TAD,
            ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS,
            0x0B); // Four analog pins
    TRISA = 0xFF; // All of PORTA input
    TRISB = 0xFF; // All of PORTB input
    TRISC = 0x00; // All of PORTC output
    TRISD = 0x00; // All of PORTD output
    PORTC = 0x00; // Turn off all 8 Port C LEDs


    // Interrupt setup
    RCONbits.IPEN = 1; // Put the interrupts into Priority Mode
    // Add specific interrupts here...
    OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16 );
    INTCON2bits.TMR0IP = 1;  // Timer 0 is high priority

    INTCONbits.GIEH = 1; // Turn on high priority interrupts


    // This area happens once
    // Good for initializing and things that need to happen once
    XLCDInit();
    XLCDClear();
    WriteTimer0(59286);

    
    while (1) {
        if (PORTBbits.RB0 == PRESSED)
            counting = 1;
        else if (PORTBbits.RB1 == PRESSED)
            counting = 0;
        else if (PORTBbits.RB3 == PRESSED)
            stopwatchCounter = 0;
        updateLCD();

        // This area loops forever
    }
}

/*****************************************************************
 * Function:        void high_isr(void)
 ******************************************************************/
#pragma interrupt high_isr
void high_isr(void) {
    if (INTCONbits.TMR0IF){
        INTCONbits.TMR0IF = 0;
        if (counting == 1) stopwatchCounter++;
        WriteTimer0(59286);
    }
    // Add code here for the high priority Interrupt Service Routine (ISR)
}

/******************************************************************
 * Function:        void low_isr(void)
 ********************************************************************/
#pragma interruptlow low_isr
void low_isr(void) {
    // Add code here for the low priority Interrupt Service Routine (ISR)
}

#pragma code
/*****************************************************************
 * Additional Helper Functions
 ******************************************************************/

/*****************************************************************
 * Function:			void sample(void)
 * Input Variables:	none
 * Output Return:	none
 * Overview:			Use a comment block like this before functions
 ******************************************************************/
void sampleFunction() {
    // Some function that does a specific task
}
void updateLCD(){
    int bigno;
    int decimal;
    XLCDL1home();
    bigno=stopwatchCounter/10;
    decimal=stopwatchCounter%10;
    sprintf(line1, "%13d.%1d",bigno,decimal);
    XLCDPutRamString(line1);
}