#include <spi.h>
#include <delay.h>

#define SCK   PORTB.5  //SE MUESTRA COMO SCK
#define SDA   PORTB.3  // SE MUESTRA COMO MOSI
#define CS    PORTB.2  // SE MUESTRA COMO SS
#define A0    PORTB.4

#define NOP 0x00                 //No hace ninguna operacion
#define SW_RESET 0x01            //reset por software

#define SLEEP_IN  0x10           //Entrando en Modo Sleep
#define SLEEP_OUT  0x11          //Saliendo de Modo Sleep 
#define PTLON  0x12
#define NORON  0x13
#define GAMMA_SET 0x26           //Seleccion de la curva de GAMMA

#define INVERSION_OFF 0x20       //Inversion de color apagada
#define INVERSION_ON 0x21        //Inversion de color encendida
#define DISPLAY_OFF 0x28         //Lcd apagado
#define DISPLAY_ON 0x29          //Lcd encendido
#define CASET 0x2A               //Column Address Set
#define RASET 0x2B               //Row Address Set
#define WRITE_RAM 0x2C           //Escribe la RAM del LCD
#define READ_RAM 0x2E            //Lee la RAM del LCD

#define BLEND 0X39               //Suavizado de bordes

#define COLMOD 0x3A              //Interface Pixel Format
#define MADCTL 0x36              //Memory Data Access Control


/////////////////////////////////////////////////////////////////////////////
//                    ARRAY FUENTE DE LETRAS                               //
/////////////////////////////////////////////////////////////////////////////
const char FONT[51][5] ={0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
                         0x00, 0x00, 0x5F, 0x00, 0x00, // !
                         0x00, 0x03, 0x00, 0x03, 0x00, // "
                         0x14, 0x3E, 0x14, 0x3E, 0x14, // #
                         0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
                         0x43, 0x33, 0x08, 0x66, 0x61, // %
                         0x36, 0x49, 0x55, 0x22, 0x50, // &
                         0x00, 0x05, 0x03, 0x00, 0x00, // '
                         0x00, 0x1C, 0x22, 0x41, 0x00, // (
                         0x00, 0x41, 0x22, 0x1C, 0x00, // )
                         0x14, 0x08, 0x3E, 0x08, 0x14, // *
                         0x08, 0x08, 0x3E, 0x08, 0x08, // +
                         0x00, 0x50, 0x30, 0x00, 0x00, // ,
                         0x08, 0x08, 0x08, 0x08, 0x08, // -
                         0x00, 0x60, 0x60, 0x00, 0x00, // .
                         0x20, 0x10, 0x08, 0x04, 0x02, // /
                         0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
                         0x00, 0x04, 0x02, 0x7F, 0x00, // 1
                         0x42, 0x61, 0x51, 0x49, 0x46, // 2
                         0x22, 0x41, 0x49, 0x49, 0x36, // 3
                         0x18, 0x14, 0x12, 0x7F, 0x10, // 4
                         0x27, 0x45, 0x45, 0x45, 0x39, // 5
                         0x3E, 0x49, 0x49, 0x49, 0x32, // 6
                         0x01, 0x01, 0x71, 0x09, 0x07, // 7
                         0x36, 0x49, 0x49, 0x49, 0x36, // 8
                         0x26, 0x49, 0x49, 0x49, 0x3E, // 9
                         0x00, 0x36, 0x36, 0x36, 0x00, // :
                         0x00, 0x56, 0x36, 0x00, 0x00, // ;
                         0x08, 0x14, 0x22, 0x41, 0x00, // <
                         0x14, 0x14, 0x14, 0x14, 0x14, // =
                         0x00, 0x41, 0x22, 0x14, 0x08, // >
                         0x02, 0x01, 0x51, 0x09, 0x06, // ?
                         0x3E, 0x41, 0x59, 0x55, 0x5E, // @
                         0x7E, 0x09, 0x09, 0x09, 0x7E, // A
                         0x7F, 0x49, 0x49, 0x49, 0x36, // B
                         0x3E, 0x41, 0x41, 0x41, 0x22, // C
                         0x7F, 0x41, 0x41, 0x41, 0x3E, // D
                         0x7F, 0x49, 0x49, 0x49, 0x41, // E
                         0x7F, 0x09, 0x09, 0x09, 0x01, // F
                         0x3E, 0x41, 0x41, 0x49, 0x3A, // G
                         0x7F, 0x08, 0x08, 0x08, 0x7F, // H
                         0x00, 0x41, 0x7F, 0x41, 0x00, // I
                         0x30, 0x40, 0x40, 0x40, 0x3F, // J
                         0x7F, 0x08, 0x14, 0x22, 0x41, // K
                         0x7F, 0x40, 0x40, 0x40, 0x40, // L
                         0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
                         0x7F, 0x02, 0x04, 0x08, 0x7F, // N
                         0x3E, 0x41, 0x41, 0x41, 0x3E, // O
                         0x7F, 0x09, 0x09, 0x09, 0x06, // P
                         0x1E, 0x21, 0x21, 0x21, 0x5E, // Q
                         0x7F, 0x09, 0x09, 0x09, 0x76};// R

const char FONT2[44][5]={0x26, 0x49, 0x49, 0x49, 0x32, // S
                         0x01, 0x01, 0x7F, 0x01, 0x01, // T
                         0x3F, 0x40, 0x40, 0x40, 0x3F, // U
                         0x1F, 0x20, 0x40, 0x20, 0x1F, // V
                         0x7F, 0x20, 0x10, 0x20, 0x7F, // W
                         0x41, 0x22, 0x1C, 0x22, 0x41, // X
                         0x07, 0x08, 0x70, 0x08, 0x07, // Y
                         0x61, 0x51, 0x49, 0x45, 0x43, // Z
                         0x00, 0x7F, 0x41, 0x00, 0x00, // [
                         0x02, 0x04, 0x08, 0x10, 0x20, // \
                         0x00, 0x00, 0x41, 0x7F, 0x00, // ]
                         0x04, 0x02, 0x01, 0x02, 0x04, // ^
                         0x40, 0x40, 0x40, 0x40, 0x40, // _
                         0x00, 0x01, 0x02, 0x04, 0x00, // `
                         0x20, 0x54, 0x54, 0x54, 0x78, // a
                         0x7F, 0x44, 0x44, 0x44, 0x38, // b
                         0x38, 0x44, 0x44, 0x44, 0x44, // c
                         0x38, 0x44, 0x44, 0x44, 0x7F, // d
                         0x38, 0x54, 0x54, 0x54, 0x18, // e
                         0x04, 0x04, 0x7E, 0x05, 0x05, // f
                         0x08, 0x54, 0x54, 0x54, 0x3C, // g
                         0x7F, 0x08, 0x04, 0x04, 0x78, // h
                         0x00, 0x44, 0x7D, 0x40, 0x00, // i
                         0x20, 0x40, 0x44, 0x3D, 0x00, // j
                         0x7F, 0x10, 0x28, 0x44, 0x00, // k
                         0x00, 0x41, 0x7F, 0x40, 0x00, // l
                         0x7C, 0x04, 0x78, 0x04, 0x78, // m
                         0x7C, 0x08, 0x04, 0x04, 0x78, // n
                         0x38, 0x44, 0x44, 0x44, 0x38, // o
                         0x7C, 0x14, 0x14, 0x14, 0x08, // p
                         0x08, 0x14, 0x14, 0x14, 0x7C, // q
                         0x00, 0x7C, 0x08, 0x04, 0x04, // r
                         0x48, 0x54, 0x54, 0x54, 0x20, // s
                         0x04, 0x04, 0x3F, 0x44, 0x44, // t
                         0x3C, 0x40, 0x40, 0x20, 0x7C, // u
                         0x1C, 0x20, 0x40, 0x20, 0x1C, // v
                         0x3C, 0x40, 0x30, 0x40, 0x3C, // w
                         0x44, 0x28, 0x10, 0x28, 0x44, // x
                         0x0C, 0x50, 0x50, 0x50, 0x3C, // y
                         0x44, 0x64, 0x54, 0x4C, 0x44, // z
                         0x00, 0x08, 0x36, 0x41, 0x41, // {
                         0x00, 0x00, 0x7F, 0x00, 0x00, // |
                         0x41, 0x41, 0x36, 0x08, 0x00, // }
                         0x02, 0x01, 0x02, 0x04, 0x02};// ~
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////


void  TFT_Sendcommand(unsigned char command)
{
   A0 = 1;
   spi(command);
}

void  TFT_Senddata(unsigned char data)
{
   A0 = 0;
   spi(data);
}

void TFT_Reset()
{
    TFT_Sendcommand(SW_RESET);
}

void  TFT_Reset_cord()

{
   TFT_Sendcommand(CASET);
   TFT_Senddata(0x00);
   TFT_Senddata(0x00);
   TFT_Senddata(0x00);
   TFT_Senddata(0x7f);
  
   TFT_Sendcommand(RASET);
   TFT_Senddata(0x00);
   TFT_Senddata(0x00);
   TFT_Senddata(0x00);
   TFT_Senddata(0x9f);        
}


void TFT_Color_simple(unsigned char dato)
{
    unsigned char prueba=0;
    TFT_Reset_cord();
    TFT_Sendcommand(0x2c);
    for (prueba=0;prueba<255;prueba++){ 
           TFT_Senddata(dato);
    }
}


void TFT_init()
{
   TFT_Reset();
   
   TFT_Sendcommand(0X0C);
   TFT_Senddata(0x0005);

   TFT_Sendcommand(0xB1); 
   TFT_Senddata(0x01);
   TFT_Senddata(0x2C2D);
   
   TFT_Sendcommand(0xB2); 
   TFT_Senddata(0x01);
   TFT_Senddata(0x2C2D);
   
   TFT_Sendcommand(0xB3); 
   TFT_Senddata(0x012C);
   TFT_Senddata(0x2D01);
   TFT_Senddata(0x2C2D);
   
   TFT_Sendcommand(0xB4);
   TFT_Senddata(0x07); 

   TFT_Sendcommand(0xC0); 
   TFT_Senddata(0xA2);
   TFT_Senddata(0x0284);
   
   TFT_Sendcommand(0xC1);
   TFT_Senddata(0xC5);
   
   TFT_Sendcommand(0xC2); 
   TFT_Senddata(0x0A00);
   
   TFT_Sendcommand(0xC3); 
   TFT_Senddata(0x8A2A);
   
   TFT_Sendcommand(0xC4); 
   TFT_Senddata(0x8AEE);
   
   TFT_Sendcommand(0xC5);
   TFT_Senddata(0x0E); 
    
   TFT_Sendcommand(MADCTL);
   TFT_Senddata(0xc8); 
   
   //ST7735R Gamma Sequence
   TFT_Sendcommand(0xe0); 
   TFT_Senddata(0x0f);
   TFT_Senddata(0x1a);
   TFT_Senddata(0x0f);
   TFT_Senddata(0x18);
   TFT_Senddata(0x2f);
   TFT_Senddata(0x28);
   TFT_Senddata(0x20);
   TFT_Senddata(0x22);
   TFT_Senddata(0x1f);
   TFT_Senddata(0x1b);
   TFT_Senddata(0x23);
   TFT_Senddata(0x37);
   TFT_Senddata(0x00);
   TFT_Senddata(0x07); 
   TFT_Senddata(0x02);
   TFT_Senddata(0x10);
   
   TFT_Sendcommand(0xe1); 
   TFT_Senddata(0x0f);
   TFT_Senddata(0x1b);
   TFT_Senddata(0x0f);
   TFT_Senddata(0x17);
   TFT_Senddata(0x33);
   TFT_Senddata(0x2c);
   TFT_Senddata(0x29);
   TFT_Senddata(0x2e);
   TFT_Senddata(0x30);
   TFT_Senddata(0x30);
   TFT_Senddata(0x39);
   TFT_Senddata(0x3f);
   TFT_Senddata(0x00);
   TFT_Senddata(0x07);
   TFT_Senddata(0x03);
   TFT_Senddata(0x10);
   
   TFT_Sendcommand(CASET); //coordenadas
   TFT_Senddata(0x0000);
   TFT_Senddata(0x007F);
   
   TFT_Sendcommand(RASET);
   TFT_Senddata(0x0000);
   TFT_Senddata(0x009F);
    
   TFT_Sendcommand(COLMOD); //65k mode 
   TFT_Senddata(0x05); 
    
   TFT_Sendcommand(SLEEP_OUT);//SALIR DE SLEEP 
   delay_ms (120);
   TFT_Color_simple(0x0000);
   TFT_Sendcommand(DISPLAY_ON);
}

void TFT_Pixel(unsigned char x,unsigned char  y,unsigned char color)
{
   TFT_Sendcommand(0x2a);
   TFT_Senddata(x);
   TFT_Senddata(x+1);;
   TFT_Sendcommand(0x2b);
   TFT_Senddata(y);
   TFT_Senddata(y+1);
   TFT_Sendcommand(0x2c);
   TFT_Senddata(color);
}



