fb_bf 发表于 2016-2-6 16:21:59

LCD2004驱动调了一周没调通

LCD2004驱动调了一周没调通,4bit模式,有好心人有调试通过的代码不?

cu_ice 发表于 2016-2-6 16:35:56

跟1602代码一样的,只是多了两行,每行多了4个字,命令都通用,只能帮你到这里了

cocom 发表于 2016-2-6 16:49:48

可用的代码,是51用的:


#pragma db cd sb oe
/* sUTB_mini板LCD20X2显示驱动程序
        数据线为4位
    本设计中,RW线恒为LO,没有驱动
       
*/
/*LCD DISPLAY MODULE */
#include <reg52.h>
#define uchar unsigned char

sbit LCD_RS = P0^1;
sbit LCD_E= P0^0;
#define LCD_BUS P0        //P04..P07

extern void Delay5mS( uchar t );


void LCD_Command(uchar c);
void LCD_Data(uchar c);
void LCD_Init();
void LCD_Clr();
void LCD_XY(uchar x,uchar y);
void LCD_StringXY(uchar x,uchar y,uchar *c);
void LCD_Integer( unsigned int val );
void LCD_IntegerXY(uchar x,uchar y,unsigned int val);
void LCD_sIntegerXY(uchar x,uchar y, int val);
void LCD_Integer_100( unsigned int val );
void LCD_IntegerXY_100(uchar x,uchar y,unsigned int val);
void LCD_IntegerXY_1000(uchar x, uchar y, unsigned int val);
void LCD_sIntegerXY_1000(uchar x, uchar y, int val);
void LCD_sInteger( int val);
//void LCD_IntegerXY_L(uchar x,uchar y,unsigned int val);
//void LCD_LongIntXY(uchar x,uchar y,unsigned long val);
void LCD_LongIntXY_D(uchar x,uchar y,unsigned long val, uchar digbit );
void LCD_byteXY(uchar x,uchar y,uchar val);
//void LCD_BCDXY(uchar x,uchar y,uchar b);


void LCD_Char( uchar c );
void LCD_CharXY( uchar x, uchar y, uchar c );
void LCD_String(uchar *c);
void LCD_CharHex( uchar c );
void LCD_CharHexXY( uchar x , uchar y , uchar c );
void LCD_CharBin( uchar c );
void LCD_CharBinXY( uchar x , uchar y , uchar c );
void LCD_Space( uchar i );
void LCD_SpaceXY( uchar x , uchar y , uchar c );
//void setblink(uchar x,uchar y)
void LCD_BUS_Port( uchar x );
//void LCD_PercentXY( uchar x, uchar y, int per );
//void LCD_Weight2XY( uchar x, uchar y, long w );
void LCD_Bit( bit b );


void Delay25uS( void )
{
unsigned int i;
for( i=0;i<10;i++ );
}



void LCD_Command(uchar c)
{
        LCD_RS = 0;
//        LCD_RW = 0;
        LCD_BUS = LCD_BUS & 0x0f;
        LCD_BUS = LCD_BUS | ( c & 0xf0 ) ;
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;

        LCD_BUS = LCD_BUS & 0x0f;
        LCD_BUS = LCD_BUS | ( ( c * 16 ) & 0xf0 );
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;
           Delay25uS();
}

void LCD_Data(uchar c)
{
        LCD_RS=1;
//        LCD_RW = 0;
        LCD_BUS = LCD_BUS & 0x0f;
        LCD_BUS = LCD_BUS | ( c & 0xf0 ) ;
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;

        LCD_BUS = LCD_BUS & 0x0f;
        LCD_BUS = LCD_BUS | ( ( c * 16 ) & 0xf0 );
        LCD_E = 1;
        LCD_E = 1;
        LCD_E = 0;
           Delay25uS();
}

void LCD_Init()
{
LCD_RS=1;
LCD_E=1;
Delay5mS( 3 );
LCD_Command( 0x28 );
Delay5mS( 2 );
LCD_Command( 0x28 );
Delay5mS( 2 );
LCD_RS=1;
LCD_E=1;
LCD_Command(0x28);
Delay25uS();
LCD_Command(0x28);
Delay25uS();
LCD_Command(0x06);
Delay25uS();
LCD_Command(0x0c);
Delay25uS();
LCD_Command(0x01);
Delay5mS( 2 );
}

void LCD_Clr(void)
{
LCD_Command(0x01);
Delay5mS( 2 );
}

void LCD_XY(uchar y,uchar x)
//LCM 20x4
{
        if( x == 0 )
                LCD_Command( 0x80 + y );
        else if( x == 1 )
                LCD_Command( 0xc0 + y );
        else if( x == 2 )
                LCD_Command( 0x80 + y + 20 );
        else if( x == 3 )
                LCD_Command( 0xc0 + y + 20 );
}
/* LCM 20x2
{
if((x&0x01)==0)
   LCD_Command(0x80|(y));
else
   LCD_Command(0xc0|(y));
}
*/




void LCD_Char( uchar c )
{
        LCD_Data( c );
}

void LCD_CharXY( uchar x, uchar y, uchar c )
{
        LCD_XY( x, y );
        LCD_Char( c );
}


void LCD_String(uchar *c)
{
   uchar d=0;
   while(c!=0)
   {
      LCD_Data(c);
   }
   
}


void LCD_StringXY(uchar x,uchar y,uchar *c)
{
   uchar d=0;
   LCD_XY(x,y);
   while(c!=0)
   {
      LCD_Data(c);
   }
}

fb_bf 发表于 2016-2-6 16:57:53

多谢多谢,我试试

alias 发表于 2016-2-6 17:30:03

LCD 使用第一步:

先接电源正负,看看第一行是否出现黑块,有的话,就可以接上其它的讯号及控制线。如没有黑块,可能是反差未调好或液晶已损坏。

fb_bf 发表于 2016-2-6 18:44:41

恩,液晶是好的

winterw 发表于 2016-2-6 18:50:41

alias 发表于 2016-2-6 17:30
LCD 使用第一步:

先接电源正负,看看第一行是否出现黑块,有的话,就可以接上其它的讯号及控制线。如没有 ...

为什么第1行会出现一行黑块?是lcd模块的硬件特性吗?
我用的lcd1602也是,上电后第1行会出现一行小方块,然后复位一下单片机才开始正常显示。

mkliop 发表于 2016-2-6 19:04:54

肯定是数据端口选择指令只送了一次,事实上要送两次

alias 发表于 2016-2-6 20:02:58

winterw 发表于 2016-2-6 18:50
为什么第1行会出现一行黑块?是lcd模块的硬件特性吗?
我用的lcd1602也是,上电后第1行会出现一行小方块 ...

为什么第1行会出现一行黑块?

可能是lcd模块未初始化的原因吧。对lcd进行初始化后便可正常使用。

K32 发表于 2016-2-12 11:24:48

注意下锁存数据的时机。也就是EN线变化的位置,确保是在数据稳定的时候下降的(我记得是下降沿锁存)。这地方不同液晶模块兼容性也不一样,有的随便变化一下就能锁存,有的对时序要求就比较严格
页: [1]
查看完整版本: LCD2004驱动调了一周没调通