Подключение LCD TFT к ARDUINO UNO
#41
(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 : про то как передавать массивы
Это почитаю. 7
#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
#43
(06-04-2025, 23:46)KEN : near
Только это ещё не пробовал. Щас поковыряю.
#44
Было три полосы на фото выше. С near стало четыре. Вот и все изменения.
#45
Переписывать библиотеку или писать свою функцию - это явное но самое затратное на усилия решение, передавать массив PROGMEM в функцию которая принимает ссылку на массив - просто реализовать но не просто понять как это делать, надо на профильных форумах спрашивать.

(07-04-2025, 00:06)Sam : Было три полосы на фото выше. С near стало четыре. Вот и все изменения.
Потому что функция читает данные непонятно откуда, видимо всё таки из ОЗУ а не из Флэш, и возможно по любому надо копировать массив в ОЗУ но тогда никакой экономии памяти, а вот доставать элементы массива по одному помещать их в ОЗУ и отправлять на дисплей - вполне экономия, но тогда по любому надо менять все функции библиотеки.
#46
Я думаю, дело в библиотеках ARDUINO IDE. В то время когда писалась библиотека экрана, библиотеки дуины были другие. та же pgm_space.h...Arduino.h....SPI.h
Я уже сталкивался с устаревшими библиотеками. За 7 лет многое могло измениться.
Единственное что осталось попробовать - установить старую Дуину....1.0.6. например.
#47
Думаю дело всё таки в том что функция принимает указатель на адрес массива в ОЗУ, а мы ей пытаемся впихнуть адрес из Флэш и функция пытается читать по этому адресу что-то из ОЗУ.
#48
Может и так. Но пока это не мой уровень. Мало знаний, учиться надо.
#49
Код:
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 массивами.
#50
(07-04-2025, 23:57)KEN : Эти две функции вставить в скетч
Так не будет работать. Так будет ругаться, что LCD_Output_image_PGM незадекларировано.
А вот если "КОД" заменить в библиотеке, то может прокатить.
Только чем он отличается от оригинальной функции? Словом PGM?