0

我有一个 128x64 的 OLED SPI 显示器,我使用 Adafruit_GFX 和 Adafruit_SSD1306 来控制它。我有一个类名 Engine ,它有一个像这样的公共构造函数:

Engine::Engine() {
    display.begin(2U, 0U, true, false);

  // Define some pinmode not a problem
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
    pinMode(buzzerPin, OUTPUT);

  //clear the screen and display
    clearScreen();
    display.display();
    time = 0;
}

然后在我的 .ino 文件中,我有这样的东西:

Engine engine = Engine();

void setup() {
    Serial.begin(115200);
    Serial.println("testing...");
}

问题是程序有点冻结。我不知道代码是否有效(我认为不是)。我尝试对其进行调试,如果我在设置中声明了引擎,那就没问题了。或者,如果我删除该行display.begin()并将声明保留在设置之外。为什么?我需要在display.begin()里面打电话吗setup()?如何摆脱这个?

PS:我为此使用了视觉微。但之后我将代码移至 Arduino,问题仍然出现。

4

1 回答 1

3

您需要将该构造函数拆分为两部分。现在,您的构造函数正在使用诸如调用 pinMode 之类的硬件进行操作。但是,如果您在调用 setup 之前在全局范围内调用它,那么它将在 main 调用 init() 并设置硬件之前被调用。基本上,您在电路板准备好设置 pinMode 之前调用 pinMode。您需要做的是将所有硬件内容分离到类中的 begin() 或 init() 方法中,您可以调用表单设置。构造函数应该做的就是初始化任何需要它的变量并构造对象。您应该拥有 engine.begin() ,一旦硬件准备好运行,您就可以从 setup 调用它来执行所有 pinMode 和硬件工作。查看您的 lcd 代码如何使用 begin 方法。

于 2020-05-07T13:38:07.673 回答