为啥我的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供电的
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供电的

对比度调节电阻是不是调整正常了。
无显示是全黑还是全白?
不大明白什么意思
初始化没有反应,肯定是初始化没有起作用。
最好换块LCD试试,这个LCD会坏的哦。