//LCD CONTROLLER: ST7529*1
#include <ctype.h>
#include <reg51.h>
#include <stdio.h>
#include <string.h>
//#include <intrins.h>
//#include "f:\test\font\ch12864.c"
//#include "D:\LCD_PRO\CHAR1\icon.c"
#define dataport P0
sbit RS=P1^0;
sbit RW=P1^1;
sbit E_RD=P1^2;
sbit RES=P1^3;
sbit CS1=P1^4;
sbit key=P2^0;

typedef unsigned char uchar;
typedef unsigned int uint;
static uchar d;
    uchar code clear[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    uchar code Map1[]={0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00};
    uchar code Map2[]={0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
    uchar code Map3[]={0xf0,0xf0,0xf0,0xf0,0x0f,0x0f,0x0f,0x0f};
    uchar code Map4[]={0xf0,0x3f,0xf0,0x3f,0xf0,0x3f,0xf0,0x3f,0xf0};
    uchar code Map5[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    uchar code Map6[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
    uchar code pic1[]={
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X0F,0XFC,0X1F,0X8E,0X4F,0XF8,0XFC,0X00,0X10,0X3F,0X8F,0XFF,0XFF,0XFF,0X81,0XF2,
0XFC,0X7E,0X00,0X00,0X00,0XFC,0X0F,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X03,0X07,
0X06,0X19,0XC3,0X0C,0X30,0X00,0X30,0X0E,0X02,0X63,0X19,0X81,0X83,0X0E,0X30,0X18,
0X00,0X00,0X00,0X30,0X0C,0X63,0X30,0X70,0X00,0X00,0X00,0X00,0X03,0X03,0X86,0X30,
0XC3,0X06,0X30,0X00,0X38,0X06,0X04,0X43,0X09,0X80,0X84,0X06,0X30,0X18,0X00,0X00,
0X00,0X30,0X08,0X61,0X30,0X38,0X00,0X00,0X00,0X00,0X03,0X01,0X86,0X30,0X43,0X06,
0X30,0X00,0X58,0X03,0X04,0X03,0X01,0X80,0X0C,0X06,0X30,0X18,0X00,0X00,0X00,0X30,
0X00,0X60,0X30,0X18,0X00,0X00,0X00,0X00,0X03,0X00,0XC6,0X38,0X43,0X06,0X30,0X00,
0X4C,0X01,0X88,0X03,0X01,0X82,0X18,0X02,0X30,0X18,0X00,0X00,0X00,0X30,0X00,0X60,
0X30,0X0C,0X00,0X00,0X00,0X00,0X03,0X00,0XC6,0X1C,0X03,0X06,0X30,0X00,0X4C,0X01,
0X90,0X03,0X01,0X82,0X18,0X00,0X30,0X18,0X00,0X00,0X00,0X30,0X00,0X60,0X30,0X0C,
0X00,0X00,0X00,0X00,0X03,0X00,0XC6,0X0F,0X03,0X0C,0X30,0X00,0X8C,0X00,0XD0,0X03,
0X01,0XFE,0X18,0X00,0X3F,0XF8,0X00,0X00,0X00,0X30,0X00,0X60,0X30,0X0C,0X00,0X00,
0X00,0X00,0X03,0X00,0XC6,0X03,0X83,0XF8,0X30,0X00,0X86,0X00,0X60,0X03,0X01,0X82,
0X18,0X00,0X30,0X18,0X00,0X00,0X00,0X30,0X00,0X60,0X30,0X0C,0X00,0X00,0X00,0X00,
0X03,0X00,0XC6,0X01,0XC3,0X00,0X30,0X01,0XFE,0X00,0X60,0X03,0X01,0X82,0X18,0X00,
0X30,0X18,0X00,0X00,0X00,0X30,0X00,0X60,0X30,0X0C,0X00,0X00,0X00,0X00,0X03,0X00,
0XC6,0X20,0XE3,0X00,0X30,0X01,0X06,0X00,0X60,0X03,0X01,0X80,0X18,0X00,0X30,0X18,
0X00,0X00,0X00,0X30,0X00,0X60,0X30,0X0C,0X00,0X00,0X00,0X00,0X03,0X01,0X86,0X20,
0X63,0X00,0X30,0X12,0X03,0X00,0X60,0X03,0X01,0X80,0X4C,0X02,0X30,0X18,0X00,0X00,
0X00,0X30,0X10,0X60,0X30,0X18,0X00,0X00,0X00,0X00,0X03,0X03,0X06,0X30,0X63,0X00,
0X30,0X32,0X03,0X00,0X60,0X03,0X01,0X80,0X8C,0X04,0X30,0X18,0X00,0X00,0X00,0X30,
0X30,0X60,0X30,0X30,0X00,0X00,0X00,0X00,0X03,0X06,0X06,0X38,0XC3,0X00,0X30,0X66,
0X03,0X80,0X60,0X03,0X01,0X81,0X87,0X08,0X30,0X18,0X00,0X00,0X00,0X30,0X60,0X60,
0X30,0X60,0X00,0X00,0X00,0X00,0X0F,0XFC,0X1F,0XA7,0X8F,0XC0,0XFF,0XEF,0X07,0XC1,
0XF8,0X0F,0XC7,0XFF,0X81,0XF0,0XFC,0X7E,0X00,0X00,0X00,0XFF,0XE1,0XF8,0XFF,0XC0,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};
    //uchar code IC[]={0xa0,0x40,0xa3,0xc0};

void delay1(uint t)
    {
     uint i,j,k;
     for(i=0;i<t;i++)
       for (j=0;j<5;j++)
         {if(key==0)
          {
          for(k=0;k<25000;k++);
          while(key==1);
          i=t;
          j=5;
          //break; 
          }
          else;
          }          
     }
void delay3(uint t)
    {
     uint i,j;
     for(i=0;i<t;i++)
     for (j=0;j<5;j++); 
     }
void delay2(uint t)
    {
     uint i,j;
     for(i=0;i<t;i++);
     }
void wcom(uchar data1,bit di)
    {
     RS=di;
     //CS1=0;
     //RW=0;
     E_RD=1;
     dataport=data1;
     delay2(1);
     RW=0;
     //E_RD=1;
     //delay2(1);
     //E_RD=0;
     RW=1;
     //delay2(1);
     }
void wdata(uchar data1)
    {
     uchar a,b;
     uint i;
     b=data1;
     //CS1=0;
     E_RD=1;
     //RW=0;
     wcom(0x15,0);  //column address set
     wcom(d,1);  //start column=5
     wcom(0x50,1);  //end column=84
     wcom(0x5c,0);  //enter data writting mdoe
     RS=1;
     for(i=0;i<3;i++)
      { 
        a=b;
        a=a&0x80;
        if(a!=0)
         dataport=0xff;
        else
         dataport=0x00;
         RW=0;
         //E_RD=1;
         //delay2(1);
         RW=1;
         //E_RD=0;
         //delay2(1);
         b=b<<1;
       }
       d++;
       //delay2(15);
     }
void wdata2(uchar data1)
    {
     uchar a,b;
     uint i;
     b=data1;
     RS=1;
     //CS1=0;
     E_RD=1;
     //RW=0;
     for(i=0;i<8;i++)
      { 
        a=b;
        a=a&0x80;
        if(a!=0)
         dataport=0xff;
        else
         dataport=0x00;
         RW=0;
         //E_RD=1;
         //delay3(3);
         RW=1;
         //E_RD=0;
         //delay3(1);
         b=b<<1;
       }
       delay2(5);
     }
void wdata3(uchar data1)
    {
     uchar a,b;
     uint i;
     b=data1;
     //CS1=0;
     E_RD=1;
     //RW=0;
     wcom(0x15,0);  //column address set
     wcom(d,1);  //start column=5
     wcom(0x50,1);  //end column=84
     wcom(0x5c,0);  //enter data writting mdoe
     RS=1;
     for(i=0;i<3;i++)
      { 
        a=b;
        a=a&0x80;
        if(a!=0)
         dataport=0xff;
        else
         dataport=0x00;
         RW=0;
         //E_RD=1;
         //delay3(3);
         //E_RD=0;
         RW=1;
         //delay3(1);
         b=b<<1;
       }
       d++;
       //delay2(2);
     wcom(0x15,0);  //column address set
     wcom(d,1);  //start column=5
     wcom(0x50,1);  //end column=84
     wcom(0x5c,0);  //enter data writting mdoe
     RS=1;
      for(i=0;i<3;i++)
      { 
        a=b;
        a=a&0x80;
        if(a!=0)
         dataport=0xff;
        else
         dataport=0x00;
         RW=0;
         //E_RD=1;
         //delay3(3);
         //E_RD=0;
         RW=1;
         //delay3(1);
         b=b<<1;
       }
       d++;
       //delay2(2);
     }

void initial(void)
    {
     //uchar i;
     CS1=0;
     delay3(1000);
     RES=0;
     delay3(100);
     RES=1;
     delay3(1000);
     wcom(0x30,0);   //ext=0
     wcom(0x94,0);   //sleep cancel
     wcom(0xd1,0);   //osc on
     wcom(0x20,0);   //power control
     wcom(0x08,1);   //vb on
     delay3(500);
     wcom(0x20,0);   //power control
     wcom(0x0b,1);   //vb,vf,vr on       
     wcom(0x81,0);   //electronic volumn set
     wcom(0x18,1);
     wcom(0x04,1);
     wcom(0xca,0);   //display control
     wcom(0x00,1);   //cld=0
     wcom(0x23,1);   //set duty=1/144
     wcom(0x00,1);   //set fr value
     wcom(0xa7,0);   //normal display
     wcom(0xbb,0);   //common scan
     wcom(0x02,1);   //com79~com0,com80~com159
     wcom(0xbc,0);   //data scan direction
     wcom(0x00,1);   //seg254~seg0,com160~con0
     wcom(0x00,1);  //rgb arrangement
     wcom(0x04,1);  //32gray scale 3b3p dither mode
     wcom(0x75,0);  //line address set
     wcom(0x00,1);  //start line=0
     wcom(0x9f,1);  //end line=159
     wcom(0x15,0);  //column address set
     wcom(0x15,1);  //start column=21
     wcom(0x54,1);  //end column=84
     wcom(0xa9,0);  //partial out
     wcom(0x31,0);  //ext=1
     wcom(0x32,0);  //analog circuit set
     wcom(0x01,1);  //osc frequency set
     wcom(0x00,1);  //booster efficiency=00
     wcom(0x02,1);  //bias=1/12
     wcom(0x34,0);  //dithering off
     wcom(0x20,0);  //gray 1 set
     wcom(0x00,1);  //lv0
     wcom(0x02,1);  //lv0
     wcom(0x04,1);  //lv0
     wcom(0x06,1);  //lv0
     wcom(0x08,1);  //lv0
     wcom(0x0a,1);  //lv0
     wcom(0x0c,1);  //lv0
     wcom(0x0e,1);  //lv0
     wcom(0x10,1);  //lv0
     wcom(0x12,1);  //lv0
     wcom(0x14,1);  //lv0
     wcom(0x16,1);  //lv0
     wcom(0x18,1);  //lv0
     wcom(0x1a,1);  //lv0
     wcom(0x1c,1);  //lv0
     wcom(0x1f,1);  //lv0
     wcom(0x21,0);  //gray 2 set
     wcom(0x00,1);  //lv0
     wcom(0x02,1);  //lv0
     wcom(0x04,1);  //lv0
     wcom(0x06,1);  //lv0
     wcom(0x08,1);  //lv0
     wcom(0x0a,1);  //lv0
     wcom(0x0c,1);  //lv0
     wcom(0x0e,1);  //lv0
     wcom(0x10,1);  //lv0
     wcom(0x12,1);  //lv0
     wcom(0x14,1);  //lv0
     wcom(0x16,1);  //lv0
     wcom(0x18,1);  //lv0
     wcom(0x1a,1);  //lv0
     wcom(0x1c,1);  //lv0
     wcom(0x1f,1);  //lv0
     wcom(0x30,0);  //ext=0
     wcom(0xaf,0);  //display on
     delay3(100);     
     }


void displine(uchar array[])
    {
     uint i,j,k;
     uchar c=0x10;
     d=0x00;
     wcom(0x75,0);  //line address set
     wcom(0x10,1);  //start line=0
     wcom(0x10,1);  //end line=0
     for(i=0;i<64;i++)
         {
          for(j=0;j<1;j++)
          {
              for(k=0;k<40;k++)
                wdata3(array[j]);
     c++;
     d=0x00;
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=16
     wcom(c,1);  //end line=143
          }
         }
     c=0x50;
     d=0x00;
     wcom(0x75,0);  //line address set
     wcom(0x50,1);  //start line=64
     wcom(0x50,1);  //end line=64
     for(i=0;i<64;i++)
         {
          for(j=0;j<1;j++)
          {
              for(k=0;k<40;k++)
                wdata3(array[j]);
     c++;
     d=0x00;
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=c
     wcom(c,1);  //end line=143
          }
         }
     }
void dispsquare(void)
  {
   uint i,j;
   uchar c=0x10;
   d=0x00;
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=16
     wcom(c,1);  //end line=144
   for(i=0;i<80;i++)
     {
        wdata(0xff);
     }
     c++;
    for(i=0;i<63;i++)
     {
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=0
     wcom(c,1);  //end line=0
     d=0x00;
     wdata(0x80);
     for(j=0;j<78;j++)
      { 
        wdata(0x00);
      }
     wdata(0x20);
     c++;
     }
     c=0x50;
    for(i=0;i<63;i++)
     {
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=0
     wcom(c,1);  //end line=159
     d=0x00;
     wdata(0x80);
     for(j=0;j<78;j++)
      { 
        wdata(0x00);
      }
     wdata(0x20);
     c++;
     }
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=0
     wcom(c,1);  //end line=159
     d=0x00;
   for(i=0;i<80;i++)
     {
        wdata(0xff);
     }
  }
void dispgraphic(uchar graphic[])
    {
     uint i,j,k,l,m;
     uchar c=0x10;
     k=0;
    for (l=0;l<4;l++)
       {
       k=0;
        for (i=0;i<16;i++)
         {
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=0
     wcom(c,1);  //end line=159
     wcom(0x15,0);  //column address set
     wcom(0x00,1);  //start column=0
     wcom(0x50,1);  //end column=79
     wcom(0x5c,0);  //enter data writting mdoe
          for (j=0;j<30;j++)
              {
               wdata2(graphic[k]);
               k++;
               }
               c++;
               }
        }
       c=0x50;
    for (l=0;l<4;l++)
       {
       k=0;
        for (i=0;i<16;i++)
         {
     wcom(0x75,0);  //line address set
     wcom(c,1);  //start line=0
     wcom(c,1);  //end line=159
     wcom(0x15,0);  //column address set
     wcom(0x00,1);  //start column=0
     wcom(0x50,1);  //end column=79
     wcom(0x5c,0);  //enter data writting mdoe
          for (j=0;j<30;j++)
              {
               wdata2(graphic[k]);
               k++;
               }
               c++;
               }
        }
      }
void main(void)
    {
     initial();
     while(1)
         {
          
 initial();
         //wcom(0xa7,0);
         //delay1(25000);
          //displine(Map6);
          displine (clear);
          displine(Map6); //all
          delay3(5000);
          delay1(15000);
         // waitkey ();


          dispsquare();   //square
          delay3(5000);
          delay1(15000);
          
          //displine(Map2);
          displine(Map2);  //column
          delay3(5000);
          delay1(15000);
          //waitkey ();



          //displine(clear);
          //displine(Map4);  //checker
          //delay3(5000);
          //delay1(15000);
          //waitkey ();
          //dispgraphic(pic1);
     //wcom(0x81,0);   //electronic volumn set
     //wcom(0x27,1);
     //wcom(0x04,1);
          dispgraphic(pic1);  //photo
          delay3(5000);
          delay1(25000);
          
          //displine (clear);  //blank
          //delay3(5000);
          //waitkey ();
          }
     }

