0

我正在开发一个 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};
};

这是我使用的代码。

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));
}

我像这样使用它

chargeDisplay.Show(chargePercentage);

这是输出。最后一行无限重复。应该只有“a”字符。

a
a
a
a
a
a
a
a
!"#$%&'()*+,-./0123456789:;<=>?

4

0 回答 0