• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

为什么这个LM016L显示屏在仿真时不工作?

GBL阿尔塞斯 2015-10-16 浏览量:3656

屏幕是4位连接的

自己写了几次都不行,后来就改成测试,测试我是直接复制极客工坊大神代码,所以代码肯定没有问题。

实际电路连到ARDUINO后,ARDUINO是可以正常工作的!


但是电路仿真就不能工作,莫名其妙

但是改成8位连接就又可以工作了


找了半天没找到这个4位连接哪里有问题

请各位帮忙看看吧

为什么这个LM016L显示屏在仿真时不工作?




我换成8位接法后,就成功了, 不知道4位接法哪里出了问题!

2个接法我实际做电路板都成功了,应该不是程序的问题。


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你这个问题很简单啊,首先总线是8位的,连接8位肯定是没有问题的,如果是4位连接,就要查看这个LM016L的DATASHEET了,4位总线时连接8位数据位的低4位上,还是高4位上!

    而且,要保证!你写数据和读数据的时候,要读2遍!因为数据是8位,你用4位要读写2次才能组合出8位!不管是仿真还是硬件下载,解决了这个才能工作!


    • 发布于 2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  •     int LCD1602_RS=12;   
        int LCD1602_RW=11;   
        int LCD1602_EN=10;   
        int DB[] = { 6, 7, 8, 9};
        char str1[]="Welcome to";
        char str2[]="geek-workshop";
        char str3[]="this is the";
        char str4[]="4-bit interface";
         
        void LCD_Command_Write(int command)
        {
         int i,temp;
         digitalWrite( LCD1602_RS,LOW);
         digitalWrite( LCD1602_RW,LOW);
         digitalWrite( LCD1602_EN,LOW);
         
         temp=command & 0xf0;
         for (i=DB[0]; i <= 9; i++)
         {
           digitalWrite(i,temp & 0x80);
           temp <<= 1;
         }
         
         digitalWrite( LCD1602_EN,HIGH);
         delayMicroseconds(1);
         digitalWrite( LCD1602_EN,LOW);
         
         temp=(command & 0x0f)<<4;
         for (i=DB[0]; i <= 9; i++)
         {
           digitalWrite(i,temp & 0x80);
           temp <<= 1;
         }
         
         digitalWrite( LCD1602_EN,HIGH);
         delayMicroseconds(1); 
         digitalWrite( LCD1602_EN,LOW);
        }
         
        void LCD_Data_Write(int dat)
        {
         int i=0,temp;
         digitalWrite( LCD1602_RS,HIGH);
         digitalWrite( LCD1602_RW,LOW);
         digitalWrite( LCD1602_EN,LOW);
         
         temp=dat & 0xf0;
         for (i=DB[0]; i <= 9; i++)
         {
           digitalWrite(i,temp & 0x80);
           temp <<= 1;
         }
         
         digitalWrite( LCD1602_EN,HIGH);
         delayMicroseconds(1);
         digitalWrite( LCD1602_EN,LOW);
         
         temp=(dat & 0x0f)<<4;
         for (i=DB[0]; i <= 9; i++)
         {
           digitalWrite(i,temp & 0x80);
           temp <<= 1;
         }
         
         digitalWrite( LCD1602_EN,HIGH);
         delayMicroseconds(1); 
         digitalWrite( LCD1602_EN,LOW);
        }
         
        void LCD_SET_XY( int x, int y )
        {
          int address;
          if (y ==0)    address = 0x80 + x;
          else          address = 0xC0 + x;
          LCD_Command_Write(address); 
        }
         
        void LCD_Write_Char( int x,int y,int dat)
        {
          LCD_SET_XY( x, y ); 
          LCD_Data_Write(dat);
        }
         
        void LCD_Write_String(int X,int Y,char *s)
        {
            LCD_SET_XY( X, Y );    //设置地址 
            while (*s)             //写字符串
            {
              LCD_Data_Write(*s);   
              s ++;
            }
        }
         
        void setup (void) 
        {
          int i = 0;
          for (i=6; i <= 12; i++) 
           {
             pinMode(i,OUTPUT);
           }
          delay(100);
          LCD_Command_Write(0x28);//4线 2行 5x7
          delay(50); 
          LCD_Command_Write(0x06);
          delay(50); 
          LCD_Command_Write(0x0c);
          delay(50); 
          LCD_Command_Write(0x80);
          delay(50); 
          LCD_Command_Write(0x01);
          delay(50); 
         
        }
         
        void loop (void)
        {
           LCD_Command_Write(0x01);
           delay(50);
           LCD_Write_String(3,0,str1);//第1行,第4个地址起
           delay(50);
           LCD_Write_String(1,1,str2);//第2行,第2个地址起
           delay(5000);
           LCD_Command_Write(0x01);
           delay(50);
           LCD_Write_String(0,0,str3);
           delay(50);
           LCD_Write_String(0,1,str4);
           delay(5000);
         
        }

    • 发布于2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • DATASHEET我看了很多次了,4位线也是两边输程序的

    因为我用同样的程序,实际传输到ARDUINO里面后,正常工作

    但是仿真就不工作,所以很奇怪。

    • 发布于2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 这不就很简单啦,仿真不支持4线,其实仿真与真实的差好多呢。。。。
    • 发布于2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以4线的,我试过。你的IO口有没有接反?
    • 发布于2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 正反接都试过几次了,实际电路图能正常工作,仿真我照着实际电路图连不显示


    请问能发发你的看看吗,,我看看哪里有问题

    • 发布于2015-10-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 很久以前搞的,找不着了。实际电路能工作,就说明程序没问题。
    • 发布于2015-10-17
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

为什么这个LM016L显示屏在仿真时不工作?