Serial.println打印整个字母时应只包含一个字符

时间:2019-02-09 09:28:42

标签: arrays pointers printing arduino arduino-c++

我正在使用Arduino供电的设备。它应该在三重七段显示器(使用多路复用)上显示电容器电荷产生的一个数字。

我可以读取费用,将其映射到数字0-100(百分比)。但是,当我希望它显示在显示器上时,它只显示几秒钟,然后挂在最后一位数字上。

我尝试使用Serial.println输出进行调试。
几秒钟就可以正常工作并显示正确的数字。然后,它开始显示由自由行和类似该字符?缠绕的数字。 当我尝试打印字符时,它会工作几秒钟,然后像这样打印出整个字母!“#$%&'()* +,-。/ 0123456789:; <=>?。

在代码中,我正在将介于0到100之间的数字转换为二进制表示形式,以进行七段显示。 我通过一个指针数组来做到这一点。 指针数组在类的头文件中定义为const。 指针可能有问题吗?

这是带有指针数组代码的类:

class Display {
public:
    Display(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
    Display();
    void Show(uint8_t values[]);
    void Show(uint8_t);
    uint8_t* Decode(uint8_t);

private:
    uint8_t* an;
    uint8_t* ca;
  //                                        252           96        218         242         102         182         190         224         254         246           0
    const uint8_t* codes = new uint8_t[11]{0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110, 0b00000000};
};

class Display { public: Display(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t); Display(); void Show(uint8_t values[]); void Show(uint8_t); uint8_t* Decode(uint8_t); private: uint8_t* an; uint8_t* ca; // 252 96 218 242 102 182 190 224 254 246 0 const uint8_t* codes = new uint8_t[11]{0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110, 0b00000000}; }; 这是我使用的代码。

uint8_t* Display::Decode(uint8_t number) {
    uint8_t* digits = new uint8_t[3]{codes[10], codes[10], codes[10]};
    uint8_t offset = 2;
    if (number == 0) {
        digits[2] = codes[0];
    }
    else
      while (number > 0) {
          Serial.println("a"); //<<<--- this is the only println in the whole program
          digits[offset] = codes[number % 10];
          number /= 10;
          offset--;
      }
    return digits;
}

void Display::Show(uint8_t values[]) {
    for (uint8_t t = 0; t < 10; t++)
        for (uint8_t i = 0; i < 3; i++) { //kolka cast sedemsegmentovky
            for (uint8_t o = 0; o < 3; o++) //kolka anoda na sedemsegmentovke
                digitalWrite(ca[o], LOW);
            for (uint8_t o = 0; o < 8; o++) //rozsvieti jednotlive segmenty
                //digitalWrite(an[o], bitRead(values[i], 7-o));
                digitalWrite(an[o], ((values[i] >> (7-o)) & 0b00000001));
            digitalWrite(ca[i], HIGH);
            delayMicroseconds(1);
        }
}

void Display::Show(uint8_t number) {
    Show(Decode(number));
}
我这样用 uint8_t* Display::Decode(uint8_t number) { uint8_t* digits = new uint8_t[3]{codes[10], codes[10], codes[10]}; uint8_t offset = 2; if (number == 0) { digits[2] = codes[0]; } else while (number > 0) { Serial.println("a"); //<<<--- this is the only println in the whole program digits[offset] = codes[number % 10]; number /= 10; offset--; } return digits; } void Display::Show(uint8_t values[]) { for (uint8_t t = 0; t < 10; t++) for (uint8_t i = 0; i < 3; i++) { //kolka cast sedemsegmentovky for (uint8_t o = 0; o < 3; o++) //kolka anoda na sedemsegmentovke digitalWrite(ca[o], LOW); for (uint8_t o = 0; o < 8; o++) //rozsvieti jednotlive segmenty //digitalWrite(an[o], bitRead(values[i], 7-o)); digitalWrite(an[o], ((values[i] >> (7-o)) & 0b00000001)); digitalWrite(ca[i], HIGH); delayMicroseconds(1); } } void Display::Show(uint8_t number) { Show(Decode(number)); }

这是输出。最后一行不确定地重复。只能有“ a”个字符。

a
一个
一个
一个
一个
一个
一个
一个
 !“ ##%&'()* +,-。/ 0123456789:; <=>?

0 个答案:

没有答案