LCD1602 I2C问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 40951|回复: 42

[已解决] LCD1602 I2C问题

[复制链接]
发表于 2015-1-15 16:05 | 显示全部楼层 |阅读模式
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd

  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}

void loop()
{
}
这是程序,但1602不亮,1602与arduino连接后第一行全是黑框,怎么回事

 楼主| 发表于 2015-1-15 18:32 | 显示全部楼层
本帖最后由 毒师老白 于 2015-1-15 18:36 编辑
tsaiwn 发表于 2015-1-15 18:12
你確定你的 I2C address 是 0x20 嗎?
大部分賣的 LCD1602 是用 0x27
你先把 LiquidCrystal_I2C lcd(0x20,16 ...

一般情况下,默认用库就可以了
但也有不显示的情况,例如只有一行显示黑框~~果断就是i2C地址错了,不是默认的0x27
我用下面的程序得到是0x20,管脚我连接也是正确地,附图
ARDUINO 代码复制打印

  • #include <Wire.h>
  • void setup()
  • {
  • Wire.begin();
  • Serial.begin(9600);
  • Serial.println("\nI2C Scanner");
  • }
  • void loop()
  • {
  • byte error, address;
  • int nDevices;
  • Serial.println("Scanning...");
  • nDevices = 0;
  • for(address = 1; address < 127; address++ )
  • {
  • // The i2c_scanner uses the return value of
  • // the Write.endTransmisstion to see if
  • // a device did acknowledge to the address.
  • Wire.beginTransmission(address);
  • error = Wire.endTransmission();
  • if (error == 0)
  • {
  • Serial.print("I2C device found at address 0x");
  • if (address<16)
  • Serial.print("0");
  • Serial.print(address,HEX);
  • Serial.println(" !");
  • nDevices++;
  • }
  • else if (error==4)
  • {
  • Serial.print("Unknow error at address 0x");
  • if (address<16)
  • Serial.print("0");
  • Serial.println(address,HEX);
  • }
  • }
  • if (nDevices == 0)
  • Serial.println("No I2C devices found\n");
  • else
  • Serial.println("done\n");
  • delay(5000); // wait 5 seconds for next scan
  • }
l
QQ图片20150115183055.jpg
QQ图片20150115183101.jpg
发表于 2015-1-15 18:12 | 显示全部楼层
你確定你的 I2C address 是 0x20 嗎?
大部分賣的 LCD1602 是用 0x27
你先把 LiquidCrystal_I2C lcd(0x20,16,2);
改為以下看看:
  LiquidCrystal_I2C lcd(0x27,16,2);
還有, 要連接在 pin A4 (SDA) 與 A5 (SCL)
不是 數位腳(數字腳)的 pin 4 與 pin 5
 楼主| 发表于 2015-1-15 19:12 | 显示全部楼层
tsaiwn 发表于 2015-1-15 18:12
你確定你的 I2C address 是 0x20 嗎?
大部分賣的 LCD1602 是用 0x27
你先把 LiquidCrystal_I2C lcd(0x20,16 ...

解决啦
哈哈,只有您在回我的帖子,解答我的问题,您真是个好心人,祝您生活开心!
/*
EB - I2C_1602_LCD demo code
  
This sketch prints "Hello World!" to the LCD
and shows the time.

  The circuit:
* 5V to Arduino 5V pin
* GND to Arduino GND pin
* CLK to Analog #5
* DAT to Analog #4

  http://makerstudio.cc
*/

// include the library code:
#include <Wire.h>
#include "IICLiquidCrystal.h"

// Connect via i2c, default address #0 (A0-A2 not jumpered)
LiquidCrystal lcd(0);

void setup() {
  // set up the LCD's number of rows and columns:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);

  lcd.setBacklight(HIGH);
  delay(500);
  lcd.setBacklight(LOW);
  delay(500);
}
用这个程序就可以了,原因是我的1602造成的,那个库不匹配
发表于 2015-1-15 19:29 | 显示全部楼层
毒师老白 发表于 2015-1-15 19:12
解决啦
哈哈,只有您在回我的帖子,解答我的问题,您真是个好心人,祝您生活开心!
/*

Good !
Happy learning !
 楼主| 发表于 2015-1-15 23:07 | 显示全部楼层
tsaiwn 发表于 2015-1-15 19:29
Good !
Happy learning !

我将我昨天的程序与今天的1602的结合,编译出错,第一次遇到这样的出错提示,您知道为什么么
#include <Servo.h>
#include <Wire.h>
#include "IICLiquidCrystal.h"
LiquidCrystal lcd(0);
Servo myservo1;
Servo myservo2;
int pos1 = 90;
int pos2 = 90;
String comdata = "";
int rssi=0,lastrssi=0;
int mark = 0,flag=0;
void setup()
{
  lcd.begin(16, 2);
  Serial.begin(9600);
  comdata.reserve(200);
  myservo1.attach(10);
  myservo2.attach(11);
  myservo1.write(pos1);
  myservo2.write(pos2);
}

void loop()
{
  while (Serial.available() > 0)
  {
    comdata += char(Serial.read());
    delay(2);
    mark = 1;
  }
  if(mark == 1)
  {
    lastrssi=rssi;
    int sIndex = comdata.indexOf("signal=-");
    if(sIndex==-1)
    {
      return;
    }
    String charRssi=comdata.substring(sIndex+8,sIndex+10);
    rssi=charRssi.toInt();
    Serial.println(rssi);
    Serial.println(lastrssi);
    comdata = String("");
    Serial.flush( );
    mark = 0;
    flag=1;
    lcd.setCursor(0,0);
    lcd.print(rssi);
    lcd.setCursor(0,1);
    lcd.print(lastrssi);
  }
  if(flag==1&&lastrssi!=0)
  {
    if(rssi>lastrssi)myservo1.write(pos1=pos1-20);
    if(rssi<lastrssi)myservo1.write(pos1=pos1+20);
    Serial.println(pos1);
    flag=0;
  }
}






4)00728V%2}~JD`7)2GNL_5.jpg
 楼主| 发表于 2015-1-15 23:45 | 显示全部楼层
tsaiwn 发表于 2015-1-15 19:29
Good !
Happy learning !

ArduinoCodeForElectronicBricksAdvancedKit\VirtualWire.cpp.o: In function `__vector_11':
D:\Arduino\arduino-1.0.6\libraries\ArduinoCodeForElectronicBricksAdvancedKit/VirtualWire.cpp:413: multiple definition of `__vector_11'
Servo\Servo.cpp.o:\Arduino\arduino-1.0.6\libraries\Servo/Servo.cpp:103: first defined here
上面是编译出错的代码
我感觉是两个头文件中重复定义了,产生了冲突
但我不知道该怎么解决
发表于 2015-1-16 00:10 | 显示全部楼层
毒师老白 发表于 2015-1-15 23:45
ArduinoCodeForElectronicBricksAdvancedKit\VirtualWire.cpp.o: In function `__vector_11':
D:\Arduino ...

是IICLiquidCrystal.h 內的與 Servo 庫沖突了
你的 1602 LCD 的 library 庫是不是又自己抓來的?
如果使用 Arduino 內建的應該不會沖突,
你先把那句 #include "IICLiquidCrystal.h"
改為 #include  <IICLiquidCrystal.h>
然後測試看看
就是 " ... "  改為 < ... >
 楼主| 发表于 2015-1-16 08:44 | 显示全部楼层
tsaiwn 发表于 2015-1-16 00:10
是IICLiquidCrystal.h 內的與 Servo 庫沖突了
你的 1602 LCD 的 library 庫是不是又自己抓來的?
如果使用 ...

您说的方法我也想到了,试了不行
我的Servo库是IDE1.06自带的
#include "IICLiquidCrystal.h"库是我向1602卖家要的
应该是冲突了,我正在找方法解决

发表于 2015-1-16 10:32 | 显示全部楼层
毒师老白 发表于 2015-1-16 08:44
您说的方法我也想到了,试了不行
我的Servo库是IDE1.06自带的
#include "IICLiquidCrystal.h"库是我向160 ...

我意思是不要用1602賣家的 LCD 庫
用IDE1.06自帶的 LCD 庫
所以應該是要改為
#include <LiquidCrystal.h>
其他不要改先試看看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:59 , Processed in 0.238793 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表