//USE SPI-4,SPI-1,SPI-3 for MOSI,MISO,SCK.

#include <SPI.h>
#include <SD.h>
//#define   MOSI  11      //SPI-4
//#define   MISO  12      // SPI-1
//#define   SCK   13      // SPI-3
const int ChipSelect = 10;   

File myFile;



void TFT_SDbmp_320240RGB2(unsigned char image)    // function to show bmp from SD card
{
   unsigned int i, j;
   unsigned char dummy;
   unsigned int incr = 0;
   myFile = SD.open("320x240.bmp");
   WindowSet(0,319,0,239);
   TFT_Write_Command(0x2C);
   if(myFile)
   {
    for(unsigned int i=0;i<54;i++)
    {
        dummy = myFile.read();
    }
         digitalWrite(RS, HIGH);    
    while(myFile.available())
    {  
        TFT_Write_Data(myFile.read());
    }
    myFile.close();
   }
}


void Init_ports(){
  pinMode(10,OUTPUT);

  pinMode(P1,OUTPUT);
  pinMode(P2,OUTPUT);
  digitalWrite(P1,LOW);
  digitalWrite(P2,HIGH);
  pinMode(P3,OUTPUT);
  pinMode(P4,OUTPUT);
  pinMode(P5,OUTPUT);
  pinMode(P6,OUTPUT);
  pinMode(P7,OUTPUT);
  pinMode(P8,OUTPUT);
  pinMode(P9,OUTPUT);
  pinMode(P10,OUTPUT);
  pinMode(P11,OUTPUT);
  pinMode(P12,OUTPUT);
  pinMode(P13,OUTPUT);
  pinMode(P14,OUTPUT);
  pinMode(P25,OUTPUT);
  pinMode(P26,OUTPUT);
  } 
  
void GPIO_Write(unsigned char c){
  
  if( (c&0x80) ==0x80){ digitalWrite(P14,HIGH);  } else {digitalWrite(P14,LOW);}c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P13,HIGH);  } else {digitalWrite(P13,LOW);}c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P12,HIGH);  } else {digitalWrite(P12,LOW);}c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P11,HIGH);  }else {digitalWrite(P11,LOW);}c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P10,HIGH);  }else {digitalWrite(P10,LOW);}c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P9,HIGH);  }else {digitalWrite(P9,LOW); }c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P8,HIGH);  }else {digitalWrite(P8,LOW); }c= c<<1;//delayMicroseconds(20);
  if( (c&0x80) ==0x80){ digitalWrite(P7,HIGH);  }else {digitalWrite(P7,LOW); }c= c<<1;//delayMicroseconds(20);

}                     
//;******************************************************************************
void TFT_Write_Command(unsigned char command)
{
  digitalWrite(RS, LOW);
 GPIO_Write(command);
  digitalWrite(WR, LOW);
  digitalWrite(WR, HIGH);
}
//;******************************************************************************
void TFT_Write_Data(unsigned char data)
{
  GPIO_Write(data);
  digitalWrite(WR, LOW);
  digitalWrite(WR, HIGH);
}
//====================================================
void TFT_Command_Write(unsigned char REG,unsigned char VALUE)
{
        TFT_Write_Command(REG);
        digitalWrite(RS, HIGH);
        TFT_Write_Data(VALUE);
}
//======================================================
void WindowSet(unsigned int s_x,unsigned int e_x,unsigned int s_y,unsigned int e_y)
{
  TFT_Write_Command(0x2a);    //SET column address
  digitalWrite(RS, HIGH);
  TFT_Write_Data((s_x)>>8);     //SET start column address
  TFT_Write_Data(s_x);
  TFT_Write_Data((e_x)>>8);     //SET end column address
  TFT_Write_Data(e_x);
  
  TFT_Write_Command(0x2b);    //SET page address
  digitalWrite(RS, HIGH);
  TFT_Write_Data((s_y)>>8);     //SET start page address
  TFT_Write_Data(s_y);
  TFT_Write_Data((e_y)>>8);     //SET end page address
  TFT_Write_Data(e_y);
}
void disp()
{
  unsigned int i, j;
        WindowSet(0,319,0,239);               //set start/end column/page address (full screen)
  TFT_Write_Command(0x2C);              //command to begin writing to frame memory
        digitalWrite(RS, HIGH);
  for(i=0;i<240;i++)         //fill screen with blue pixels
  {
      for(j=0;j<320;j++)
            {
              TFT_Write_Data(0xFF);
              TFT_Write_Data(0x00);
              TFT_Write_Data(0x00);
            }
  }
        WindowSet(0,319,0,239);               //set start/end column/page address (full screen)
  TFT_Write_Command(0x2C);              //command to begin writing to frame memory
        digitalWrite(RS, HIGH);
        for(i=0;i<240;i++)         //fill screen with green pixels
  {
      for(j=0;j<320;j++)
            {
              TFT_Write_Data(0x00);
              TFT_Write_Data(0xFF);
              TFT_Write_Data(0x00);
            }
  }
        WindowSet(0,319,0,239);               //set start/end column/page address (full screen)
  TFT_Write_Command(0x2C);              //command to begin writing to frame memory
        digitalWrite(RS, HIGH);
        for(i=0;i<240;i++)         //fill screen with red pixels
  {
      for(j=0;j<320;j++)
            {
              TFT_Write_Data(0xFF);
              TFT_Write_Data(0x00);
              TFT_Write_Data(0x00);
            }
  }
}
