#include <Reg52.h>
sbit p12=P1^2;
sbit p14=P1^4;
sbit p00=P0^0;
sbit p01=P0^1;
sbit p36=P3^6;
sbit p37=P3^7;

code const unsigned short int  Lattice_YU[32]={0x04,0x00,0x04,0x00,0x0F,0xE0,0x10,0x40,
                                     0x20,0x88,0x7F,0xFC,0xA1,0x08,0x21,0x08,
                                     0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,
                                     0x20,0x08,0x00,0x04,0xFF,0xFE,0x00,0x00};       //鱼


void LDataWrite(unsigned short int  LData)
{
  data unsigned short int  i;
  data unsigned short int d;
  i=LData;
  P3=0xC0;   //WR,RD为1,其余为0。
  P0=0xFF;   //P0口为数据口,初始化。
  p12=1;     //C/D控制口。
  p37=0;     //读信号有效
  d=P0;
 if((d&0x03)==0x03)  //P0口读出的状态字看LCD的读写是否有效P0.0为1是读有效,P0.1为1是写有效,P0.3为1是自动写有效。
    { p12=0;    //写入数据
      p36=0;
      P0=i;
      p12=1;
      p36=1;
    }
 else (void)LDataWrite(i);
}

void LCodeWrite(unsigned short int LCode)
{
  data unsigned short int  i;
  data unsigned short int c;
  i=LCode;
  P3=0xC0;
  P0=0xFF;
  p12=1;
  p37=0;
  c=P0;
  if((c&0x03)==0x03) {p12=1;   //写入指令
                      p36=0;
                      P0=i;
                      p12=1;
                      p36=1;
                     }
  else (void)LCodeWrite(i);
}

/*void ContinueWrite(unsigned short int LCode,unsigned short int m,unsigned short int n)  连续写函数
{
  data unsigned short int  i;
  data unsigned short int c;
  data unsigned short int  l;
  data unsigned short int k;
  l=m;
  k=n;
  i=LCode;
  P3=0xC0;
  P0=0xFF;
  p12=1;
  p37=0;
  c=P0;
  if((c&0x07)==0x07)
  {
   for(l;l--;l>0)
    for(k;k--;k>0)
     {
      p12=0;
      p36=0;
      P0=i;
      p12=1;
      p36=1;
     }
  }
  else (void)ContinueWrite(i,l,k);
}
 */


void LCD_C()   //LCD初始化文本区首地址,文本区宽度,显示开关设置,光标形状,显示方式,图形区首地址,图形区宽度
{
 unsigned short int c;
 unsigned short int m;
 unsigned short int n;
 LDataWrite(0);
 LDataWrite(0);
 LCodeWrite(0x24);
 //LCodeWrite(0xB0);
// ContinueWrite(0x00,0x01,0x02);
// LCodeWrite(0xB2); //qk xs RAM cunchuqu
 //SP=0x60;
 p14=1;
 LDataWrite(0);
 LDataWrite(0);
 LCodeWrite(0x40);
 LDataWrite(0x20);
 LDataWrite(0x00);
 LCodeWrite(0x41);
 LCodeWrite(0x9C);
 LCodeWrite(0xA7);
 LCodeWrite(0x80);
 LDataWrite(0x00);
 LDataWrite(0x08);
 LCodeWrite(0x42);
 LDataWrite(0x20);
 LDataWrite(0x00);
 LCodeWrite(0x43);
}

void mPutChar(short int x,short int y,short int *Data,short int m)   //可连续显示m个汉字
{                                              //输出图形点阵,先左右后上下
    short int i,j,k;
    short int Pointer;
    Pointer=(y<<4)+(x<<1)+0x0100;              //纵坐标乘以16,横坐标乘以2
   for(k=0;k<m;k++)
   { for(i=0;i<16;i++)
     {
       LDataWrite((unsigned short int )(Pointer%256));
       LDataWrite((unsigned short int )(Pointer/256));
       LCodeWrite(0x24);                      //显示RAM地址
       for(j=0;j<2;j++)
                 {  LDataWrite(*(Data++));
                    LCodeWrite(0xC0);

                 }
        Pointer+=16;    //RAM地址修正
     }
    Pointer=(y<<4)+((x++)<<1)+0x0100;
  }
}

main()
{

LCD_C();
mPutChar(2,16,Lattice_YU,1);

}