糯米基 发表于 2013-6-6 20:57:33

液晶屏1602在官方例子的一个错误探讨

本帖最后由 糯米基 于 2013-6-6 21:01 编辑

最近我想系统学学1602的操作,于是按着Arduino 1.02里的LiquidCrystal下的例子一个一个看下来,里面有一个自定义字符的例子,代码如下/*
LiquidCrystal Library - Custom Characters

Demonstrates how to add custom characters on an LCDdisplay.
The LiquidCrystal library works with all LCD displays that are
compatible with theHitachi HD44780 driver. There are many of
them out there, and you can usually tell them by the 16-pin interface.

This sketch prints "I <heart> Arduino!" and a little dancing man
to the LCD.

The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K potentiometer:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
* 10K poterntiometer on pin A0

created21 Mar 2011
by Tom Igoe
Based on Adafruit's example at
https://github.com/adafruit/SPI_VFD/blob/master/examples/createChar/createChar.pde

This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal

Also useful:
http://icontexto.com/charactercreator/

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// make some custom characters:
byte heart = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};

byte smiley = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};

byte frownie = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b00000,
0b01110,
0b10001
};

byte armsDown = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};

byte armsUp = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
void setup() {
// create a new character
lcd.createChar(0, heart);
// create a new character
lcd.createChar(1, smiley);
// create a new character
lcd.createChar(2, frownie);
// create a new character
lcd.createChar(3, armsDown);
// create a new character
lcd.createChar(4, armsUp);

// set up the lcd's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the lcd.
lcd.print("I ");
lcd.write(1);
lcd.print(" Arduino! ");
lcd.write(1);

}

void loop() {
// read the potentiometer on A0:
int sensorReading = analogRead(A0);
// map the result to 200 - 1000:
int delayTime = map(sensorReading, 0, 1023, 200, 1000);
// set the cursor to the bottom row, 5th position:
lcd.setCursor(4, 1);
// draw the little man, arms down:
lcd.write(3);
delay(delayTime);
lcd.setCursor(4, 1);
// draw him arms up:
lcd.write(4);
delay(delayTime);
}

其中我直接编译后提示错误
一路看下来,这里应该是想写一个爱心,总共就是I 心 Arduino!r然后第二排一个动画小人。出现那个错误后,我把lcd.write(0)改为lcdwrite(1),这里的0和1是自定义的图案代码,0是爱心,1是笑脸,改后的图案如下

希望大家帮我解释一下,那个错误的原因

糯米基 发表于 2013-6-6 20:59:40

是用电脑摄像头拍的图,有点模糊,不过问题还是说的清楚的,先谢谢了

伯德 发表于 2013-6-7 13:06:31

int heartPos = 0;
// set up the lcd's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the lcd.
lcd.print("I ");
//lcd.write(0);
lcd.write(heartPos);
lcd.print(" Arduino! ");
lcd.write(1);加一个变量=0 可以编过。 应该还是和unit8_t的定义有关。

伯德 发表于 2013-6-7 15:38:49

本帖最后由 伯德 于 2013-6-7 16:55 编辑

在群里和大家讨论了一下。
可以确定这是一个Bug。
最愛猜問題(1251488074)提供了两个方法;
1) lcd.write(0.0); 或者
2)修改LiquidCrystal.h 行85,注释掉 using Print::write;;或者
3)lcd.write((uint_8)0); 或 lcd.write((unsigned char)0); 或lcd.write((byte)0);
据说官方已经更新了,不过我的1.04版也有这个问题,1.05版没试过。
如果没有改LZ可以试着给官方写封email反馈一下。

来看报错信息:CustomCharacter:117: error: call of overloaded 'write(int)' is ambiguous
E:\arduino-1.0.4-windows\arduino-1.0.4\libraries\LiquidCrystal/LiquidCrystal.h:82: note: candidates are: virtual size_t LiquidCrystal::write(uint8_t)
E:\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/Print.h:49: note:               size_t Print::write(const char*)error: call of overloaded 'write(int)' is ambiguous
翻译:write的重载是不明确的。//明显是由于参数判断不清楚导致的错误。
后面的意思是问题在LiquidCrystal::write(uint8_t)和size_t Print::write(const char*)两个方法之间。

具体原因涉及到一些C++的知识,如果有兴趣,可以继续交流。

数字 发表于 2013-6-8 12:25:28

哈哈,这个问题搞得我从来都是从1开始写的。
页: [1]
查看完整版本: 液晶屏1602在官方例子的一个错误探讨