有关单片机的lcd1602的显示问题

#include"reg52.h"
#define LCD1602_DATAPINS P0 
sbit LCD1602_E=P2^7; 
sbit LCD1602_RW=P2^5; 
sbit LCD1602_RS=P2^6;
int i;
/****************************************************************
*************** 
* 函 数 名 : Delay
 * 函数功能 : 延时函数,延时 1ms 
* 输 入 : c 
* 输 出 : 无 
* 说 名 : 该函数是在 12MHZ 晶振下,12 分频单片机的延时。 
*****************************************************************
**************/
int delay(int c)
{
 char a,b; 
for (; c>0; c--)
 { 
for (b=199;b>0;b--) 
{ 
for(a=1;a>0;a--);
 } 
}

}
/****************************************************************
*************** 
* 函 数 名 :lcdwriteCom
 * 函数功能 : 写入一个字节的命令 
* 输 入 : com
* 输 出 : 无 
* 说 名 : 
*****************************************************************
**************/
void lcdwriteCom(char com)
{
  LCD1602_E = 0;
  LCD1602_RS = 0;
  LCD1602_RW = 0;
  LCD1602_DATAPINS = com;
  delay(1);
  LCD1602_E = 1;
  delay(5);
  LCD1602_E = 0;
}

/****************************************************************
*************** 
* 函 数 名 :lcdwriteCom
 * 函数功能 : 写入一个字节的数据
* 输 入 : data
* 输 出 : 无 
* 说 名 : 
*****************************************************************
**************/
void lcdwriteDate(char date)
{
  LCD1602_E = 0;
  LCD1602_RS = 1;
  LCD1602_RW = 0;
  LCD1602_DATAPINS = date;
  delay(1);
  LCD1602_E = 1;
  delay(5);
  LCD1602_E = 0;
}

/****************************************************************
*************** 
* 函 数 名 :lcdInw
 * 函数功能 : 初始化LCD1602屏
* 输 入 : 无
* 输 出 : 无 
* 说 名 : 
*****************************************************************
**************/
void lcdInw()
{
  lcdwriteCom(0x38); //开显示 
  lcdwriteCom(0x0c); //开显示不显示光标 
  lcdwriteCom(0x6c);
  lcdwriteCom(0x06); //写一个指针加 1 
  lcdwriteCom(0x01); //清屏 
  lcdwriteCom(0x80); //设置数据指针起点 
 
}

void main()
{  
  char Disp[] ="diegjmds";
  lcdInw();
  for(i=0;i<16;i++)
    {
     lcdwriteDate(Disp[i]); 
     }while(1); 
}



题主没说明白啥问题,不过 第 94 行
for(i=0;i<16;i++)
i 的取值范围超界了,Disp 只有 8 个字符,应该改成
for(i=0;i<8;i++)


这里有很多1602例子
lcdwriteCom
lcdwriteDate
lcdInw
几个函数按例子中的代码修改下就行