Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
06-04-2025, 23:30
(Сообщение последний раз редактировалось: 06-04-2025, 23:33 Sam.)
(06-04-2025, 23:22)KEN : LCD_Output_image(10, 10, 50, 50, pgm_read_byte((int)(img_hi+1)) , 90); Пробовал. С сайта Гайвера копировал и вставлял. Никакого результата.
Вот что получается с этой строкой:
(06-04-2025, 23:22)KEN : или это:
LCD_Output_image(10, 10, 50, 50, pgm_read_byte((int)(img_hi)) , 90); То же самое.
(06-04-2025, 23:22)KEN : про то как передавать массивы Это почитаю.
Сообщений: 898
Своих тем: 8
Рег.: 09-2021
Репутация:
42
(06-04-2025, 23:30)Sam : То же самое. Ошибка была, надо исользовать pgm_read_word или pgm_read_word_near , выше описал.
LCD_Output_image(10, 10, 50, 50, pgm_read_word((int)(img_hi)) , 90);
LCD_Output_image(10, 10, 50, 50, pgm_read_word_near((int)(img_hi)) , 90);
ну может ещё img_hi заменить на img_hi+1
Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
(06-04-2025, 23:46)KEN : near Только это ещё не пробовал. Щас поковыряю.
Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
Было три полосы на фото выше. С near стало четыре. Вот и все изменения.
Сообщений: 898
Своих тем: 8
Рег.: 09-2021
Репутация:
42
Переписывать библиотеку или писать свою функцию - это явное но самое затратное на усилия решение, передавать массив PROGMEM в функцию которая принимает ссылку на массив - просто реализовать но не просто понять как это делать, надо на профильных форумах спрашивать.
(07-04-2025, 00:06)Sam : Было три полосы на фото выше. С near стало четыре. Вот и все изменения. Потому что функция читает данные непонятно откуда, видимо всё таки из ОЗУ а не из Флэш, и возможно по любому надо копировать массив в ОЗУ но тогда никакой экономии памяти, а вот доставать элементы массива по одному помещать их в ОЗУ и отправлять на дисплей - вполне экономия, но тогда по любому надо менять все функции библиотеки.
Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
Я думаю, дело в библиотеках ARDUINO IDE. В то время когда писалась библиотека экрана, библиотеки дуины были другие. та же pgm_space.h...Arduino.h....SPI.h
Я уже сталкивался с устаревшими библиотеками. За 7 лет многое могло измениться.
Единственное что осталось попробовать - установить старую Дуину....1.0.6. например.
Сообщений: 898
Своих тем: 8
Рег.: 09-2021
Репутация:
42
Думаю дело всё таки в том что функция принимает указатель на адрес массива в ОЗУ, а мы ей пытаемся впихнуть адрес из Флэш и функция пытается читать по этому адресу что-то из ОЗУ.
Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
Может и так. Но пока это не мой уровень. Мало знаний, учиться надо.
Сообщений: 898
Своих тем: 8
Рег.: 09-2021
Репутация:
42
Код: void LCD_Output_image_PGM (char x, char y, char width, char height, char *img, int rot)
{
unsigned char m;
switch (rot)
{
case 0:
Send_Image_PGM (x, y, width, height, img, rot);
break;
//================================
case 90:
m=y; y=x; x=m;
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x40); //Начальный адрес осей Х и У - правый верхний угол дисплея
Send_Image_PGM (x, y, width, height, img, rot);
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x00);
break;
//================================
case 180:
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0xC0); //Начальный адрес осей Х и У - правый нижний угол дисплея
Send_Image_PGM (x, y, width, height, img, rot);
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x00);
break;
//================================
case 270:
m=y; y=x; x=m;
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x80); //Начальный адрес осей Х и У - левый нижний угол дисплея
Send_Image_PGM (x, y, width, height, img, rot);
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x00);
break;
//================================
default:
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x00); //Начальный адрес осей Х и У - левый верхний угол дисплея
Send_Image_PGM (x, y, width, height, img, rot);
Send_to_lcd(CMD, 0x36);
Send_to_lcd(DAT, 0x00);
//=================================
};
}
void Send_Image_PGM (char x, char y, char width, char height, char *img, int rot)
{
char x1, y1;
switch (rot)
{
case 0: case 180:
for(y1=y; y1<(y+height); y1++)
{
SetArea( x, x+(width-1), y1, y1 );
for(x1=x; x1<x+width; x1++)
{
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
Send_to_lcd( DAT, pgm_read_byte(img++) ); //Данные - задаём цвет пикселя
#else //(16-ти битовая цветовая палитра (65536 цветов))
Send_to_lcd( DAT, pgm_read_byte(img++) ); Send_to_lcd( DAT, pgm_read_byte(img++) );
#endif
}
}
break;
case 90: case 270:
for(x1=x; x1<x+height; x1++)
{
SetArea( x1, x1, y, y+(width-1) );
for(y1=y; y1<y+width; y1++)
{
#ifdef _8_BIT_COLOR //(8-ми битовая цветовая палитра (256 цветов))
Send_to_lcd( DAT, pgm_read_byte(img++) ); //Данные - задаём цвет пикселя
#else //(16-ти битовая цветовая палитра (65536 цветов))
Send_to_lcd( DAT, pgm_read_byte(img++) ); Send_to_lcd( DAT, pgm_read_byte(img++) );
#endif
}
}
break;
};
}
Эти две функции вставить в скетч с подключённой библиотекой и попробовать первый пример LCD_Output_image_PGM(10,10,50,50,img_hi,90);
Переделка вроде несложная оказалась, но проверить мне неначём, работать будет только с PROGMEM массивами.
Сообщений: 2793
Своих тем: 33
Рег.: 08-2021
Репутация:
54
(07-04-2025, 23:57)KEN : Эти две функции вставить в скетч Так не будет работать. Так будет ругаться, что LCD_Output_image_PGM незадекларировано.
А вот если "КОД" заменить в библиотеке, то может прокатить.
Только чем он отличается от оригинальной функции? Словом PGM?
|