问题描述
我使用以下代码将LCD显示器连接到Arduino Mega 2560:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C myLCD(0x27,20,4);
void setup() {
myLCD.begin();
myLCD.backlight();
}
void loop() {
myLCD.clear();
myLCD.print("Hello");
delay(2000);
}
这很好,并且显示屏显示“ Hello”。但是由于我需要用于显示的某些自定义函数,因此我想将它们全部移到我创建的单独的“ ldc”类中:
ldc.h
#ifndef Lcd_h
#define Lcd_h
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
class Lcd {
private:
unsigned int lcd_address = 0;
unsigned int rows = 0;
unsigned int columns = 0;
LiquidCrystal_I2C myLCD;
public:
// Construtor
Lcd();
void begin(unsigned int _columns,unsigned int _rows,unsigned int _lcd_address = 0x27);
void write();
};
#endif
lcd.cpp
#include "Lcd.h"
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
// Construtor
Lcd::Lcd() : myLCD(lcd_address,columns,rows) {
}
void Lcd::begin(unsigned int _columns,unsigned int _lcd_address = 0x27) {
lcd_address = _lcd_address;
columns = _columns;
rows = _rows;
LiquidCrystal_I2C myLCD(lcd_address,rows);
myLCD.begin();
myLCD.backlight();
}
void Lcd::write() {
myLCD.clear();
myLCD.print("hello");
Serial.println("I am here");
}
主文件
#include <LiquidCrystal_I2C.h>
#include "lcd.h"
Lcd thisLCD;
void setup() {
Serial.begin(9600);
thisLCD.begin(20,4,0x27);
}
void loop() {
thisLCD.write();
delay(2000);
}
代码编译没有错误。我也确实在串行监视器上收到“我在这里”,因此调用了write()函数。但是显示屏没有显示任何内容。
我怀疑我在构造函数上做错了事:
Lcd::Lcd() : myLCD(lcd_address,rows) {...
如果我将构造函数更改为
Lcd::Lcd() : myLCD() {...
我收到编译错误:
lcd.cpp: In constructor 'Lcd::Lcd()':
lcd.cpp:9:20: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C()'
Lcd::Lcd() : myLCD() {
^
我在做什么错?构造函数上有错误吗?还是其他?
解决方法
在begin()方法中,您定义了一个与类字段同名的局部变量
LiquidCrystal_I2C myLCD(lcd_address,columns,rows);
在begin()方法的末尾,此对象被销毁。 write()方法中的myLCD对象与begin()中的本地对象myLCD没有关系
在构造函数Lcd()中,您可以添加一些参数以传递地址,列和行。
由于LiquidCrystal_I2C没有创建后更新这些字段的方法,这似乎是唯一的方法。
所以
// Construtor
Lcd::Lcd(int addr,int ncols,int nrows) : myLCD(addr,ncols,nrows) {
//...
}