/*******************************************************************
 * Processor:       PIC18F4520
 * Compiler:        MPLAB C18
 *
 * This file does the following....
 *
 * Author (Your name here)
 ********************************************************************/

/** Header Files ***************************************************/
#include <p18f4520.h>
#include <stdio.h>
#include <adc.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

/** Local Function Prototypes **************************************/

/** Global Variables ***********************************************/
int horzJoystick = 0;
int vertJoystick = 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 outputs

    XLCDInit();
    XLCDClear();

    XLCDL1home();
    XLCDPutRomString("Exam 2");

    while (1) {
        SetChanADC(ADC_CH3); // Select the pin
        ConvertADC(); // Start conversion
        while (BusyADC()); // Wait for completion
        vertJoystick = ReadADC(); // Read result

        if (vertJoystick >= 850) {
            PORTC = 0b10000001;
        } else if (vertJoystick >= 700) {
            PORTC = 0b01000010;
        } else if (vertJoystick >= 550) {
            PORTC = 0b00100100;
        } else if (vertJoystick >= 500) {
            PORTC = 0b00011000;
        } else {
            PORTC = 0b00000000;
        }

        SetChanADC(ADC_CH2); // Select the pin
        ConvertADC(); // Start conversion
        while (BusyADC()); // Wait for completion
        horzJoystick = ReadADC(); // Read result

        XLCDL2home();
        if (horzJoystick > 682) {
            XLCDPutRomString("              **");
        } else if (horzJoystick < 341) {
            XLCDPutRomString("**              ");
        } else {
            XLCDPutRomString("       **       ");
        }
    }
}