22001|16

116

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

51+LCD1602为什么第二行显示不了??? [复制链接]

51+LCD1602为什么第二行显示不了???[local]1[/local]
希望大家帮忙解决一下这个问题

protues51---LCD1602.rar

219.76 KB, 下载次数: 119

此帖出自51单片机论坛

最新回复

终于解决了!解决办法:①write_com(0x38);//屏幕初始化两次!②修改所有显示屏第二行开始地址为0xC0(之前用0x80+40不行)。  详情 回复 发表于 2024-7-4 12:10
点赞 关注
个人签名lsl
 

回复
举报

336

帖子

0

TA的资源

纯净的硅(初级)

推荐
 
正好也遇到这个问题,初始化 命令(0x38);//设置8位格式,2行,5x7
两次就可以了
此帖出自51单片机论坛
 
个人签名每一刻都是崭新的,加油!
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

推荐
 

恰好我也遇到过这个问题,原因是初始化是0x38要设置两次以上。

因为第一次在设置时,1602的控制芯片无法确定数据是几位的,只好默认是4位的。这是很有道理的。因为如果默认为8位,那四位用户怎么办?他们会很麻烦的。而默认为四位,对于8位用户则没什么了啦,因为在第一次设置0x38时,只有高四位3被识别,1602的控制芯片由此可知你要用8位数据线与他通信,这样第二次设置时高四位和第四位就都可以被接受了。而恰恰第四位中就由单双行设置位,如果只设置一次0x38的话,1602就处于默认的单行显示。

除此之外我还遇到另外一个问题,就是软件好像会改变lcd的特性,就是在相同的对比度电压输入下,不同的程序会有不同的显示效果。有两三次就是本来调好对比度了,改了改程序,就几乎看不清了,弄得我还以为没输出呢,动了动对比度输入电压,显示才又正常了。不知道你有没有遇到这样的问题。

此帖出自51单片机论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

4
 
write_cmd_or_dat(0x80+i-16,c);                //????为什么就是写不了第二行呢????
这里根本就没有把地址定到第二行 怎么能写得到第二行?
此帖出自51单片机论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

5
 
第二行应该再加个0x40
此帖出自51单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(高级)

6
 

回复 沙发 痞子相 的帖子

这行是没有.....可是write_cmd_or_dat(0x80+0x40+i-16,c).....也不行呀???我试过N+1次了....你可以试试....谢谢
此帖出自51单片机论坛
 
个人签名lsl
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

7
 
我的想法是要用个中断去判断他到了16去显示第二行,不知道有没有高手来解释下
此帖出自51单片机论坛
 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

8
 
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define nop()  _nop_()

uchar bdata status;
sbit status_busy=status^7;
sbit status_Reset=status^4;

sbit  GXM1602_HD44780_E=P4^6;
sbit  GXM1602_HD44780_RW=P4^7;
sbit  GXM1602_HD44780_RS=P4^1;

void  GXM1602_HD44780_delay1ms(uint delay_xms);
void  GXM1602_HD44780_delay50us(uchar count50us);
void  GXM1602_HD44780_command(uchar command_data);
void  GXM1602_HD44780_data(uchar w_data);
void  GXM1602_HD44780_read_busy();
void  GXM1602_HD44780_initialize();

uchar  code  GXM1602_HD44780_dis_char[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
                                        };


//* delay  1ms  *//
void GXM1602_HD44780_delay1ms(uint delay_xms)
{
    uint data n,m;
   for(n=0;n   {
    for(m=0;m<75;m++)
   {
     ;
      }
}
}
//***********delay50us************************//
void GXM1602_HD44780_delay50us(uchar count50us)
{
    uchar data k ;
     _nop_();
    for(k=0;k<2*count50us;k++)
    {

      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      }
      }

//*********************************************
//向1602里面输入命令
//*********************************************
void GXM1602_HD44780_command(uchar command_data)
{        //RS=0;
         //RW=0;
         GXM1602_HD44780_E=0;
                 GXM1602_HD44780_RS=0;
         GXM1602_HD44780_RW=0;
         GXM1602_HD44780_E=1;
         P1=command_data;
         GXM1602_HD44780_delay1ms(0x02);
         _nop_();
         GXM1602_HD44780_E=0;
         GXM1602_HD44780_RS=1;
         GXM1602_HD44780_RW=1;
        }

//*********************************************
//向1602里面输入数据
//*********************************************
void GXM1602_HD44780_data(uchar w_data)

{
        GXM1602_HD44780_RS=1;
        GXM1602_HD44780_RW=0;
        GXM1602_HD44780_E=1;
        P1=w_data;
        GXM1602_HD44780_delay50us(0x02);
        _nop_();
        GXM1602_HD44780_E=0;
        GXM1602_HD44780_RS=0;
        GXM1602_HD44780_RW=1;
        }
//**********************************************
//1602读忙状态
//**********************************************
void  GXM1602_HD44780_read_busy()
{  
do
{
        GXM1602_HD44780_RS=0;
        GXM1602_HD44780_RW=1;
        GXM1602_HD44780_E=1;
        status=P1;
        GXM1602_HD44780_delay50us(0x02);
        GXM1602_HD44780_delay50us(0x02);
      }
        while(status_busy);
        _nop_();
        GXM1602_HD44780_E=0;
        GXM1602_HD44780_RS=0;
        GXM1602_HD44780_RW=1;
}

//***********************************************
//1602初始化状态
//***********************************************
void GXM1602_HD44780_initialize()
{
//  uchar data i;
      P1=0;

      GXM1602_HD44780_command(0x38);//N=1  2 line  diaplay    DL=1 8_bit bus mode whih MPU F=0 5*8 dots //
      GXM1602_HD44780_delay50us(0x02);
      GXM1602_HD44780_read_busy();
     

      GXM1602_HD44780_command(0x01);  /* CLR LCD AC=0 AC+1清屏 */
      GXM1602_HD44780_delay1ms(0x02);
      GXM1602_HD44780_read_busy();
      //write_command(0x8f); //

      GXM1602_HD44780_command(0x02);//归home位 set DDRAM Adress  is 00h //
      GXM1602_HD44780_delay1ms(0x02);
      GXM1602_HD44780_read_busy();


      GXM1602_HD44780_command(0x04);// 1 I/D S  I/D=0 cursor/blink moves to left and ddram address is decreased by 1 //
      GXM1602_HD44780_delay50us(0x02);
      GXM1602_HD44780_read_busy();

      GXM1602_HD44780_command(0x0c);//1DCB   D=1 entire display is turned on cursor off //cursor bink off   //
      GXM1602_HD44780_delay50us(0x02);
      GXM1602_HD44780_read_busy();

   //   GXM1602_HD44780_command(0x07);
   //   GXM1602_HD44780_delay50us(0x02);
   //   GXM1602_HD44780_read_busy();
     
      }



main()
   {
//   uchar data i,j;
    GXM1602_HD44780_initialize();


      while(1)
      {

   //   GXM1602_HD44780_command(0x40);   
   //   GXM1602_HD44780_delay50us(0x02);

        GXM1602_HD44780_command(0x80);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2b);
     GXM1602_HD44780_delay50us(0x01);

      GXM1602_HD44780_command(0x81);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x34);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x82);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x83);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2e);
     GXM1602_HD44780_delay50us(0x01);
   
        GXM1602_HD44780_command(0x84);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x33);
     GXM1602_HD44780_delay50us(0x01);




      GXM1602_HD44780_command(0x86);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x31);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x87);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x88);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2e);
     GXM1602_HD44780_delay50us(0x01);

        GXM1602_HD44780_command(0x89);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x32);
     GXM1602_HD44780_delay50us(0x01);

      GXM1602_HD44780_command(0x8a);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x35);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x8b);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x38);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x8d);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x8e);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x34);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0x8f);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         //////////////////////////////////////
                 GXM1602_HD44780_command(0xc0);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2b);
     GXM1602_HD44780_delay50us(0x01);

      GXM1602_HD44780_command(0xc1);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x34);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xc2);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xc3);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2e);
     GXM1602_HD44780_delay50us(0x01);
   
        GXM1602_HD44780_command(0xc4);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x33);
     GXM1602_HD44780_delay50us(0x01);




      GXM1602_HD44780_command(0xc6);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x31);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xc7);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xc8);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x2e);
     GXM1602_HD44780_delay50us(0x01);

        GXM1602_HD44780_command(0xc9);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x32);
     GXM1602_HD44780_delay50us(0x01);

      GXM1602_HD44780_command(0xca);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x35);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xcb);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x38);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xcd);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xce);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x34);
     GXM1602_HD44780_delay50us(0x01);

         GXM1602_HD44780_command(0xcf);
      GXM1602_HD44780_delay50us(0x01);
     GXM1602_HD44780_data(0x30);
     GXM1602_HD44780_delay50us(0x01);
        GXM1602_HD44780_delay1ms(1000);

       }
}
此帖出自51单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

9
 
这个程序是可以显示的,我之前写的一个测试程序,你可以看看。
此帖出自51单片机论坛
 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复

1万

帖子

139

TA的资源

版主

10
 
这类问题,建议楼主不要去求现成,正确、完整的理解LCD的操作手册你自然会知道哪里有问题,去看手册吧,这是电工的基本技能。
此帖出自51单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(高级)

11
 

回复 8楼 chunyang 的帖子

谢谢提醒.....不过我真的很认真的看过LCD的说明了...我上传的程序和原理图都是我自己根据说明写的.....而且我还查过很多资料关于第二行显示的....不过觉得自己写的没错啊??.....
此帖出自51单片机论坛
 
个人签名lsl
 
 

回复

165

帖子

2

TA的资源

纯净的硅(高级)

12
 

1602

1602,完整硬件测试通过,希望对楼主有用

1602.rar

5.56 KB, 下载次数: 171

此帖出自51单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(高级)

13
 
这个问题已经解决...................谢谢各位
此帖出自51单片机论坛
 
个人签名lsl
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

14
 

lCD1602显示不了第二行

程序:
#include   //头文件
#define uint unsigned int //
#define uchar unsigned char

sbit lcden=P2^3; //定义引脚
sbit rs=P2^4;
sbit rw=P2^0;
sbit busy=P0^7;

char i,j,temp,num,num_1;
long a,b,c;     //a,第一个数 b,第二个数 c,得数
float a_c,b_c;
uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号

uchar code table[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0};
uchar code table1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void delay(uchar z) // 延迟函数
{
uchar y;
for(z;z>0;z--)
   for(y=0;y<110;y++);
}

void check() // 判断忙或空闲
{
do{
    P0=0xFF;
    rs=0;     //指令
    rw=1;     //读
    lcden=0;     //禁止读写
    delay(1); //等待,液晶显示器处理数据
    lcden=1;     //允许读写
    }while(busy==1); //判断是否为空闲,1为忙,0为空闲
}
void write_com(uchar com) // 写指令函数
{
P0=com;    //com指令付给P0口
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}

void write_date(uchar date) // 写数据函数
{
    P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}

void init() //初始化
{
    num=-1;
lcden=1; //使能信号为高电平
write_com(0x38); //8位,2行
write_com(0x0c); //显示开,光标关,不闪烁*/
write_com(0x06); //增量方式不移位 显竟獗暌贫 柚?
write_com(0x80); //检测忙信号
write_com(0x01); //显示开,光标关,不闪烁
num_1=0;
i=0;
j=0;
a=0;     //第一个参与运算的数
b=0;     //第二个参与运算的数
c=0;
flag=0; //flag表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号
}
void keyscan() // 键盘扫描程序
{

P3=0xfe;
if(P3!=0xfe)
{
   delay(20); //延迟20ms
   if(P3!=0xfe)
   {
    temp=P3&0xf0;
    switch(temp)
    {
     case 0xe0:num=0;
       break;
     case 0xd0:num=1;
       break;
     case 0xb0:num=2;
       break;
     case 0x70:num=3;
       break;
    }
   }
   while(P3!=0xfe);
   if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
   {
       if(j!=0)
        {
          write_com(0x01);
          j=0;
         }
       if(flag==0)//没有按过符号键
    {
     a=a*10+table[num];
    }
    else//如果按过符号键
    {
     b=b*10+table[num];
    }
   }
   else//如果按下的是'/'
   {
    flag=1;
    fuhao=4;//4表示除号已按
   }
   i=table1[num];
   write_date(0x30+i);
}

P3=0xfd;
if(P3!=0xfd)
{
   delay(5);
   if(P3!=0xfd)
   {
    temp=P3&0xf0;
    switch(temp)
    {
     case 0xe0:num=4;
         break;
      
     case 0xd0:num=5;
         break;
      
     case 0xb0:num=6;
         break;
      
     case 0x70:num=7;
         break;
    }
   }
   while(P3!=0xfd);
   if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
   {
    if(j!=0)
        {
          write_com(0x01);
          j=0;
         }
       if(flag==0)//没有按过符号键
    {
     a=a*10+table[num];
    }
    else//如果按过符号键
    {
     b=b*10+table[num];
    }
   }
   else//如果按下的是'/'
   {
    flag=1;
    fuhao=3;//3表示乘号已按
   }
   i=table1[num];
   write_date(0x30+i);
}

P3=0xfb;
if(P3!=0xfb)
{
   delay(5);
   if(P3!=0xfb)
   {
    temp=P3&0xf0;
    switch(temp)
    {
     case 0xe0:num=8;
         break;
      
     case 0xd0:num=9;
         break;
      
     case 0xb0:num=10;
         break;
      
     case 0x70:num=11;
         break;
    }
   }
   while(P3!=0xfb);
   if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'
   {
    if(j!=0)
        {
          write_com(0x01);
          j=0;
         }
      if(flag==0)//没有按过符号键
    {
     a=a*10+table[num];
    }
    else//如果按过符号键
    {
     b=b*10+table[num];
    }
   }
   else if(num==11)//如果按下的是'-'
   {
    flag=1;
    fuhao=2;//2表示减号已按
   }
   i=table1[num];
   write_date(0x30+i);
}

P3=0xf7;
if(P3!=0xf7)
{
   delay(5);
   if(P3!=0xf7)
   {
    temp=P3&0xf0;
    switch(temp)
    {
     case 0xe0:num=12;
         break;
      
     case 0xd0:num=13;
         break;
      
     case 0xb0:num=14;
         break;
      
     case 0x70:num=15;
         break;
    }
   }
   while(P3!=0xf7);
   switch(num)
   {
    case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
     break;
    case 13:{                //按下的是"0"
       if(flag==0)//没有按过符号键
       {
        a=a*10;
        write_date(0x30);
        P1=0;
       }
       else if(flag==1)//如果按过符号键
       {
        b=b*10;
        write_date(0x30);
        }
      }
     break;
    case 14:{j=1;
           if(fuhao==1){write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处
           write_com(0x04);     //设置从后住前写数据,每写完一个数据,光标后退一格
           c=a+b;
           while(c!=0)
           {
             write_date(0x30+c%10);
             c=c/10;
           }
           write_date(0x3d);     //再写"="
           a=0;b=0;flag=0;fuhao=0;
           }
      else if(fuhao==2){write_com(0x80+0x4f);//光标前进至第二行最后一个显示处
            write_com(0x04);     //设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)
           if(a-b>0)
             c=a-b;
           else
             c=b-a;
           while(c!=0)
           {
             write_date(0x30+c%10);
             c=c/10;
           }
           if(a-b<0)
             write_date(0x2d);
           write_date(0x3d);     //再写"="           
           a=0;b=0;flag=0;fuhao=0;
          }
      else if(fuhao==3){write_com(0x80+0x4f);
            write_com(0x04);
             c=a*b;
             while(c!=0)
             {
             write_date(0x30+c%10);
             c=c/10;
             }
             write_date(0x3d);     
          a=0;b=0;flag=0;fuhao=0;
             }
      else if(fuhao==4){write_com(0x80+0x4f);
            write_com(0x04);
            i=0;
            c=(long)(((float)a/b)*1000);
            while(c!=0)
             {
               write_date(0x30+c%10);
               c=c/10;
           i++;
           if(i==3)
               write_date(0x2e);
             }
            if(a/b<=0)
              write_date(0x30);
            write_date(0x3d);                              
            a=0;b=0;flag=0;fuhao=0;
                    }
      }
     break;
     case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}
     break;
   }
}
}

main()
{
init();
while(1)
{
   keyscan();
}
}
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

15
 
1602很实用~~
此帖出自51单片机论坛
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(中级)

16
 
地址有问题
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
终于解决了!解决办法:①write_com(0x38);//屏幕初始化两次!②修改所有显示屏第二行开始地址为0xC0(之前用0x80+40不行)。
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表