Помогите с GLCD 240x128 отображать переменные

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Всем здравствуйте. Проблема такая: имеется GLCD 240х128 BG240128B2YP2 на процессоре SAP1024B он же t6963c и есть большое
желание подружить его с apduino nano. Библиотеки которые находил в интернете или вообще не работают или работают только с
мегой, решено было написать свою библиотеку, (пока только как функции, потом буду разбираться как сделать полноценную свою библиотеку)
все получается кроме отображения переменных, точнее и переменные отображаются только через "быдло код", сначала перевожу переменную в
строку потом копирую ее в функцию там создаю массив чар который отображается, получается три копии данных.
Вот что имею:

float a=13.2787;
int a1=-45;
LCD_GOTO_XY(1, 1);
LCD_PRINT_STRING("Float=");

LCD_PRINT(String(a,2)); // если переменная ФЛОАТ второй аргумент КОЛИЧЕСТВО ЗНАКОВ после запятой
LCD_PRINT_STRING(" ...OK ");

LCD_GOTO_XY(1, 3);
LCD_PRINT_STRING("Int=");
LCD_PRINT(String(a1)); // если переменная целочисленная второй аргумент СИСТЕМА ИСЧИСЛЕНИЯ.
LCD_PRINT_STRING(" ...OK ");

и сами функции:

//************************************************************************
void LCD_PRINT_STRING ( const char *string) { // Функция печати массива символов
int i;
int c;
for (i = 0; string != 0; i++) {
c = string- 0x20; // convert ASCII to LCD char address
if (c < 0) c = 0;
LCD_DATA_PUT(c);
LCD_COMMAND_PUT(B11000000); // write character, increment memory ptr.
}
}
//************************************************************************
void LCD_PRINT ( String value){ // ПЕЧАТАЕМ ПЕРЕМЕННУЮ

byte i=value.length()+1; // узнаем длину строки (+1 для конца)
char charBufVar={0}; // создаем массив для элементов строки
value.toCharArray(charBufVar, i); // преобразуем строку в массив
LCD_PRINT_STRING (charBufVar); // печатаем массив символов.
}
//************************************************************************

Подскажите как избавиться от String в строке LCD_PRINT(String(a1)); чтобы работало как Serial.print() только без serial.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Надо написать несколько функций с одинаковыми названиями , но разными аргументами, для примера

int kvadrat(int a){return a*a} - будет работать с аргументом типа int
float kvadrat(float a){return a*a} - для работы с float
 
  • Лойс +1
Реакции: Marik

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Я "открыл Америку" функции могут иметь ОДИНАКОВОЕ название. Значит могут принимать разное количество аргументов! А я то думаю как Serial.print(); отдает то один аргумент то два пример: Serial.print(78) передается как "78" , Serial.println(1.23456, 2) выводит "1.23" . Вон оно че Похабыч.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Осталось за малым: "запихать" float в массив charов.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Да ну их эти Stringи, много жрут памяти, я найду как это сделать напрямую в char massiv[ ] в интернете вроде полно есть примеров, если там подводных камней не будет.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Думал через sprintf, но похоже в ардуине чето не работает, сейчас еще подумаю как через буфер если не получится остановлюсь на Вашем примере.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Ну теоретически можно написать кастомную функцию. Например так
есть число 1234.567
Нам надо поместить ее в массив с точностью 2 знака после запятой.
делаем round(1234.567*100.0) , получаем 123457
а потом в цикле получаем последнюю цифру
123457 % 10 = 7
7 в массив в виде символа, это будет char(7+48));
число 123457/10 получаем 12345
идем в начало цикла

ну и еще нужно условие, когда записали 2 цифры (мы брали это колво знаков после запятой) вставить в массив разделитель
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
На сегодня я уже все (завтра на работу) по Вашему примеру вот что получилось:

void LCD_PRINT ( float value, const byte m){ // ПЕЧАТАЕМ ПЕРЕМЕННУЮ float m-количество знаков после запятой.
char charBufVar[9]={0}; // создаем массив для элементов строки [9] макс. знаков с точкой
String(value, m).toCharArray(charBufVar,sizeof(charBufVar)); // преобразуем в массив.
//sprintf(charBufVar, "%f", value);
LCD_PRINT_STRING (charBufVar); // печатаем массив символов.
}
//************************************************************************
void LCD_PRINT ( int *value){ // ПЕЧАТАЕМ ПЕРЕМЕННУЮ int
char charBufVar[3]={0}; // создаем массив для элементов строки. [3] -?? печатает и больше?
itoa(value, charBufVar, 10); // преобразуем в массив.
LCD_PRINT_STRING (charBufVar); // печатаем массив символов.
}
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
Поддержка форматирования вещественных чисел много памяти занимает, поэтому её убрали из printf. Можешь воспользоваться упрощенной функцией dtostrf
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Все таки вот так получилось лучше ( меньше места занимает)

void LCD_PRINT ( float value, const byte m){ // ПЕЧАТАЕМ ПЕРЕМЕННУЮ float m-количество знаков после запятой.
char charBufVar[9]={0}; // создаем массив для элементов строки [8] макс. знаков с точкой
dtostrf (value, 8, m, charBufVar); // преобразуем в массив.
LCD_PRINT_STRING (charBufVar); // печатаем массив символов.
}

Теперь точно все, спать.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
char charBufVar[3]={0}; // создаем массив для элементов строки. [3] -?? печатает и больше?

вот здесь еще непонятки, массив из четырех элементов последний окончание массива равен 0, но работает и когда int a1=20000; и при а1=-20000, кому а главное зачем я указываю размерность этого массива?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
char charBufVar[3]={0}; // создаем массив для элементов строки. [3] -?? печатает и больше?

вот здесь еще непонятки, массив из четырех элементов последний окончание массива равен 0, но работает и когда int a1=20000; и при а1=-20000, кому а главное зачем я указываю размерность этого массива?
Ты портишь память за массивом charBufVar. Что в этой памяти, и как эта порча скажется на работе скетча -- непредсказуемо.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Понял что лучше поставить [6] так как int от -32768 это 6- элементов +1 окончание массива и не переживать за непредсказуемость.
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Я что то не правильно понял? поправите меня если я не прав, если я поставлю [6] то это как раз будет 7 элементов в массиве charBufVar[0]...это первый элемент charBufVar[6] это седьмой { 0, 1, 2, 3, 4, 5, 6}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Я что то не правильно понял? поправите меня если я не прав, если я поставлю [6] то это как раз будет 7 элементов в массиве charBufVar[0]...это первый элемент charBufVar[6] это седьмой { 0, 1, 2, 3, 4, 5, 6}
Объявляется не максимальный индекс , а именно размер. при 6 индексы будут от 0 до 5
 

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
можете прислать библиотеку, если у вас получилось запустить с ней дисплей?
Да у меня все получилось, тока у меня не библиотека а просто скетч (пока не умею делать библиотеки), скетч не маленький, куда прислать?, так же есть файл эмуляции в протеусе 8.
 

DmitriyMedved

✩✩✩✩✩✩✩
5 Дек 2019
3
0
@Marik, [email protected]

и если можно, то еще хотелось бы файл в протеусе, а то у меня с библиотекой u8glib не запускается
PS подскажите дисплею вообще нужна инициализация, и выводы rd wr у вас реверсивные на дисплее или прямые?
 
Изменено:

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
да дисплею нужна инициализация, по поводу RD и WR не понял вопроса. ща скину на почту думаю разберетесь

PS сильно ногами не пинать, я только начинающий ардуинщик, скетч писал сам подсматривал как для PIC контроллеров сделано.

Уже отправил если будут вопросы пишите попробую ответить.