库编译,但不会运行

Library compiles, but won't run

本文关键字:运行 编译      更新时间:2023-10-16

我编写了一些代码,使用Arduino Uno板驱动外部7段显示。当在Arduino IDE作为.ino文件中运行时,它可以完美地工作。然后,我决定想将其变成库以备将来使用。我创建了.h和.cpp文件,但是当我尝试使用以前起作用的.ino的相同功能时,它们现在无法正常工作。这是我的代码:

.ino

#include <Segment.h>
Segment seg;
void setup() {
}
void loop() {
  seg.display(1);
}

.h

#ifndef Segment_h
#define Segment_h
#include "Arduino.h"
class Segment
{
  public:
    Segment();
    void display(int i);
  private:
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    int dot;
};
#endif

.cpp

#include "Segment.h"
  const int a=6;
  const int b=7;
  const int c=8;
  const int d=10;
  const int e=11;
  const int f=13;
  const int g=12;
  const int dot=9;
Segment::Segment()
{
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dot, OUTPUT);
}
void Segment::display(int i)
{
  if (i==0){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);   
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    digitalWrite(dot, HIGH);
  }  
  else if (i==1){
    digitalWrite(a, HIGH);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(dot, HIGH);
  }
  else if (i==2){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);   
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
  }
  else if (i==3){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, HIGH);   
    digitalWrite(f, HIGH);
    digitalWrite(g,LOW);
    digitalWrite(dot, HIGH);
}
  else if (i==4){
    digitalWrite(a, HIGH);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
  } 
  else if (i==5){
    digitalWrite(a, LOW);   
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, HIGH);   
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
  }
  else if (i==6){
    digitalWrite(a, LOW);   
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);   
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
  }
  else if (i==7){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(dot, HIGH);
  }
  else if (i==8){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);   
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
  }
  else if (i==9){
    digitalWrite(a, LOW);   
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(dot, HIGH);
    }
  else if (i==10){
    digitalWrite(a, HIGH);   
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(dot, LOW);
  }
  else if (i==11){
    digitalWrite(a, HIGH);   
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);   
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(dot, HIGH);
  }
}

编译器没有任何错误,但是SSD只是空白。我在名为int test()的.CPP文件中运行了一个测试功能,该文件刚刚返回了一个任意号码,并且效果很好。这使我认为其中包括的运作方式是应有的,并且所有三个文件都在交流。我认为由于某种原因,由于某种原因,它没有识别#include "Arduino.h",这杀死了我的digitalWrite()pinMode功能。有人可以为我提供一些启示吗?谢谢。

正如布莱恩(Brian)在评论中指出的那样,您有变量a,b,c,d,e,f,g,g,g和dot在您的细分市场中定义为私人成员,然后重新定义它们作为全球常数。当在段成员函数中调用PinMode()和DigitalWrite()时,功能使用尚未初始化的类成员变量,而不是您已经初始化的全局变量。

在您的段构造函数中,在调用pinmode()之前,初始化成员变量。