/* 
Screens.c
Developer Screen - Displays System Information
PIC32MX695F512L-80I/PF
PIC32MX795F512L-80I/PF
*/

#include <xc.h>
#include <sys/attribs.h>
#include "Screens.h"
#include "HX8357B.h"
#include "CourierNew16.h"
#include "Strings.h"
#include "Binary2ASCIIBCD.h"
#include "Binary2ASCIIHex.h"
#include "Interrupts.h"
#include "Delay.h"
#include "REN71V30.h"
#include "Flash.h"
#include "LED_Port.h"
#include "Commands.h"
#include "Binary2ASCIIBCD32.h"
//#include "VoltageArray.h"
//#include "CurrentArray.h"

void Header(void)
{
    fore_color = 0;

    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 40, 0x2D1B);  
    
    back_color = 0x2D1B;
    
    //Header Text = "MainBrain 1.0   "
    Write_String(145, 7, 0, 45, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    return;
}

void Home_Screen(void)
{    
//    //Clear the Screen
//    HX8357B_CLRSCN(0xffff);
//    
//    //Turn off the Display
//    HX8357B_DISPOFF();
//        
     //Draw header
    Header();
    HX8357B_Rect(0, 480, 40, 42, 0x0);     
    
    //Motion
    HX8357B_Rect(35, 230, 60, 105, 0x0);
    HX8357B_Rect(30, 225, 55, 100, 0x2CED);
    back_color = 0x2CED;
    Write_String(85, 65, 0, 88, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Oscillator
    HX8357B_Rect(35, 230, 125, 170, 0x0);
    HX8357B_Rect(30, 225, 120, 165, 0x2CED);
    back_color = 0x2CED;
    Write_String(55, 130, 0, 29, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Current
    HX8357B_Rect(35, 230, 190, 235, 0x0);
    HX8357B_Rect(30, 225, 185, 230, 0x2CED);
    back_color = 0x2CED;
    Write_String(75, 195, 0, 32, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Display
    HX8357B_Rect(35, 230, 255, 300, 0x0);
    HX8357B_Rect(30, 225, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(75, 260, 0, 41, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    /////////////////////////////////////////////////////////////////////
    
    //Real time
    HX8357B_Rect(260, 450, 60, 105, 0x0);
    HX8357B_Rect(255, 445, 55, 100, 0x2CED);
    back_color = 0x2CED;
    Write_String(285, 65, 0, 42, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //SRAM
    HX8357B_Rect(260, 450, 125, 170, 0x0);
    HX8357B_Rect(255, 445, 120, 165, 0x2CED);
    back_color = 0x2CED;
    Write_String(315, 130, 0, 33, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Flash
    HX8357B_Rect(260, 450, 190, 235, 0x0);
    HX8357B_Rect(255, 445, 185, 230, 0x2CED);
    back_color = 0x2CED;
    Write_String(310, 195, 0, 49, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    //USB
    HX8357B_Rect(260, 450, 255, 300, 0x0);
    HX8357B_Rect(255, 445, 250, 295, 0x2CED);
    back_color = 0x2CED;
//    Write_String(330, 260, 0, 92, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    /////////////////////////////////////////////////////////////////////
    
   while(1)
    {
       Delay(50000);
        //Motion
        if((data_x > 30 ) && (data_x < 225) && (data_y < 100) && (data_y > 55) )
        {
            //Turn off the Display
            HX8357B_DISPOFF();

            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            
            Motion_Screen();
        }

        //Oscillator
        if((data_x > 30 ) && (data_x < 225) && (data_y < 165) && (data_y > 120) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Oscillator_Screen();
        }

        //Current
        if((data_x > 30 ) && (data_x < 225) && (data_y < 230) && (data_y > 185) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Current_Screen();
        }

        //Display
        if((data_x > 30 ) && (data_x < 225) && (data_y < 295) && (data_y > 250) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Display_Screen();
        }
        ///////////////////////////////////////////////////////////////////////
        //Real Time
        if((data_x > 255 ) && (data_x < 445) && (data_y < 100) && (data_y > 55) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            RTC_Screen();
        }

        //SRAM
        if((data_x > 255 ) && (data_x < 445) && (data_y < 165) && (data_y > 120) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            SRAM_Screen();
        }

        //Flash
        if((data_x > 255 ) && (data_x < 445) && (data_y < 230) && (data_y > 185) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Flash_Screen();
        }

        //USB
        if((data_x > 255 ) && (data_x < 445) && (data_y < 295) && (data_y > 250) )
        {
            //clear screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            USB_Screen();
        }

   }
    
    
    return;
}

void Motion_Screen(void)
{       
    fore_color = 0x0;
    back_color = 0xffff;
    
    //command register - motor off
    REN71V30_WR(0x3fc, 0);  
    
    //Set default motor speed
    REN71V30_WR(0x0104, 200);
    
    //Read the DEVID register and format for display
    Get_Display_DEVID();
    
    //Set the Home coordinates
    int h_home = 10;
    int v_home = 10;
    
    hchar = h_home;
    vchar = v_home;
    
    //MCU
    Write_String(hchar, vchar, 0x105d, 74, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //peripheral 0 
    hchar = h_home;
    Write_String(hchar, v_home + 25, 0x105d, 79, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Version
    hchar = h_home + 90;
    vchar = v_home;
    REN71V30_RD(0);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    //Device ID
    hchar = h_home + 130;
    REN71V30_RD(4);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    REN71V30_RD(3);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    REN71V30_RD(2);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    REN71V30_RD(1);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    //Peripheral Boards list
    //Number of boards
    hchar = h_home + 90;
    vchar = v_home + 25;
    REN71V30_RD(5);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    hchar = h_home + 130;
    //Board #1 type
    REN71V30_RD(6);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    //Board #1 Revision
    REN71V30_RD(7);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    //Board #1 Serial
    REN71V30_RD(9);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    REN71V30_RD(8);
    Binary2ASCIIHex(mdata_71V30);
    WriteChar(hchar, vchar, d_hex[1], 0x0);
    WriteChar(hchar, vchar, d_hex[0], 0x0);

    //Motor Group 
    h_home = 10;
    v_home = 75;

    //Border
    HX8357B_Rect(h_home, h_home + 165, v_home, v_home + 175, 0);
    HX8357B_Rect(h_home + 2, h_home + 163, v_home + 2, v_home + 173, 0xffff);
    
    //Motor RUN button
    HX8357B_Rect(h_home + 10, h_home + 70, v_home + 10, v_home + 55, 0x0);
    HX8357B_Rect(h_home + 12, h_home + 68, v_home + 12, v_home + 53, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 18, v_home + 20, 0, 84, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor Stop button
    HX8357B_Rect(h_home + 85, h_home + 155, v_home + 10, v_home + 55, 0x0);
    HX8357B_Rect(h_home + 87, h_home + 153, v_home + 12, v_home + 53, 0xA0E2);
    back_color = 0xA0E2;
    Write_String(h_home + 90, v_home + 20, 0, 85, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor Jog Left Button
    HX8357B_Rect(h_home + 10, h_home + 70, v_home + 65, v_home + 110, 0x0);
    HX8357B_Rect(h_home + 12, h_home + 68, v_home + 67, v_home + 108, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 23, v_home + 75, 0, 86, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor Jog Right Button
    HX8357B_Rect(h_home + 85, h_home + 155, v_home + 65, v_home + 110, 0x0);
    HX8357B_Rect(h_home + 87, h_home + 153, v_home + 67, v_home + 108, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 107, v_home + 75, 0, 87, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor CCW button
    HX8357B_Rect(h_home + 10, h_home + 70, v_home + 120, v_home + 165, 0x0);
    HX8357B_Rect(h_home + 12, h_home + 68, v_home + 122, v_home + 163, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 18, v_home + 130, 0, 81, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor CW button
    HX8357B_Rect(h_home + 85, h_home + 155, v_home + 120, v_home + 165, 0x0);
    HX8357B_Rect(h_home + 87, h_home + 153, v_home + 122, v_home + 163, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 105, v_home + 130, 0, 82, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Encoder Group 
    //Border
    HX8357B_Rect(h_home + 180, h_home + 390, v_home, v_home + 175, 0);
    HX8357B_Rect(h_home + 182, h_home + 388, v_home + 2, v_home + 173, 0xffff);
    
    //CLR Button
    HX8357B_Rect(h_home + 190, h_home + 250, v_home + 10, v_home + 55, 0x0);
    HX8357B_Rect(h_home + 192, h_home + 248, v_home + 12, v_home + 53, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 200, v_home + 20, 0, 83, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Motor Speed Slider
    HX8357B_Rect(h_home + 430, h_home + 433, v_home - 25, v_home + 175, 0x0);
    
    //Home button
    HX8357B_Rect(h_home + 145, h_home + 335, v_home + 185, v_home + 230, 0x0);
    HX8357B_Rect(h_home + 140, h_home + 328, v_home + 182, v_home + 223, 0x2CED);
    back_color = 0x2CED;
    Write_String(h_home + 205, v_home + 190, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    back_color = 0xffff;
    
    back_color = 0xffff;
    
    int s;      //used for QEI
    
    //set the initial count
    REN71V30_WR(0x3ef, 0);
    REN71V30_WR(0x3f0, 0);
    REN71V30_WR(0x3f1, 3);
    REN71V30_WR(0x3f2, 0);
   
    //set lower bounds limit
    REN71V30_WR(0x3f3, 0);
    REN71V30_WR(0x3f4, 0);
    REN71V30_WR(0x3f5, 0);
    REN71V30_WR(0x3f6, 0);
      
    //set the upper bounds limit (1000)
    REN71V30_WR(0x3f7, 2);
    REN71V30_WR(0x3f8, 0xb);
    REN71V30_WR(0x3f9, 3);
    REN71V30_WR(0x3fa, 0);
    
    //Turn on the Display
    HX8357B_DISPON();

    //Display the current motor speed value
    REN71V30_RD(0x0104);
    hchar = h_home + 405;
    vchar = 275;
    Binary2ASCIIBCD(mdata_71V30);
    motor_speed = mdata_71V30;
    //WriteChar(hchar , vchar, d3, 0x0);
    WriteChar(hchar, vchar, d2, 0x0);
    WriteChar(hchar, vchar, d1, 0x0);
    WriteChar(hchar, vchar, d0, 0x0);

    //Set the slider position
    HX8357B_Rect(h_home + 420, h_home + 440, motor_speed, motor_speed + 10, 0x0);
    
    while(1)
    {        
        //Motor Run button
        if((data_x > h_home + 10) && (data_x < h_home + 70) && (data_y > v_home + 10) && (data_y < v_home + 55))
        {
            // motor run
            REN71V30_WR(0x3fc, 1);
        }
                
        //Motor Stop button
       if((data_x > h_home + 85 ) && (data_x < h_home + 155) && (data_y > v_home + 10) && (data_y < v_home + 55))
        {
            // motor stop
            REN71V30_WR(0x3fc, 0);
        }
                
        //Motor Jog << button
       if((data_x > h_home + 10 ) && (data_x < h_home + 70) && (data_y > v_home + 65) && (data_y < v_home + 110))
        {
            // motor DIR = 1,
            REN71V30_WR(0x3f0, 1);
       }
                
        //Motor Jog >> button
        if((data_x > h_home + 85 ) && (data_x < h_home + 155) && (data_y > v_home + 65) && (data_y < v_home + 110))
        {
            // motor DIR = 1,
            REN71V30_WR(0x3f0, 1);
        }
                
        //Motor CCW button
        if((data_x > h_home + 10 ) && (data_x < h_home + 70) && (data_y > v_home + 120) && (data_y < v_home + 165))
        {
            // motor DIR = 1,
            REN71V30_WR(0x3fb, 1);
        }
                
        //Motor CW button
        if((data_x > h_home + 85 ) && (data_x < h_home + 155) && (data_y > v_home + 120) && (data_y < v_home + 165))
        {
            // motor DIR = 0,
            REN71V30_WR(0x3fb, 0);
        }

        //Reset count button
        if((data_x > h_home + 190 ) && (data_x < h_home + 250) && (data_y > v_home + 10) && (data_y < v_home + 55))
        {
            //clear count
            REN71V30_WR(0x3fc, 2);
        }
        
        //Motor Speed Slider
      if((data_x > h_home + 415) && (data_x < h_home + 469) && (data_y > v_home - 25) && (data_y < v_home + 175))
        {
            //clear the current position tic
            HX8357B_Rect(h_home + 420, h_home + 440, motor_speed, motor_speed + 10, 0xffff);
            
            motor_speed = data_y;
            if(motor_speed < 50)
                motor_speed = 50;
            
            if(motor_speed > 250)
                motor_speed = 250;
            
            //set motor speed
            //DSP PG4DC = 0-4000
            REN71V30_WR(0x0104, motor_speed);
            
            //Set the slider position
            HX8357B_Rect(h_home + 430, h_home + 433, v_home - 25, v_home + 175, 0x0);
            HX8357B_Rect(h_home + 420, h_home + 440, motor_speed, motor_speed + 10, 0x0);
            
            //Display the current motor speed value
            REN71V30_RD(0x0104);
            hchar = h_home + 405;
            vchar = 275;
            Binary2ASCIIBCD(mdata_71V30);
            motor_speed = mdata_71V30;
            //WriteChar(hchar , vchar, d3, 0x0);
            WriteChar(hchar, vchar, d2, 0x0);
            WriteChar(hchar, vchar, d1, 0x0);
            WriteChar(hchar, vchar, d0, 0x0);
        
        }
        
       //Home button
       if((data_x > h_home + 145 ) && (data_x < h_home + 335) && (data_y > v_home + 185) && (data_y < v_home + 300))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }

        //Read the motor direction from DSP
        REN71V30_RD(0x3fb);
        //LED_Port(mdata_71V30);
        
        //get status from DSP
        REN71V30_RD(0x200);
        
        //??????
        REN71V30_RD(0x3fd);       
        if(mdata_71V30 == 0)
        {
            //QEI1
            REN71V30_RD(0x305);
            s = mdata_71V30 << 8;
            REN71V30_RD(0x304);
            s = s + mdata_71V30;
            
            hchar = h_home + 300;
            vchar = 95;
            Binary2ASCIIBCD(s);
            WriteChar(hchar, vchar, d4, 0x0);
            WriteChar(hchar, vchar, d3, 0x0);
            WriteChar(hchar, vchar, d2, 0x0);
            WriteChar(hchar, vchar, d1, 0x0);
            WriteChar(hchar, vchar, d0, 0x0);        
        }
        
    }
    
    return;
}    

void Oscillator_Screen(void)
{
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    back_color = 0x2CED;
    
    //Header Text = "Oscillator"
    Write_String(170, 0, 0, 29, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    //COSC
    //Write_String(column start, row start, string index, name of the array, name of the offset array)


    Write_String(10, 30, 0x105d, 1, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    //Write_String(column start, row start, string index, name of the array, name of the offset array)
    Write_String(100, 30, fore_color, OSCCONbits.COSC + 2, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    //display the system clock frequency
    //PRI_FREQ; //COSC-->FPLLIDIV-->PLLMULT-->PLLODIV-->SYSCLK-->PBCLK

    switch(OSCCONbits.COSC)
    {
        case 0:
            //FRC
            sysclk_freq = 8000000;
            break;
        
        case 1:
            //FRC with PLL
            sysclk_freq = 8000000;
            break;
        
        case 2:
            //PRI
            sysclk_freq = PRI_FREQ;
            break;
        
        case 3:
            //PRIPLL
            sysclk_freq = PRI_FREQ;
            break;
        
        case 4:
            //SOSC
            sysclk_freq = 32768;
            break;
        
        case 5:
            //LPRC
            sysclk_freq = 31250;
            break;
        
        case 6:
            //FRC / 16
            sysclk_freq = 8000000 / 16;
            break;
        
        case 7:
            //FRC / FRCDIV
            sysclk_freq = 8000000;
            switch(OSCCONbits.FRCDIV)
            {
                case 0:
                    sysclk_freq = sysclk_freq;
                    break;

                case 1:
                    sysclk_freq = sysclk_freq / 2;
                    break;

                case 2:
                    sysclk_freq = sysclk_freq / 4;
                    break;

                case 3:
                    sysclk_freq = sysclk_freq / 8;
                    break;

                case 4:
                    sysclk_freq = sysclk_freq / 16;
                    break;

                case 5:
                    sysclk_freq = sysclk_freq / 32;
                    break;

                case 6:
                    sysclk_freq = sysclk_freq / 64;
                    break;

                case 7:
                    sysclk_freq = sysclk_freq / 256;
                    break;
            }

            break;
    }

    if((OSCCONbits.COSC == 1) | (OSCCONbits.COSC == 3))
    {

        switch(DEVCFG2bits.FPLLIDIV)
        {
            case 0:
                sysclk_freq = sysclk_freq;
                break;

            case 1:
                sysclk_freq = sysclk_freq / 2;
                break;

            case 2:
                sysclk_freq = sysclk_freq / 3;
                break;

            case 3:
                sysclk_freq = sysclk_freq / 4;
                break;

            case 4:
                sysclk_freq = sysclk_freq / 5;
                break;

            case 5:
                sysclk_freq = sysclk_freq / 6;
                break;

            case 6:
                sysclk_freq = sysclk_freq / 10;
                break;

            case 7:
                sysclk_freq = sysclk_freq / 12;
                break;
        }

        switch(OSCCONbits.PLLMULT)
        {
            case 0:
                sysclk_freq = sysclk_freq * 15;
                break;

            case 1:
                sysclk_freq = sysclk_freq * 16;
                break;

            case 2:
                sysclk_freq = sysclk_freq * 17;
                break;

            case 3:
                sysclk_freq = sysclk_freq * 18;
                break;

            case 4:
                sysclk_freq = sysclk_freq * 19;
                break;

            case 5:
                sysclk_freq = sysclk_freq * 20;
                break;

            case 6:
                sysclk_freq = sysclk_freq * 21;
                break;

            case 7:
                sysclk_freq = sysclk_freq * 24;
                break;
        }
        
        switch(OSCCONbits.PLLODIV)
        {
            case 0:
                sysclk_freq = sysclk_freq / 1;
                break;

            case 1:
                sysclk_freq = sysclk_freq / 2;
                break;

            case 2:
                sysclk_freq = sysclk_freq / 4;
                break;

            case 3:
                sysclk_freq = sysclk_freq / 8;
                break;

            case 4:
                sysclk_freq = sysclk_freq / 16;
                break;

            case 5:
                sysclk_freq = sysclk_freq / 32;
                break;

            case 6:
                sysclk_freq = sysclk_freq / 64;
                break;

            case 7:
                sysclk_freq = sysclk_freq / 256;
                break;
        }
    }
    
    if(sysclk_freq > 999999)
    {
        sysclk_freq = sysclk_freq / 1000000;
    }
    else
    {
        sysclk_freq = sysclk_freq / 1000;
    }
    
    Binary2ASCIIBCD(sysclk_freq);  
        
    //Hundreds
    if(d2 > 48)
    {
        WriteChar(200, 30, d2, fore_color);
        
        //Tens
        WriteChar(200, 30, d1, fore_color);    
    }
    else
    {
        if(d1 > 48)
        {
            //Tens
            WriteChar(215, 30, d1, fore_color);    
        }
    }

    //Ones
    WriteChar(230, 30, d0, fore_color);

    //MHz
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(250, 30, fore_color, 11, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    switch(OSCCONbits.PBDIV)
    {
        case 0:
            pbclk_freq = sysclk_freq;
            break;

        case 1:
            pbclk_freq = sysclk_freq / 2;
            break;

        case 2:
            pbclk_freq = sysclk_freq / 4;
            break;

        case 3:
            pbclk_freq = sysclk_freq / 8;
            break;
    }
        
//##################################################################//
// PBCLK                                                            //
//##################################################################//
    back_color = 0xffff;
    //void Write_String(int col_start, int row_start, fore_color, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 50, 0x105d, 10, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //Display PBCLK Frequency
    Binary2ASCIIBCD(pbclk_freq);    

    //Hundreds
    if(d2 > 48)
    {
        WriteChar(115, 50, d2, fore_color);
        
        //Tens
        WriteChar(130, 50, d1, fore_color);    
    }
    else
    {
        if(d1 > 48)
        {
            //Tens
            WriteChar(130, 50, d1, fore_color);    
        }
    }

    //Ones
    WriteChar(145, 50, d0, fore_color);
    
    //MHz
    //void Write_String(int col_start, int row_start, fore_color, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(170, 50, fore_color, 11, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

//##################################################################//
// Secondary Oscillator                                             //
//##################################################################//
    //SOSC
    //void Write_String(int col_start, int row_start, fore_color, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 70, 0x105d, 12, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.SOSCEN == 1)
    {
        //SOSC Enabled
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(100, 70, fore_color, 15, SYSTEM_STRING, SYSTEM_STRING_OFFSET);       
    }
    else
    {
        //SOSC Disabled
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(100, 70, fore_color, 16, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    
    if(OSCCONbits.SOSCRDY == 1)
    {
        //SOSC is running and stable OK
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(230, 70, fore_color, 13, SYSTEM_STRING, SYSTEM_STRING_OFFSET);       
    }
    else
    {
        //SOSC is still warming up or is turned OFF
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(230, 70, fore_color, 14, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//Clock and PLL locked/unlocked                                     //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 90, 0x105d, 17, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.CLKLOCK == 1)
    {
        //Clock and PLL selections are locked
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(215, 90, fore_color, 18, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    else
    {
        //Clock and PLL selections are not locked and may be modified
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(215, 90, fore_color, 19, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//PLL Status                                                        //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 110, 0x105d, 22, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.SLOCK == 1)
    {
        //Clock and PLL selections are locked
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(180, 110, fore_color, 20, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    else
    {
        //Clock and PLL selections are not locked and may be modified
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(180, 110, fore_color, 21, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//USB PLL Status                                                    //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 130, 0x105d, 23, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.ULOCK == 1)
    {
        //Clock and PLL selections are locked
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(250, 130, fore_color, 20, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    else
    {
        //Clock and PLL selections are not locked
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(250, 130, 0xa0c2, 21, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//USB clock                                                         //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 150, 0x105d, 26, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.UFRCEN == 1)
    {
        //Clock and PLL selections are locked
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(135, 150, fore_color, 2, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    else
    {
        //Clock and PLL selections are not locked and may be modified
        //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
        Write_String(135, 150, fore_color, 4, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//Clock Failure Detect Bit                                          //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 170, 0x105d, 24, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    if(OSCCONbits.CF == 1)
    {
        //Clock and PLL selections are locked
        Write_String(150, 170, fore_color, 25, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }
    else
    {
        //Clock and PLL selections are not locked and may be modified
        Write_String(150, 170, fore_color, 27, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    }

//##################################################################//
//OSCCON                                                            //
//##################################################################//
    //void Write_String(int col_start, int row_start, int string_index, const unsigned char the_array[], const uint16_t array_offset[])
    Write_String(10, 190, 0x105d, 28, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    WriteChar(120, 190, '0', fore_color);
    WriteChar(135, 190, 'x', fore_color);

    Binary2ASCIIHex(OSCCON);

    hchar = 150;

    int i;
    
    for(i=7;i>=0;i--)
    {
        WriteChar(hchar, 190, d_hex[i], fore_color);
    }

    //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
        
    while(1)
    {
        if((data_x > 145 ) && (data_x < 335) && (data_y > 250) && (data_y < 295))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }
    }
    
    return;
}

void Current_Screen(void)
{       
    fore_color = 0x0;
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    back_color = 0x2CED;
    
    //Header Text = "Current"
    Write_String(200, 0, 0, 32, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
    hchar = 10;
    vchar = 40;
    
    //Vin=
    WriteChar(hchar, vchar, 'V', fore_color);
    WriteChar(hchar, vchar, 'i', fore_color);
    WriteChar(hchar, vchar, 'n', fore_color);
    WriteChar(hchar, vchar, ' ', fore_color);
    WriteChar(hchar, vchar, '=', fore_color);
    WriteChar(hchar, vchar, ' ', fore_color);
           
    //Iin=
    hchar = 10;
    vchar = 65;
    WriteChar(hchar, vchar, 'I', fore_color);
    WriteChar(hchar, vchar, 't', fore_color);
    WriteChar(hchar, vchar, ' ', fore_color);
    WriteChar(hchar, vchar, '=', fore_color);
    WriteChar(hchar, vchar, ' ', fore_color);
           
    //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
    while(1)
    {
        hchar = 95;    
        vchar = 40;
//***********************************************
//              Get the input voltage
//***********************************************    
    //voltage is looked up in VoltageString[] array
        int chara;
        int b;
        unsigned c = data_v * 5;         

//        for(b=0;b<5;b++)
//        {
//            chara = VoltageString[c];
//            WriteChar(hchar, vchar, chara, 0);
//            c++;
//        }
//
//        //V
//        WriteChar(hchar, vchar, 'V', fore_color);
//
//        vchar = 65;            
//        hchar = 95;
//                
//        c = data_i * 5;         
//
//        for(b=0;b<5;b++)
//        {
//            chara = CurrentString[c];
//            WriteChar(hchar, vchar, chara, 0);
//            c++;
//        }
        hchar = 200;
        
        fore_color = 0;
        //mA
        WriteChar(hchar, vchar, 'm', fore_color);

        WriteChar(hchar, vchar, 'A', fore_color);
        
        //Home button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 295) && (data_y > 250))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }       
    }
    
    return;
}

void Display_Screen(void)
{        
    int s = 100 - (OC1RS / 3);
  
    fore_color = 0x0;
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    back_color = 0x2CED;
    
    //Header Text = "Display"
    Write_String(200, 0, 0, 41, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
    hchar = 10;
    vchar = 30;
    
    //CFAF320480C5-035T-TS TFT Display Module
    Write_String(hchar, vchar, 0, 62, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    hchar = hchar + 15;
    Write_String(hchar, vchar, 0, 63, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    hchar = 10;
    vchar = 60;
    
    //Pixel format - 16/18 Bit RGB
    //Get pixel format
    HX8357B_RDDCOLMOD();
    //Binary2ASCIIHex(Display_Read);
    
    int strg;
    if(Display_Read == 5)
    {
        strg = 64;
    }

    if(Display_Read == 6)
    {
        strg = 65;
    }
    
    Write_String(hchar, vchar, 0, strg, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    hchar = 10;
    vchar = 90;
    
    //Device ID
    Write_String(hchar, vchar, 0, 66, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    hchar = hchar + 20;
    HX8357B_GETDEVICEID();
    Binary2ASCIIHex(Display_Read);
    WriteChar(hchar, vchar, d_hex[7], fore_color);
    WriteChar(hchar, vchar, d_hex[6], fore_color);
    WriteChar(hchar, vchar, d_hex[5], fore_color);
    WriteChar(hchar, vchar, d_hex[4], fore_color);
    WriteChar(hchar, vchar, d_hex[3], fore_color);
    WriteChar(hchar, vchar, d_hex[2], fore_color);
    WriteChar(hchar, vchar, d_hex[1], fore_color);
    WriteChar(hchar, vchar, d_hex[0], fore_color);
            
    hchar = 10;
    vchar = 120;

    //Brightness
    Write_String(hchar, vchar, 0, 47, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    Binary2ASCIIBCD(s);
    hchar = hchar + 15;
    
    //keep the text aligned
    if(s == 100)
    {
        WriteChar(hchar, vchar, d2, fore_color);
    }
    else
    {
        hchar = hchar + 15;
    }
    
    WriteChar(hchar, vchar, d1, fore_color);
    WriteChar(hchar, vchar, d0, fore_color);
    WriteChar(hchar, vchar, '%', fore_color);
    
    //brightness control
    hchar = 400;
    vchar = 70;
    WriteChar(hchar - 35, vchar, '1', fore_color);
    WriteChar(hchar - 35, vchar, '0', fore_color);
    WriteChar(hchar - 35, vchar, '0', fore_color);
    HX8357B_Rect(hchar - 25, hchar - 23, vchar + 10, vchar + 200, 0x0);
    WriteChar(hchar - 50, vchar + 190, '0', fore_color);
    HX8357B_Rect(hchar - 50, hchar - 30, vchar + 10, vchar + 12, 0x0);
    HX8357B_Rect(hchar - 50, hchar - 30, vchar + 100, vchar + 102, 0x0);
    HX8357B_Rect(hchar - 50, hchar - 30, vchar + 200, vchar + 202, 0x0);
    
    //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    while(1)
    { 

    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 97) && (data_y > 75))
    {
        Delay(50000);
        hchar = 175;
        vchar = 120;
        OC1RS = 0;
        s = 100 - (OC1RS / 3);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d2, fore_color);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 120) && (data_y > 75))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 30;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 142) && (data_y > 121))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 60;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 165) && (data_y > 143))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 90;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 187) && (data_y > 166))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 120;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 210) && (data_y > 188))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 150;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 232) && (data_y > 211))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 180;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 255) && (data_y > 233))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 210;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 277) && (data_y > 256))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 240;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
    //Touch Brightness - Brightness value (OC1RS) highlight
    if((data_x > 400 ) && (data_x < 450) && (data_y < 300) && (data_y > 278))
    {
        Delay(50000);
        hchar = 190;
        vchar = 120;
        OC1RS = 270;
        s = 100 - (OC1RS / 3);
        HX8357B_Rect(170, 200, 125, 140, 0xffff);
        Binary2ASCIIBCD(s);
        WriteChar(hchar, vchar, d1, fore_color);
        WriteChar(hchar, vchar, d0, fore_color);
        WriteChar(hchar, vchar, '%', fore_color);  
    }
    
        back_color = 0xffff;
        hchar = 10;
        vchar = 150;
        
        //Show touch coordinates
        Binary2ASCIIBCD(data_x);
        //X-
        WriteChar(hchar, vchar, 'x', fore_color);
        WriteChar(hchar, vchar, '-', fore_color);
        
        //Thousands
        WriteChar(hchar, vchar, d3, fore_color);

        //Hundreds
        WriteChar(hchar, vchar, d2, fore_color);

        //Tens
        WriteChar(hchar, vchar, d1, fore_color);

        //Ones
        WriteChar(hchar, vchar, d0, fore_color);
        
        hchar = hchar + 10;
        
        Binary2ASCIIBCD(data_y);

        //Y-
       WriteChar(hchar, vchar, 'y', fore_color);
       WriteChar(hchar, vchar, '-', fore_color);
       
       //Thousands
       WriteChar(hchar, vchar, d3, fore_color);

        //Hundreds
        WriteChar(hchar, vchar, d2, fore_color);

        //Tens
        WriteChar(hchar, vchar, d1, fore_color);

        //Ones
        WriteChar(hchar, vchar, d0, fore_color);

        //Home button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 295) && (data_y > 250))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }
    }
    
    return;
}

void Write_Digit(int RTC_Data)
{       
    fore_color = 0x06cc;
    
    //write seconds
    if(RTC_Data == 0)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, fore_color);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, 0xffff);    

    }

    if(RTC_Data == 1)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, 0xffff);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, 0xffff);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, 0xffff);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, 0xffff);    

    }

    if(RTC_Data == 2)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, 0xffff);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, fore_color);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, 0xffff);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 3)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, 0xffff);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 4)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, 0xffff);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, 0xffff);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 5)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, 0xffff);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 6)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, 0xffff);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, 0xffff);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, fore_color);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 7)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, 0xffff);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, 0xffff);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, 0xffff);    

    }

    if(RTC_Data == 8)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, fore_color);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, fore_color);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    if(RTC_Data == 9)
    {
            //segment A
            HX8357B_Rect(hchar + 10, hchar + 50, vchar, vchar + 10, fore_color);    
            //segment B
            HX8357B_Rect(hchar + 50, hchar + 60, vchar, vchar + 50, fore_color);
            //Segment C
            HX8357B_Rect(hchar + 50, hchar + 60, vchar + 60, vchar + 110, fore_color);
            //Segment D
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 100, vchar + 110, 0xffff);    
            //Segment E
            HX8357B_Rect(hchar, hchar + 10, vchar + 60, vchar + 110, 0xffff);
            //Segment F
            HX8357B_Rect(hchar, hchar + 10, vchar, vchar + 50, fore_color);
            //Segment G
            HX8357B_Rect(hchar + 10, hchar + 50, vchar + 50, vchar + 60, fore_color);    

    }

    hchar = 0;
    vchar = 0;
    
    return;
}

void RTC_Screen(void)
{       
    clock_on = 1;
    
    fore_color = 0x0;
        
    back_color = 0x2CED;
    
    //Clear the Screen
    HX8357B_CLRSCN(0xffff);
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
        
    //Header Text = "Real Time"
    Write_String(190, 0, 0, 42, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    fore_color = 0x0;
    back_color = 0xffff;
    
    hchar = 10;
    vchar = 90;
    
    //Colon 1
    HX8357B_Rect(hchar + 141, hchar + 153, vchar + 30, vchar + 40, fore_color);  
    HX8357B_Rect(hchar + 141, hchar + 153, vchar + 70, vchar + 80, fore_color);  

    //Colon 2
    HX8357B_Rect(hchar + 307, hchar + 319, vchar + 30, vchar + 40, fore_color);  
    HX8357B_Rect(hchar + 307, hchar + 319, vchar + 70, vchar + 80, fore_color);  
    
    //Turn on the Display
    HX8357B_DISPON();

    while(1)
    {
        
        //Home button
        if((data_x > 10) && (data_x < 470) && (data_y > 250) && (data_y < 310))
        {
            clock_on = 0;
            
            //Clear the Screen
            HX8357B_CLRSCN(0xffff);
            
            Home_Screen();
        }        
    }
    
    return;
}

void SRAM_Screen(void)
{       
    fore_color = 0x0;
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    //Header Text = "SRAM"
    Write_String(200, 0, 0, 33, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
    hchar = 10;
    vchar = 30;
    
    //SRAM
    Write_String(hchar, vchar, fore_color, 33, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    hchar = hchar + 15;
    
    //Display RAM size
    Binary2ASCIIBCD(RAM_SIZE);
    
    if(d4 != 0x30)
    {
        WriteChar(hchar, vchar, d4, fore_color);
    }
   
    WriteChar(hchar, vchar, d3, fore_color);
   
    WriteChar(hchar, vchar, d2, fore_color);
   
    WriteChar(hchar, vchar, d1, fore_color);
   
    //Ones
    WriteChar(hchar, vchar, d0, fore_color);
    
    WriteChar(hchar, vchar, 'x', 0x0);
    
    WriteChar(hchar, vchar, '8', 0x0);
    hchar = hchar + 25;
    
    back_color = 0xffff;
    fore_color = 0x0;
        
    //Display the results of the test 
    if(sram_test != 1)
    {
        Write_String(hchar, vchar, 0xe8e3, 34, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
        hchar = hchar + 20;
        Binary2ASCIIBCD(address_71V30);

        WriteChar(hchar, vchar, d4, 0xe8e3);

        WriteChar(hchar, vchar, d3, 0xe8e3);

        WriteChar(hchar, vchar, d2, 0xe8e3);

        WriteChar(hchar, vchar, d1, 0xe8e3);

        WriteChar(hchar, vchar, d0, 0xe8e3);
        
        hchar = hchar + 20;

        Binary2ASCIIBCD(mdata_71V30);

        WriteChar(hchar, vchar, d4, 0xe8e3);

        WriteChar(hchar, vchar, d3, 0xe8e3);

        WriteChar(hchar, vchar, d2, 0xe8e3);

        WriteChar(hchar, vchar, d1, 0xe8e3);

        WriteChar(hchar, vchar, d0, 0xe8e3);
        
    }
    else
    {
        WriteChar(hchar, vchar, 'O', 0x35E4);
        WriteChar(hchar, vchar, 'K', 0x35E4);
    }
    
    //Graphical view of memory test results
    vchar = 75;
    hchar = 20;
    int i;
    for(i=0;i<1024;i++)
    {
        if(sram_test_data[i] == 0)
        {
            HX8357B_Rect(hchar, hchar + 5, vchar, vchar + 5, 0xE082);
            hchar = hchar + 2;
            if(hchar > 450)
            {
                hchar = 20;
                vchar = vchar + 20;
            }
        }
        
        if(sram_test_data[i] == 1)
        {
            HX8357B_Rect(hchar, hchar + 5, vchar, vchar + 5, 0x1724);
            hchar = hchar + 7;
            if(hchar > 455)
            {
                hchar = 20;
                vchar = vchar + 7;
            }
        }
    }
    
    //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    while(1)
    {
        //Home button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 295) && (data_y > 250))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            
            //System is ready to exchange data with the DSP (RDY = 1)
            PORTAbits.RA5 = 1;

            Home_Screen();
        }
    }

    return;
}

void Flash_Screen(void)
{
     //Clear the Screen
    HX8357B_CLRSCN(0xffff);

    fore_color = 0x0;
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    back_color = 0x2CED;
    
    //Header Text = "Flash "
    Write_String(200, 0, 0, 49, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
    hchar = 10;
    vchar = 30;
        
    //////////////////////
    //Display Flash size
    //////////////////////
    vchar = 30;
    hchar = 10;
    
    back_color = 0xffff;
    fore_color = 0x0;
    
    //Flash
    Write_String(hchar, vchar, fore_color, 35, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    hchar = hchar + 20;
    fore_color = 0x105d;
    
    if(Flash_DID == 0xd5)
        flash_size = 89;
    if(Flash_DID == 0xd6)
        flash_size = 90;
    if(Flash_DID == 0xd7)
        flash_size = 91;
    
    Write_String(hchar, vchar, fore_color, flash_size, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    ////////////////////
    //Display Flash MID   
    ////////////////////
    vchar = 60;
    hchar = 10;
    fore_color = 0;
    
    //MID
    Write_String(10, 60, 0, 53, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    hchar = hchar + 65;
    fore_color = 0x105d;
    
    Binary2ASCIIHex(Flash_MID);    
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    
    //////////////////////////
    //Convert Flash DID  
    //////////////////////////
    hchar = 75;
    vchar = 90;
    fore_color = 0;
    
    //DID
    Write_String(10, 90, 0, 54, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    fore_color = 0x105d;
    
    Binary2ASCIIHex(Flash_DID);   
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    
    //Display until Flash_Get_Bytes_Used() is complete
    //Working...
    Write_String(10, 120, 0, 96, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    fore_color = 0x105d;
    hchar = 10;
    vchar = 120;

    //Get bytes used
    //Save PMADDR and restore it after calling function!
    //This fixes a hang problem. 
    unsigned d = PMADDR;
    Flash_Get_Bytes_Used();
    PMADDR = d;
    HX8357B_Rect(10, 300, 120, 150, back_color);
    Binary2ASCIIHex(Bytes_used); 
    WriteChar(hchar, vchar, d_hex[4], fore_color);
    WriteChar(hchar, vchar, d_hex[3], fore_color);  
    WriteChar(hchar, vchar, d_hex[2], fore_color);
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    
    //Show used bytes
    Write_String(110, 120, 0, 67, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    //erase button
    HX8357B_Rect(150, 340, 185, 230, 0x0);
    HX8357B_Rect(145, 335, 180, 225, 0x2CED);
    back_color = 0x2CED;
    Write_String(205, 190, 0xD8C3, 68, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

   //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    while(1)
    {
        //Erase button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 230) && (data_y > 185))
        {
            Flash_Chip_Erase();

            //change the color of the text
            back_color = 0x2CED;
            Write_String(205, 190, 0, 68, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
            
            fore_color = 0x105d;
            back_color = 0xffff;
            hchar = 10;
            vchar = 120;

            //Get bytes used
            //Save PMADDR and restore it after calling function!
            //This fixes a hang problem. 
            unsigned d = PMADDR;
            Flash_Get_Bytes_Used();
            PMADDR = d;

            Binary2ASCIIHex(Bytes_used);   
            WriteChar(hchar, vchar, d_hex[4], fore_color);
            WriteChar(hchar, vchar, d_hex[3], fore_color);  
            WriteChar(hchar, vchar, d_hex[2], fore_color);
            WriteChar(hchar, vchar, d_hex[1], fore_color);  
            WriteChar(hchar, vchar, d_hex[0], fore_color);
        }

        //Home button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 295) && (data_y > 250))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }        
    }
    
    return;
   
}

void USB_Screen(void)
{       
    fore_color = 0x0;
    
    //Draw Header Bar
    HX8357B_Rect(0, 480, 0, 25, 0x2CED);  
    
    back_color = 0x2CED;
    
    //Header Text = "USB"
    Write_String(235, 0, 0, 92, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    
    back_color = 0xffff;
    
   //Home button
    HX8357B_Rect(150, 340, 255, 300, 0x0);
    HX8357B_Rect(145, 335, 250, 295, 0x2CED);
    back_color = 0x2CED;
    Write_String(215, 260, 0, 36, SYSTEM_STRING, SYSTEM_STRING_OFFSET);
    back_color = 0xffff;
    
    //Display USB Status Information    
    //U1IR - USB Interrupt Status
    Write_String(10, 35, 0, 93, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    hchar = 270;
    vchar = 35;
    Binary2ASCIIHex(U1IR);   
    WriteChar(hchar, vchar, d_hex[4], fore_color);
    WriteChar(hchar, vchar, d_hex[3], fore_color);  
    WriteChar(hchar, vchar, d_hex[2], fore_color);
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    
    //U1STAT - USB Status
    Write_String(10, 55, 0, 94, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    hchar = 270;
    vchar = 55;
    Binary2ASCIIHex(U1STAT);  
    WriteChar(hchar, vchar, d_hex[4], fore_color);
    WriteChar(hchar, vchar, d_hex[3], fore_color);  
    WriteChar(hchar, vchar, d_hex[2], fore_color);
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    
    //U1STAT - USB Control
    Write_String(10, 75, 0, 95, SYSTEM_STRING, SYSTEM_STRING_OFFSET);

    hchar = 270;
    vchar = 75;
    Binary2ASCIIHex(U1CON);  
    WriteChar(hchar, vchar, d_hex[4], fore_color);
    WriteChar(hchar, vchar, d_hex[3], fore_color);  
    WriteChar(hchar, vchar, d_hex[2], fore_color);
    WriteChar(hchar, vchar, d_hex[1], fore_color);  
    WriteChar(hchar, vchar, d_hex[0], fore_color);
    

    
    while(1)
    {
                //Home button
        if((data_x > 145 ) && (data_x < 335) && (data_y < 295) && (data_y > 250))
        {
            //Clear the screen
            HX8357B_Rect(0, 479, 0, 319, 0xffff);
            Home_Screen();
        }        

    }

    return;
}