2014-01-23 62 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