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