Вы зря не рассказываете что Вы делаете (какой экран, какая информация выводится..), подсказать было бы намного проще.
Анализировать каждую цифру очень геморно.
Вот отрывок из программы индикатора блока питания. Она вообще не использует шрифты и мерцание отсутствует на любых экранах. Попробуйте ее проанализировать.
Код:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
int X[2][7][6] = { {
{ 21, 22, 22, 20, 18, 18 }, // 40x22 X координаты вершин треугольников цифр
{ 20, 22, 22, 21, 18, 18 }, { 20, 19, 3, 2, 5, 17 },
{ 1, 0, 0, 2, 4, 4 }, { 2, 0, 0, 1, 4, 4 },
{ 2, 3, 19, 20, 17, 5 }, { 5, 17, 19, 17, 5, 3 }},
{{ 11, 12, 12, 11, 10, 10 }, // 22x12
{ 11, 12, 12, 11, 10, 10 }, { 10, 9, 3, 2, 3, 9 },
{ 1, 0, 0, 1, 2, 2 }, { 1, 0, 0, 1, 2, 2 },
{ 2, 3, 9, 10, 9, 3 }, { 2, 3, 9, 10, 9, 3 }} };
int Y[2][7][6] = { {
{ 2, 3, 17, 19, 17, 5 }, // 40x22 Y координаты вершин треугольников цифр
{ 21, 23, 37, 38, 35, 23 }, { 39, 40, 40, 39, 36, 36 },
{ 38, 37, 23, 21, 23, 35 }, { 19, 17, 3, 2, 5, 17 },
{ 1, 0, 0, 1, 4, 4 }, { 18, 18, 20, 22, 22, 20 }},
{{ 2, 3, 9, 10, 9, 3 }, // 22x12
{ 12, 13, 19, 20, 19, 13 }, { 21, 22, 22, 21, 20, 20 },
{ 20, 19, 13, 12, 13, 19 }, { 10, 9, 3, 2, 3, 9 },
{ 1, 0, 0, 1, 2, 2 }, { 11, 10, 10, 11, 12, 12 }} };
// Коды цифр 0..9 и пробел
int seg[11] = { 63, 3, 109, 103, 83, 118, 126, 35, 127, 119, 0 };
Adafruit_ST7735 tft = Adafruit_ST7735(34/*TFT_CS*/, 38/*TFT_DC*/, 39/*TFT_RST*/);
void setup(void) {
tft.initR(INITR_GREENTAB); // Init ST7735S chip, black tab
tft.fillScreen(BLACK);
tft.setTextColor(WHITE, BLACK);
tft.drawLine(0, 142, 128, 142, GREY);
}
void loop() {
if (millis() - timind > 1000) {
izm(); // Измерение
ind(); // Индикация
timind += 1000;
}
//---------- Индикация ----------
static void ind(void) {
PrintV(clc * 10, uo * 10);
PrintA(clc);
PrintP(clc, uo);
PrintC(clc, uo);
uo = clc;
}
//---------- Рисуем цифру ----------
static void digitDraw(int h, int x, int y, int d /*Цифра*/, unsigned int Color) {
for (int s = 0; s < 7; s++) { // Рисуем сегменты из треугольников
int c = Color;
if (!bitRead(seg[d], s)) c = BLACK;
int x0 = x + X[h][s][0]; int y0 = y + Y[h][s][0];
tft.fillTriangle(x0, y0, x + X[h][s][1], y + Y[h][s][1], x + X[h][s][2], y + Y[h][s][2], c);
tft.fillTriangle(x0, y0, x + X[h][s][2], y + Y[h][s][2], x + X[h][s][3], y + Y[h][s][3], c);
tft.fillTriangle(x0, y0, x + X[h][s][3], y + Y[h][s][3], x + X[h][s][4], y + Y[h][s][4], c);
tft.fillTriangle(x0, y0, x + X[h][s][4], y + Y[h][s][4], x + X[h][s][5], y + Y[h][s][5], c);
}
}
//---------- Индикация V ----------
static void PrintV(int u, int uo) {
if (u >= 10000) { // Если больше четырех знаков
u /= 10;
if (uo < 10000) {
digitDraw(0, 45, 9, (u % 1000) / 100, BLACK);
tft.fillCircle(33, 46, 3, 0);
}
digitDraw(0, 30, 9, (u % 1000) / 100, GREEN);
tft.fillCircle(63, 46, 3, GREEN);
}
else {
if (uo >= 10000) {
digitDraw(0, 30, 9, (u % 1000) / 100, BLACK);
tft.fillCircle(63, 46, 3, 0);
}
digitDraw(0, 45, 9, (u % 1000) / 100, GREEN);
tft.fillCircle(33, 46, 3, GREEN);
}
int i = u % 1000;
digitDraw(0, 0, 9, u / 1000, GREEN);
i = u % 100;
digitDraw(0, 75, 9, i / 10, GREEN);
digitDraw(0, 105, 9, i % 10, GREEN);
}
//---------- Индикация A ----------
static void PrintA(unsigned int u) {
digitDraw(0, 0, 63, u / 1000, CYAN);
int i = u % 1000;
digitDraw(0, 45, 63, i / 100, CYAN);
i = u % 100;
digitDraw(0, 75, 63, i / 10, CYAN);
digitDraw(0, 105, 63, i % 10, CYAN);
tft.fillCircle(33, 100, 3, CYAN);
}