为啥我的LCD1602无显示

发布: 2009-6-16 16:37 | 作者: robing4500 | 来源: StmFans思蜕盟 OPELC 自由电子联盟

LCD相关程序如下 R/W  一直处于低电平,因为接地了, 不进行状态检测,使用系统内部晶振,
I/O配置是截取出来的
/*PB11,PB12作为使能口,PB11=EN,PB12=RS */
   GPIO_Initsture.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12;
   GPIO_Initsture.GPIO_Mode = GPIO_Mode_Out_OD;
   GPIO_Initsture.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_Initsture);
   /* PA0作为液晶的数据输出口*/
   GPIO_Initsture.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
   GPIO_Initsture.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Initsture.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_Initsture);

/*************************************************/
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{unsigned int i,j;
   for(i=0;i<ms;i++)
    for(j=0;j<12500;j++);
}

void delay_1us(int time)
{ int i,j;
for(i=0;i<time;i++)
        {
        for(j=0;j<13;j++);
        }
}

void write_cmd(unsigned int a)//写指令//
{ GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_RESET);
  delay1ms(15);
  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
  GPIO_Write(GPIOA,a);
  GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_SET);
  delay_1us(3);
  GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_RESET);

}

void write_data(unsigned int data)//写数据//
{ GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_RESET);
  delay1ms(15);
  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
   GPIO_Write(GPIOA,data);
   GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_SET);
   delay_1us(3);
   GPIO_WriteBit(GPIOB,GPIO_Pin_11,Bit_RESET);
}

void init_lcd(void)//初始化设置//
{delay1ms(15);
write_cmd(0x38);delay1ms(9);
   write_cmd(0x08);delay1ms(9);
    write_cmd(0x38);delay1ms(9);
   write_cmd(0x38);delay1ms(9);
   write_cmd(0x08);delay1ms(9);
   write_cmd(0x01);delay1ms(9);
     write_cmd(0x06);delay1ms(9);
      write_cmd(0x0c);delay1ms(9);
}



/***************设定显示位置函数************************/

setpos(int posx,int posy)
{
     posx=posx&0xf;                         //将显示在第几位置转为二十六进制,每行总共16个位置
     posy=posy&0x1;                         //设置显示在第几行
     write_data(posx|posy*0x40+0x80);          //设置位置命令最高位必须为一,所以要加0x80
}


/***************显示一个字符子程序**********************/

displaychar(int x,int y,int a)
{   
    delay1ms(10);         //检查忙标志位
     setpos(x,y);          //设置显示位置
     write_data(a);           //将要显示的数据写到液晶
}

/***************显示一串字符串**************************/

displaystring(int x,int y,unsigned int  *string)
{
     int length=0;       //定义一个字符串长度
    delay1ms(10);         
     while(string[length]!='\0')     //字符串是以'\0'结束的,因此只要每结束就显示下一字符
     {
     displaychar(x,y,string[length++]);  //显示一个字符子程序
     x++;                               //液晶显示的位置+1
     }
}

直接通过调用 显示一个字符的程序 LCD还是无法输出,高手看下,我的时序没为题的把,LCD是用5V供电的
jasonjee (2009-6-16 20:03:44)
单独的 LCD初始化 是不是有反应?
对比度调节电阻是不是调整正常了。

无显示是全黑还是全白?
robing4500 (2009-6-17 08:51:18)
我的LCD是 蓝屏的,对比度调节的时候,我把它调成是 有一条比较明亮的条状,   不管是初始化还是如何都是没有任何反应 LCD就是和上电时候的状态是一摸一样啊
trinove (2009-6-17 10:33:35)
“我把它调成是 有一条比较明亮的条状”

不大明白什么意思

初始化没有反应,肯定是初始化没有起作用。
最好换块LCD试试,这个LCD会坏的哦。