#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "reg51.h"                  
#define mydata (( unsigned char xdata *)0x0036)  //記憶體起始位址
char Spectrum_bar[32]={0};                       //頻譜陣列
unsigned char Int0_number=1;                     //Int0中斷使用變數           
sbit RD0=P3^1;
sbit INT00=P3^2;
sbit INT10=P3^3;
sbit DC=P3^4;
sbit CS=P3^5;
sbit WR0=P3^6;
sbit RES=P3^0;
//-----------------SPI專用start(不用時請關閉)---------------
sbit SCLK=P1^0;
sbit SDIN=P1^1;
void lifetime(void);
void CleanScreen(void);

//----------------計時器0 setting start----------------------------------------------------
void delay_Time(unsigned int i)
{
TR0=1;
TL0=(256-240);   //120us 
TH0=(256-240);   //24M Hz (quartz)
while(i!=0){
    while(TF0!=1);
    TF0=0;
    i--;
    }
TR0=0;
}

void delay_second(unsigned char i)
{
while(i!=0){
  delay_Time(20);
  i--;
  }
}
//----------------計時器0 setting end---------------------------------------
void delay(unsigned int a)
{
while(a!=0)
  a--;
}

//-------------------------(SPI LOW------------------------------------------
void SPI_LOW(void)
	{
	SCLK=0;
	SDIN=0;
	SCLK=1;
	}
//-------------------------SPI LOW)------------------------------------------
//-------------------------(SPI HIGH------------------------------------------
void SPI_HIGH(void)
	{
	SCLK=0;
	SDIN=1;
	SCLK=1;
	}
//-------------------------SPI HIGH)------------------------------------------------
//-------------------------(SPI SERIAL Sned-----------------------------------------
void SPI_SERIAL(unsigned char a)
	{
	  if (((a&0x80)>>7) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x40)>>6) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x20)>>5) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x10)>>4) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x08)>>3) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x04)>>2) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if (((a&0x02)>>1) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	
	  if ((a&0x01) == 1)
	  {SPI_HIGH();}
	  else
	  {SPI_LOW();}
	}


//----------------------
void data_out(char a)     //8bit interface
	{
	CS=0;
	DC=1;
	WR0=0;
	RD0=0;
	SPI_SERIAL(a);
	DC=0;
	CS=1;
	
	}

void comm_out(char a)
	{
	
	CS=0;
	DC=0;
	WR0=0;
	RD0=0;
	SPI_SERIAL(a);
	CS=1;
	
	}





//-------------------------------------------------------------------------------------
void init_oled(void)
	{
	CS=0;
	DC=1;
	RES=1;
	comm_out(0x01);// Soft Reset
	comm_out(0x02);// Display Off
	data_out(0x00);
	comm_out(0x03);// DSTBY ON
	data_out(0x01);
	comm_out(0x03);// DSTBY OFF
	data_out(0x00);
	comm_out(0x04);// DFRAME
	data_out(0x04);
	comm_out(0x05);// Write Direction
	data_out(0x00);
	comm_out(0x06);// Scan Direction
	data_out(0x01);
	comm_out(0x07);// Display Size
	data_out(0x00);// X-Start
	data_out(0x00);
	data_out(0x03);// X-End
	data_out(0x3f);
	data_out(0x00);// Y-Start
	data_out(0x00);
	data_out(0x05);// Y-End
	data_out(0x0f);
	comm_out(0x08);// Set Interface Bus
	data_out(0x00); // 6Bit I/F Bus
	comm_out(0x09);// Data Masking
	data_out(0x07);
	comm_out(0x0b);// Display Start Address
	data_out(0x00);// X-Start
	data_out(0x00);
	data_out(0x00);// Y-Start
	data_out(0x00);
	
	comm_out(0x0e);// Dot Current(VCC_C=12V)
	data_out(0x08);
	data_out(0x0e);
	data_out(0x08);
	data_out(0x0e);
	data_out(0x08);
	data_out(0x0e);
	
	comm_out(0x0f);// Peak Current
	data_out(0x05);
	data_out(0x05);
	data_out(0x05);
	comm_out(0x1c);// Pre-Charge Width
	data_out(0x08);
	comm_out(0x1d);// Peak Pulse Width
	data_out(0x05);
	data_out(0x05);
	data_out(0x05);
	comm_out(0x1e);// Set Peak Pulse Delay
	data_out(0x05);
	comm_out(0x1f);// Row Scan Operation
	data_out(0x00);
	comm_out(0x30);// VCC_R
	data_out(0x10);
	comm_out(0x3b);// Set Gamma Correction Table Initialize
	comm_out(0x3c);// VDD Selection
	data_out(0x00);// 0x00=2.8V,0x01=1.8V
	comm_out(0x3d);// Gray Scale
	data_out(0x01);
	
	CleanScreen();//Clear all RAM data.
	
	comm_out(0x02);// Display On
	data_out(0x01);
	
	}
//--------------------------------------------------------------------------------------
void CleanScreen(void)
	{
	int i,j;
	comm_out(0x0a);// Memory Box Size
	data_out(0x00);// X-Start
	data_out(0x00);
	data_out(0x05);// X-End
	data_out(0x0f);
	data_out(0x00);// Y-Start
	data_out(0x00);
	data_out(0x05);// Y-End
	data_out(0x0f);
	comm_out(0x0c);//Write RAM Command
	for(i=0;i<96;i++)
		{
		for(j=0;j<96;j++)
			{
			data_out(0x00);
			data_out(0x00);
			data_out(0x00);
			}
		}
	}

//--------------------------------------------------------------------------------------
void All_on(void)//256X96 pixel
	{
	int i,j;
	comm_out(0x0a);// Memory Box Size
	data_out(0x00);// X-Start
	data_out(0x00);
	data_out(0x05);// X-End
	data_out(0x05);
	data_out(0x00);// Y-Start
	data_out(0x00);
	data_out(0x05);// Y-End
	data_out(0x0f);
	comm_out(0x0c);//Write RAM Command
	
	for(i=0;i<96;i++)
		{
		for(j=0;j<85;j++)
			{
			data_out(0xff);
			data_out(0xff);
			data_out(0xff);
			}
		data_out(0xff);
		data_out(0xff);//Dummy Data
		data_out(0xff);//Dummy Data
		}
	}


//--------------------------------------------------------------------------------------









//---checkerboard1-----------------------------------
void checkerboard1(void)
	{
	int i,j;
	comm_out(0x0a);// Memory Box Size
	data_out(0x00);// X-Start
	data_out(0x00);
	data_out(0x05);// X-End
	data_out(0x05);
	data_out(0x00);// Y-Start
	data_out(0x00);
	data_out(0x05);// Y-End
	data_out(0x0f);
	comm_out(0x0c);//Write RAM Command
	
	for(i=0;i<48;i++)
		{
		for(j=0;j<42;j++)
			{
			data_out(0x00);
			data_out(0xff);
			data_out(0x00);
			data_out(0xff);
			data_out(0x00);
			data_out(0xff);
			}
		data_out(0x00);
		data_out(0xff);
		data_out(0x00);
		data_out(0xff);
		data_out(0xff);//Dummy Data
		data_out(0xff);//Dummy Data
		
		for(j=0;j<42;j++)
			{
			data_out(0xff);
			data_out(0x00);
			data_out(0xff);
			data_out(0x00);
			data_out(0xff);
			data_out(0x00);
			}
		data_out(0xff);
		data_out(0x00);
		data_out(0xff);
		data_out(0x00);
		data_out(0xff);//Dummy Data
		data_out(0xff);//Dummy Data
		}
	}






void switchh(void)
{

  while(INT00==0);
  delay_second(2);
  while(INT00==1);
  delay_second(2);
}








//---------------------------------------------------
void main(void)
	{
	RES=0;
	delay(100);
	RES=1;
	init_oled();
	while(1)
		{
		All_on(); // Show white screen.
		switchh();// stop 
		
		checkerboard1();// show chessboard screen. 
		switchh();// stop 
		}
	}
//----------------------------------------------------------------------

