Инверсия текста на LCD5110 с библиотекой LCD5110_Graph.h
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Всем известкая библиотека "LCD5110_Graph.h" имеет функцию инверсии текста. Выглядит она так:
myGLCD.invertText(true); - Функция ВКЛючает инверсию текста
myGLCD.invertText(false); - Функция ВЫКЛючаетинверсию текста
Особенность этой инверсии в том, что любой текст, помещенный после функции myGLCD.invertText(true) + любое количество строк с текстом будут инвертироваться до тех пор пока не будет вставленна функция myGLCD.invertText(false). Это меня крайне не устраивает, так как при создании меню на LCD5110 я полузуюсь этими функциями чтобы обозначить в каком месте на экране мы находимся и какое значение меняем.
В связи с особенностью этой инверсии приходится много раз дублировать одни и те же надписи и строки для понятного отображения на дисплее. Это приводит к транжирству драгоценной памяти в МК.
Вот кусок примера который который демонстрирует как это дело выглядит.
void loop()
{
if (value < 3) {value = 0;}
myGLCD.clrScr(); //Очистка экрана
myGLCD.drawLine(0, 9, 83, 9); //Рисует линию
myGLCD.print("Intervals Set", CENTER, 1); //Выводим внизу на дисплей LCD5110 "Interval"
if (value == 0) {
myGLCD.invertText(true); //Вкл. инвертиртный текст
myGLCD.print("Interval 1 ", LEFT, 11); //Выводим внизу на дисплей LCD5110 "Interval 1"
myGLCD.invertText(false); //Выкл. инвертиртный текст
myGLCD.print("Interval 2 ", LEFT, 20); //Выводим внизу на дисплей LCD5110 "Interval 2"
myGLCD.print("Interval 3 ", LEFT, 30); //Выводим внизу на дисплей LCD5110 "Interval 3"
myGLCD.print("Interval 4 ", LEFT, 40); //Выводим внизу на дисплей LCD5110 "Interval 4"
}
else if (value == 1) {
myGLCD.print("Interval 1 ", LEFT, 11); //Выводим внизу на дисплей LCD5110 "Interval 1"
myGLCD.invertText(true); //Вкл. инвертиртный текст
myGLCD.print("Interval 2 ", LEFT, 20); //Выводим внизу на дисплей LCD5110 "Interval 2"
myGLCD.invertText(false); //Выкл. инвертиртный текст
myGLCD.print("Interval 3 ", LEFT, 30); //Выводим внизу на дисплей LCD5110 "Interval 3"
myGLCD.print("Interval 4 ", LEFT, 40); //Выводим внизу на дисплей LCD5110 "Interval 4"
}
else if (value == 2) {
myGLCD.print("Interval 1 ", LEFT, 11); //Выводим внизу на дисплей LCD5110 "Interval 1"
myGLCD.print("Interval 2 ", LEFT, 20); //Выводим внизу на дисплей LCD5110 "Interval 2"
myGLCD.invertText(true); //Вкл. инвертиртный текст
myGLCD.print("Interval 3 ", LEFT, 30); //Выводим внизу на дисплей LCD5110 "Interval 3"
myGLCD.invertText(false); //Выкл. инвертиртный текст
myGLCD.print("Interval 4 ", LEFT, 40); //Выводим внизу на дисплей LCD5110 "Interval 4"
}
else if (value == 3) {
myGLCD.print("Interval 1 ", LEFT, 11); //Выводим внизу на дисплей LCD5110 "Interval 1"
myGLCD.print("Interval 2 ", LEFT, 20); //Выводим внизу на дисплей LCD5110 "Interval 2"
myGLCD.print("Interval 3 ", LEFT, 30); //Выводим внизу на дисплей LCD5110 "Interval 3"
myGLCD.invertText(true); //Вкл. инвертиртный текст
myGLCD.print("Interval 4 ", LEFT, 40); //Выводим внизу на дисплей LCD5110 "Interval 4"
myGLCD.invertText(false); //Выкл. инвертиртный текст
}
if (value > 3) {value = 0;}
myGLCD.update(); //Выгружаем из буфера в микроконтроллер
}
}
Подскажите идеи как перепахать в библиотеке эту функцию, чтобы это выглядило так:
myGLCD.invertText("Interval 4 ", LEFT, 40);
и после этого я например мог бы писать:
myGLCD.print("Interval 3 ", LEFT, 30);
А вот так выглядит сама функция в библиотеке:
void LCD5110::invertText(bool mode)
{
if (mode==true)
cfont.inverted=1;
else
cfont.inverted=0;
}
что мешает написать функцию с этими тремя операторами? причем не в библиотеке, а прямо в скетче?
myGLCD.invertText(true); myGLCD.print("Interval 1 ", LEFT, 11); myGLCD.invertText(false);Видимо или я не четко обозначил проблему или вы не внимательно прочитали.
Такой конструкцией я и пользуюсь но не в отдельной функции. Но это не удобно даже если вынести это в отдельную функци, не дает универсальности и тратит драгоценную память так как приходится задваивать и затраивать и т.д. текст который лаконично мог бы усаживаться в одной функции. Смотрите пример. Там именно так как вы пишите но без функции. Но строк у меня 4 в этом меню. Из-за такой конструкции мне приходется вызывать аж 4 раза одну и туже функцию с одним и тем же текстом. + текс разный может быть. Это все равно что еще 4 страницы написать на LCD5110
Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval.
А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции.
Я так понимаю требуется "склеить" функцию:
void LCD5110::invertText(bool mode) { if (mode==true) cfont.inverted=1; else cfont.inverted=0; }с одной из... в библиотеке:
void LCD5110::invertText(bool mode) { if (mode==true) cfont.inverted=1; else cfont.inverted=0; } void LCD5110::print(char *st, int x, int y) { unsigned char ch; int stl; stl = strlen(st); if (x == RIGHT) x = 84-(stl*cfont.x_size); if (x == CENTER) x = (84-(stl*cfont.x_size))/2; for (int cnt=0; cnt<stl; cnt++) _print_char(*st++, x + (cnt*(cfont.x_size)), y); } void LCD5110::print(String st, int x, int y) { char buf[st.length()+1]; st.toCharArray(buf, st.length()+1); print(buf, x, y); } void LCD5110::printNumI(long num, int x, int y, int length, char filler) { char buf[25]; char st[27]; boolean neg=false; int c=0, f=0; if (num==0) { if (length!=0) { for (c=0; c<(length-1); c++) st[c]=filler; st[c]=48; st[c+1]=0; } else { st[0]=48; st[1]=0; } } else { if (num<0) { neg=true; num=-num; } while (num>0) { buf[c]=48+(num % 10); c++; num=(num-(num % 10))/10; } buf[c]=0; if (neg) { st[0]=45; } if (length>(c+neg)) { for (int i=0; i<(length-c-neg); i++) { st[i+neg]=filler; f++; } } for (int i=0; i<c; i++) { st[i+neg+f]=buf[c-i-1]; } st[c+neg+f]=0; } print(st,x,y); }Но не понимаю как это сделать
Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval.
А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции.
пока вы не написали фразы, что я выше выделил - я думал, вы понимаете. Теперь вижу. что нет :(
Функцию, ЕСТЕССТВЕННО, надо писать так, чтобы она принимала фразу. направление текста и положение КАК ПАРАМЕТРЫ. Тогда вы сможете ее использовать по всему скетчу, заменив ею бесконечные вызовы этих трех строк.
Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval.
А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции.
пока вы не написали фразы, что я выше выделил - я думал, вы понимаете. Теперь вижу. что нет :(
Функцию, ЕСТЕССТВЕННО, надо писать так, чтобы она принимала фразу. направление текста и положение КАК ПАРАМЕТРЫ. Тогда вы сможете ее использовать по всему скетчу, заменив ею бесконечные вызовы этих трех строк.
Спасибо. я попробую это сделать. А как с объемом памяти? Он уменьшится?
Я правильноВас понял? Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?
не надо ничего склеивать. Пока вы плохо разбираетесь вообще, что такое функция - не лезте в библиотеку.
Придется все-таки дать вам готовый код, хотя это и не в правилах этого форума. Добавьте эту функцию куда-нибудь в скетч, лучше в начало, перед setup()
void InvertedText(char *st, int x, int y) { myGLCD.invertText(true); myGLCD.print(st, x ,y); myGLCD.invertText(false); }Использование: вместо кода
myGLCD.invertText(true); myGLCD.print("Interval 1 ", LEFT, 11); myGLCD.invertText(false);вызываем
InvertedText("Interval 1 ", LEFT, 11);Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?
похоже, вы опять ничего не поняли. Какие "допустимые слова", какие "отдельные функции"???? ОДНА ФУНКЦИЯ из трех строк.
Вппрочем, я уже написал вам готовое.
Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?
похоже, вы опять ничего не поняли. Какие "допустимые слова", какие "отдельные функции"???? ОДНА ФУНКЦИЯ из трех строк.
Вппрочем, я уже написал вам готовое.
Это сообщение я написал до получения готового решения от Вас, уважаемый b707.
Спасибо Вам за терпение и за готовое решение.