#include <reg52.h>	
#define uchar unsigned char
#define uint  unsigned int
#define DataPort P0      //单片机 P0 <------> 液晶DB0-DB7
sbit RS=P3^5;        //数据命令选择 
sbit RW=P3^6;        //液晶读写选择
sbit E=P3^4;         //液晶脉冲使能
sbit PSB=P3^7;       //串并方式选择
sbit wela = P2^6;
sbit dula = P2^7;
uchar code table1[] = {"云龙电子"};
uchar code table2[] = {"WWW.YUNLONGDZ.CN"};
uchar code table3[] = {"YL-51 开发板"};
uchar code table4[] = {"带您入门走向精通"};

void delay(int t)  //延时函数   
{
    while(--t);
}		

void lcd_busy()  //检查12864忙状态
 {                          
    RS=0;
    RW=1;
    E=1;
    DataPort=0xff;
    while((DataPort&0x80)==0x80);  //忙则等待
    E=0;
 }

void lcd_wcmd(uchar cmd)   //12864写命令函数,RS=L，RW=L，E=高脉冲，D0-D7=指令码。
{                          
    lcd_busy();
    RS=0;
    RW=0;
    E=0;
    delay(10);
    DataPort = cmd;   //送入命令
    delay(10);
    E = 1;
    delay(10);
    E = 0;  
}

void lcd_wdat(uchar dat)  //12864写数据函数,RS=H，RW=L，E=高脉冲，D0-D7=数据。
{                          
    lcd_busy();
    RS=1;
    RW=0;
    E=0;
	delay(10);
    DataPort = dat;  //送入数据
    delay(10);
    E=1;
    delay(10);
    E=0; 
}

    void lcd_pos(uchar X,uchar Y)  //设定位置显示字符函数     
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}   //第一行，第一个位置 ，跟表10.3.4 汉字显示坐标对应
   else if (X==1)
     {X=0x90;}   //第二行，第一个位置
   else if (X==2)
     {X=0x88;}   //第三行，第一个位置
   else if (X==3)
     {X=0x98;}   //第四行，第一个位置
   pos = X+Y ;  
   lcd_wcmd(pos);     //字符显示地址
}

void lcd_init()   // 12864初始化    
{ 
	wela=0;          //关闭数码管显示
	dula=0; 
    PSB= 1;          //使用8位并口通讯  
    lcd_wcmd(0x34);  //扩充指令操作
    delay(50);
    lcd_wcmd(0x30);  //基本指令操作
    delay(50);
    lcd_wcmd(0x0C);  //开显示，关光标
    delay(50);
    lcd_wcmd(0x01);  //清除显示，并且设定地址指针为00H
    delay(50);
}

  main() //主程序   
 {
    uchar i;
    lcd_init();       //12864初始化              
    lcd_pos(0,0);    //显示位置设为第一行的第1个字符
     i = 0;
    while(table1[i] != '\0')  //  '\0'表示空字符，直到table1[i]是空字符，才退出循环
     {                         
       lcd_wdat(table1[i]);  //显示字符
       i++;
     }
    lcd_pos(1,0);    //显示位置设为第二行的第1个字符
     i = 0;
    while(table2[i] != '\0')
     {
       lcd_wdat(table2[i]);   //显示字符
       i++;
     }
 	 lcd_pos(2,0);    //显示位置设为第三行的第1个字符
     i = 0;
    while(table3[i] != '\0')
     {
       lcd_wdat(table3[i]);  //显示字符
       i++;
     }
	 lcd_pos(3,0);      //显示位置设为第四行的第1个字符
     i = 0;
    while(table4[i] != '\0')
     {
       lcd_wdat(table4[i]);  //显示字符
       i++;
     }
     while(1);
}