我正在使用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:; <=>?