2014-01-23 85 views
0

我写了一些代码来驱动外部7段显示使用Arduino Uno板。当在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功能。任何人都可以为我阐明这一点吗?谢谢。

+0

作为Segment和全局常量的成员变量,您都有一个通用g。由于所有对这些参数的引用都在类成员函数中,所以C++将使用未初始化的成员变量。 –

回答

1

正如Brian在他的评论中指出的那样,您将变量a,b,c,d,e,f,g和dot定义在您的Segment类中作为私有成员,并将其重新定义为全局常量。在Segments成员函数中调用pinMode()和digitalWrite()时,函数使用尚未初始化的类成员变量,而不是您已初始化的全局变量。

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

+0

所以我将'const'定义移到了'Segment()'内部,但是现在所有7个节点加上了点亮,这意味着变量仍然不能正常工作。 – user3226170

+0

您不应该在构造函数中移动const定义,您应该删除它们并初始化成员变量。如果你需要这些成员是const,只需使用成员初始值设定项列表。也许尝试在设置每个引脚模式后明确关闭这些段。 – cioffstix

+0

太棒了。这工作完美。我在'Segment()'构造函数中使用了一个初始化列表。有人会解释这是怎么来的吗?再次感谢。 – user3226170