если я правильно понял, сначала я должен строку разделить на отдельные цифры. Потом сравнивать цифры которая была и которая выводится, если цифра отличается, то ее затираем и выводим новую?
Вы зря не рассказываете что Вы делаете (какой экран, какая информация выводится..), подсказать было бы намного проще. Анализировать каждую цифру очень геморно. Вот отрывок из программы индикатора блока питания. Она вообще не использует шрифты и мерцание отсутствует на любых экранах. Попробуйте ее проанализировать.
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); }
Я не понимаю что тебя интересует. Конкретно какой процессор? Какой экран? Какую информацию выводить?(целые числа/вещественные, точность, сколько цифр, через шрифт или через рисование). У меня десятки программ и во всех разные методы вывода. Все зависит от задач. Например нужно выводить измеренное напряжение с АЦП. в диапазоне 0-23в с точностью 2 цифры после запятой на цветной ЖКИ ST7789 MK: LGT8F328, размер прямоугольника вывода: ~70x20 pixel. Еще и от графической библиотеки зависит!
Дисплей ili9341 микроконтроллер atmega328 пока. Делаю БК для авто, пока вывожу напряжение питания, одна цифра после запятой , давление масла 2 цифры после запятой и температура двигателя, одна цифра после запятой. Все это четко работает на стандартном шрифте адафруит, но не очень красиво. Хочется что бы выглядело примерно так , как у тебя в статье и без мерцания в будущем может перейду на другой процессор и добавлю ещё датчиков. У меня тоже есть ST7789, возможно тоже на него перейду.
Так как экран для этого микропроцессора слишком большой (не хватает быстродействия, да и шрифт будет прилично занимать память) без мерцания можно выводить только одним методом: треугольников. По той же причине (дифициту памяти) желательно не использовать вещественные переменные. В аттаче работоспособный (реально проверенный) пример с приемлимыми параметрами.
Вложения:
Комментарий к файлу: Пример вывода 3х параметров ILI9341.ZIP [6.11 KiB]
Скачиваний: 7
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения