
#define uchar unsigned char 
#define uint unsigned int

//***********************  DEFINE ***********************************/
//*******************************************************************/

 
 
#define   int0 PIN_B2   //button pause
#define key_add PIN_B3  // contrast UP
#define key_dec PIN_B4  // contrast dw
uchar Contrast_level=78; 

int1 log=0;
 

#define CS0 PIN_E1   // Chip Select
#define CD  PIN_E4   //Data/Instr= Command/Data  /RS
#define WR0 PIN_E3   // W/R=Write/Read
#define WR1 PIN_E0   // Enable  E
#define RES PIN_E7   //RES



void init();
void test();
void display_black();
void display_white();
void frame();
void all_v1();
void all_v2();
void text_dot(uchar ,uchar);
void delayms(uint t);
void write_com(uint para);
void write_data(uint para);
void Delay(uint n);
void delay1(uint n);
void Data_processing(uchar temp);
void adj_Contrast(void);
void display_Contrast_level(uchar number);
void Write_number(uchar x,uchar y,  uchar code *n,uchar k);
void display_address();
void display_gray();

//unsigned char code pic_data[];
//unsigned char code pic_data1[];
//unsigned char code pic_data2[];
//unsigned char code pic_data3[];
 
 

void delay1(uint n)
{while(n--);
}

   
void Delay(uint n)
{while(n)
 {    if((key_add==0)||(key_dec==0)) adj_Contrast();
     n--;
 }
    for(;log==1;)
   {
     if((key_add==0)||(key_dec==0)) adj_Contrast();
   }

   return;
}


void delayms(uint t)
{
   register int i,j;
   for(i=0;i<t;i++)
   for(j=0;j<125;j++);
} 

void Write_number(uchar x,uchar y,  uchar code *n,uchar k)
{   uchar i,j,xi; 
         x=37+x;
         xi=0x00|(x&0x0f);      //lsb
         x=0x10|((x&0xf0)>>4);    //msb  

   for(i=0;i<14;i++)
      {
         write_com(xi);
         write_com(x);
         write_com(0x60|(y&0x0f));
         write_com(0x70|((y&0xf0)>>4));

            {
            j=(*(n+14*k+i));
            Data_processing(j);
            }
               write_data(0x00);
            y++;
       }
}


/*
void display_Contrast_level(uchar number)
{   uchar number1,number2,number3;
   number1=number/100;number2=number%100/10;number3=number%100%10;

    Write_number(0,0,num,number1);

   Write_number(4,0,num,number2);

   Write_number(8,0,num,number3);

}

*/

 
void adj_Contrast(void)
{   delay1(300);
     if((key_add==0)||(key_dec==0))
      {      
       if   (key_add==0) 
         {if(Contrast_level==0xff)   {display_Contrast_level(Contrast_level); return;}      
         Contrast_level+=1; 
         write_com(0x81);         //electronic potentionmeter
         write_com(Contrast_level);      
         display_Contrast_level(Contrast_level);
         delay1(18000);
         if(key_add==0)
            {delay1(18000);
               if(key_add==0)         
                  {delay1(18000);
                     if(key_add==0)
                        {delay1(18000);
                           if(key_add==0)

                              {while(key_add==0)
                                 {Contrast_level+=1; if(Contrast_level==0xff) return;
                                    write_com(0x81);         //electronic potentionmeter
                                    write_com(Contrast_level);
                                    display_Contrast_level(Contrast_level);
                                     delay1(20000); 
                                 }
                              }
                        }            
                  }                  
            }                                    
         }
   


        
   
       if   (key_dec==0) 
         {if(Contrast_level==0x00)   {display_Contrast_level(Contrast_level); return;}
         Contrast_level-=1; 
         write_com(0x81);         //electronic potentionmeter
         write_com(Contrast_level);   
         display_Contrast_level(Contrast_level);
         delay1(18000);
         if(key_dec==0)
            {delay1(18000);
               if(key_dec==0)         
                  {delay1(18000);
                     if(key_dec==0)
                        {delay1(18000);
                           if(key_dec==0)

                              {while(key_dec==0)
                                 {Contrast_level-=1; if(Contrast_level==0x00) return;
                                    write_com(0x81);         //electronic potentionmeter
                                    write_com(Contrast_level);      
                                    display_Contrast_level(Contrast_level);
                                     delay1(20000); 
                                 }
                              }
                        }            
                  }
      
            }                                    
         }

        }
    return;
}


 



void init()             
{  
            /*/>>>*/ output_high(WR1);  
   delay_ms(5);
   output_high(RES); 
   delay_ms(20);         
   output_low(RES);
   delay_ms(20);
   output_high(RES); 
   delay_ms(200);
   write_com(0xe2); // set system reset    //11100010
        delay_ms(100);  //delayms 200ms

    /*power control*/               
   write_com(0xeb);         //Bias Ratio:1/12 bias
   write_com(0x2b);         //power control set as internal power
   write_com(0x24);         //set temperate compensation as 0%
   write_com(0x81);         //electronic potentionmeter
   write_com(Contrast_level);   

   /*display control*/
   write_com(0xa4);         //all pixel off 
   write_com(0xa6);         //inverse display off

   /*lcd control*/
   write_com(0xc4);         //Set LCD Maping Control (MY=1, MX=0)
   write_com(0xa3);         // 0xA1  line rate 15.2klps
   write_com(0xd1);         //rgb-rgb
   write_com(0xd5);         //4k color mode
   write_com(0x84);         //12:partial display control disable


   /*n-line inversion*/
   write_com(0xc8);
   write_com(0x10);         //enable NIV

   /*com scan fuction*/
   write_com(0xda);         //enable FRC,PWM,LRM sequence

   /*window*/
   write_com(0xf4);         //wpc0:column
   write_com(0);         //start from 0
   write_com(0xf6);         //wpc1
   write_com(79);         //end:3*80=240

   write_com(0xf5);         //wpp0:row
   write_com(0x00);         //start from 0
   write_com(0xf7);         //wpp1
   write_com(127);         //end 128

   write_com(0xf8);         //inside mode 

   write_com(0x89);         //RAM control

   
   /*scroll line*/
   write_com(0x40);         //low bit of scroll line
   write_com(0x50);         //high bit of scroll line

   write_com(0x90);         //14:FLT,FLB set
   write_com(0x00);

   /*partial display*/
   write_com(0x85);         //12,set partial display control:on
   write_com(0xf1);         //com end
   write_com(159);         //160
   write_com(0xf2);         //display start 
   write_com(32);            //0
   write_com(0xf3);         //display end
   write_com(159);         //128

           display_address();
           
           
          display_white();

   write_com(0xad);         //display on,select on/off mode.Green Enhance mode disable
   
   
              write_com(0xaf); //set display enable

}


void display_address()
{

   write_com(0x60);         //row address LSB
   write_com(0x70);         //row address MSB
   write_com(0x10);         //column address MSB
    write_com(0x00);         //column address LSB        
  }

void display_black()
{
  uint i,j;
  for(i=0;i<128;i++)
     {      
      for(j=0;j<120;j++)      //1byte data or 2 dot  120*2=240dot 
      {
            write_data(0xff);

      }
     }
}

void display_white()
{
  uint i,j;
  for(i=0;i<128;i++)
     {     
      for(j=0;j<120;j++)      //1byte data or 2 dot  120*2=240dot 
      { 
              write_data(0x00); 

      }
     }
}


void text_dot(uchar data1,uchar data2)
{
  uint i,j;
  for(i=0;i<64;i++)
     {
      for(j=0;j<120;j++)      //1byte data or 2 dot  120*2=240dot 
      { 
            write_data(data1);      
   
      }
      for(j=0;j<120;j++)
      {
         write_data(data2); 

      }
     }
}





void write_com(uint para)
{
  output_low(CS0); // CS0=0;
  output_low(CD); //CD=0;
  output_low(WR1); // output_high(WR1); //E  
  output_low(WR0);      
  output_d(para);              
  output_high(WR0);
  
  output_high(CS0);//CS0=1;  
}

void write_data(uint para)
{
     output_low(CS0); //CS0=0;
     output_high(CD); 
     output_low(WR1); // output_high(WR1); //E  
     output_low(WR0);      
     output_d(para);              
     output_high(WR0);
     
     output_high(CS0);//CS0=1;  
}



void disppic(unsigned char code *pic)
{
uint k=0;
uint i,j;
uchar temp;
   for(i=0;i<128;i++) // 240*128 B/W picture for example
   {
      for(j=0;j<30;j++) // 240 dot/ 8 bite=30 byte
      {      temp=pic[k++]; 
         Data_processing(temp);
      }
   }

}
    

void Data_processing(uchar temp)  //turns 1byte B/W data to 4k-color data(RRRR-GGGG-BBBB)   
{unsigned char temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8;
unsigned char h11,h12,h13,h14,h15,h16,h17,h18,d1,d2,d3,d4;

      temp1=temp&0x80;
      temp2=(temp&0x40)>>3;
      temp3=(temp&0x20)<<2;
      temp4=(temp&0x10)>>1;
      temp5=(temp&0x08)<<4;
      temp6=(temp&0x04)<<1;
      temp7=(temp&0x02)<<6;
      temp8=(temp&0x01)<<3;
      h11=temp1|temp1>>1|temp1>>2|temp1>>3;
      h12=temp2|temp2>>1|temp2>>2|temp2>>3;
      h13=temp3|temp3>>1|temp3>>2|temp3>>3;
      h14=temp4|temp4>>1|temp4>>2|temp4>>3;
      h15=temp5|temp5>>1|temp5>>2|temp5>>3;
      h16=temp6|temp6>>1|temp6>>2|temp6>>3;
      h17=temp7|temp7>>1|temp7>>2|temp7>>3;
      h18=temp8|temp8>>1|temp8>>2|temp8>>3;
      d1=h11|h12;
      d2=h13|h14;
      d3=h15|h16;
      d4=h17|h18;

      write_data(d1);
      write_data(d2);
      write_data(d3);
      write_data(d4);
}



const BYTE       num[10][14]={/*--  文字:  0  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,

/*--  文字:  1  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x18,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x3C,0x66,0x66,0x06,0x0C,0x18,0x30,0x66,0x7E,0x00,0x00,

/*--  文字:  3  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x3C,0x66,0x66,0x1C,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,

/*--  文字:  4  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x0C,0x0C,0x1C,0x3C,0x6C,0x6C,0xCC,0x7E,0x0C,0x1E,0x00,0x00,

/*--  文字:  5  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x7E,0x60,0x60,0x7C,0x66,0x06,0x66,0x66,0x3C,0x00,0x00,

/*--  文字:  6  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x3E,0x66,0xC0,0xFC,0xE6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,

/*--  文字:  7  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x7E,0x66,0x6C,0x0C,0x18,0x18,0x18,0x18,0x18,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x7C,0xC6,0xC6,0x6C,0x7C,0xC6,0xC6,0xC6,0x7C,0x00,0x00,

/*--  文字:  9  --*/
/*--  宋体11;  此字体下对应的点阵为：宽x高=8x14   --*/
0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xCE,0x7E,0x06,0xCC,0xF8,0x00,0x00,

};

