سلام دوستان
من با استفاده از این کد و با استفاده از ماژول sd card اومدم تعدادی عکس رو نمایشگر lcd tft2.4 نمایش دادم

حالا مشکل من اینکه میخوام چند تا عکس رو به صورت همزمان نمایش بدم با ابعاد مختلف
این کد میاد عکس های به صورت پشت سره هم نمایش میده
ممنون میشم دوستان راهنمایی کنند
من با استفاده از این کد و با استفاده از ماژول sd card اومدم تعدادی عکس رو نمایشگر lcd tft2.4 نمایش دادم

کد:
// BMP-loading example specifically for the TFTLCD breakout board. // If using the Arduino shield, use the tftbmp_shield.pde sketch instead! // If using an Arduino Mega, make sure the SD library is configured for // 'soft' SPI in the file Sd2Card.h. /////// ***** Not Tested yet on SPFD5408 - next version I do it #include <Adafruit_GFX.h> #include <MCUFRIEND_kbv.h> #include <Fonts/FreeMonoBoldOblique12pt7b.h> MCUFRIEND_kbv tft(A3, A2, A1, A0, A4); uint16_t identifier; #include <SD.h> #include <SPI.h> #define SD_CS 53 // Set the chip select line to whatever you use (10 doesnt conflict with the library) void setup() { Serial.begin(9600); tft.reset(); identifier = tft.readID(); tft.setRotation(3); // pinMode(10, OUTPUT); // digitalWrite(10, HIGH); tft.begin(identifier); progmemPrint(PSTR("Initializing SD card...")); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("failed!")); return; } progmemPrintln(PSTR("OK!")); } void loop() { bmpDraw("1.bmp", 0, 10); // delay(2000); bmpDraw("2.bmp", 0, 0); // delay(2000); // bmpDraw("3.bmp", 0, 0); // delay(2000); // bmpDraw("4.bmp", 0, 0); // delay(2000); // bmpDraw("5.bmp", 0, 0); // delay(2000); // bmpDraw("6.bmp", 0, 0); // delay(2000); // bmpDraw("7.bmp", 0, 0); // delay(2000); // bmpDraw("8.bmp", 0, 0); // delay(2000); // bmpDraw("9.bmp", 0, 0); // delay(2000); // bmpDraw("10.bmp", 0, 0); // delay(2000); // bmpDraw("11.bmp", 0, 0); // delay(2000); // bmpDraw("12.bmp", 0, 0); // delay(2000); // bmpDraw("13.bmp", 0, 0); // delay(2000); // bmpDraw("14.bmp", 0, 0); // delay(2000); // bmpDraw("15.bmp", 0, 0); // delay(2000); // bmpDraw("16.bmp", 0, 0); // delay(2000); // bmpDraw("17.bmp", 0, 0); // delay(2000); // bmpDraw("18.bmp", 0, 0); // delay(2000); // bmpDraw("19.bmp", 0, 0); // delay(2000); // bmpDraw("20.bmp", 0, 0); // delay(2000); // bmpDraw("21.bmp", 0, 0); // delay(2000); } // This function opens a Windows Bitmap (BMP) file and // displays it at the given coordinates. It's sped up // by reading many pixels worth of data at a time // (rather than pixel by pixel). Increasing the buffer // size takes more of the Arduino's precious RAM but // makes loading a little faster. 20 pixels seems a // good balance. #define BUFFPIXEL 20 void bmpDraw(char *filename, int x, int y) { File bmpFile; int bmpWidth, bmpHeight; // W+H in pixels uint8_t bmpDepth; // Bit depth (currently must be 24) uint32_t bmpImageoffset; // Start of image data in file uint32_t rowSize; // Not always = bmpWidth; may have padding uint8_t sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel) uint16_t lcdbuffer[BUFFPIXEL]; // pixel out buffer (16-bit per pixel) uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer boolean goodBmp = false; // Set to true on valid header parse boolean flip = true; // BMP is stored bottom-to-top int w, h, row, col; uint8_t r, g, b; uint32_t pos = 0, startTime = millis(); uint8_t lcdidx = 0; boolean first = true; if((x >= tft.width()) || (y >= tft.height())) return; Serial.println(); progmemPrint(PSTR("Loading image '")); Serial.print(filename); Serial.println('\''); // Open requested file on SD card if ((bmpFile = SD.open(filename)) == NULL) { progmemPrintln(PSTR("File not found")); return; } // Parse BMP header if(read16(bmpFile) == 0x4D42) { // BMP signature progmemPrint(PSTR("File size: ")); Serial.println(read32(bmpFile)); (void)read32(bmpFile); // Read & ignore creator bytes bmpImageoffset = read32(bmpFile); // Start of image data progmemPrint(PSTR("Image Offset: ")); Serial.println(bmpImageoffset, DEC); // Read DIB header progmemPrint(PSTR("Header size: ")); Serial.println(read32(bmpFile)); bmpWidth = read32(bmpFile); bmpHeight = read32(bmpFile); if(read16(bmpFile) == 1) { // # planes -- must be '1' bmpDepth = read16(bmpFile); // bits per pixel progmemPrint(PSTR("Bit Depth: ")); Serial.println(bmpDepth); if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed goodBmp = true; // Supported BMP format -- proceed! progmemPrint(PSTR("Image size: ")); Serial.print(bmpWidth); Serial.print('x'); Serial.println(bmpHeight); // BMP rows are padded (if needed) to 4-byte boundary rowSize = (bmpWidth * 3 + 3) & ~3; // If bmpHeight is negative, image is in top-down order. // This is not canon but has been observed in the wild. if(bmpHeight < 0) { bmpHeight = -bmpHeight; flip = false; } // Crop area to be loaded w = bmpWidth; h = bmpHeight; if((x+w-1) >= tft.width()) w = tft.width() - x; if((y+h-1) >= tft.height()) h = tft.height() - y; // Set TFT address window to clipped image bounds tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row<h; row++) { // For each scanline... // Seek to start of scan line. It might seem labor- // intensive to be doing this on every line, but this // method covers a lot of gritty details like cropping // and scanline padding. Also, the seek only takes // place if the file position actually needs to change // (avoids a lot of cluster math in SD library). if(flip) // Bitmap is stored bottom-to-top order (normal BMP) pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize; else // Bitmap is stored top-to-bottom pos = bmpImageoffset + row * rowSize; if(bmpFile.position() != pos) { // Need seek? bmpFile.seek(pos); buffidx = sizeof(sdbuffer); // Force buffer reload } for (col=0; col<w; col++) { // For each column... // Time to read more pixel data? if (buffidx >= sizeof(sdbuffer)) { // Indeed // Push LCD buffer to the display first if(lcdidx > 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx = 0; first = false; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx = 0; // Set index to beginning } // Convert pixel from BMP to TFT format b = sdbuffer[buffidx++]; g = sdbuffer[buffidx++]; r = sdbuffer[buffidx++]; lcdbuffer[lcdidx++] = tft.color565(r,g,b); } // end pixel } // end scanline // Write any remaining data to LCD if(lcdidx > 0) { tft.pushColors(lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Loaded in ")); Serial.print(millis() - startTime); Serial.println(" ms"); } // end goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP format not recognized.")); } // These read 16- and 32-bit types from the SD card file. // BMP data is stored little-endian, Arduino is little-endian too. // May need to reverse subscript order if porting elsewhere. uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] = f.read(); // LSB ((uint8_t *)&result)[1] = f.read(); // MSB return result; } uint32_t read32(File f) { uint32_t result; ((uint8_t *)&result)[0] = f.read(); // LSB ((uint8_t *)&result)[1] = f.read(); ((uint8_t *)&result)[2] = f.read(); ((uint8_t *)&result)[3] = f.read(); // MSB return result; } // Copy string from flash to serial port // Source string MUST be inside a PSTR() declaration! void progmemPrint(const char *str) { char c; while(c = pgm_read_byte(str++)) Serial.print(c); } // Same as above, with trailing newline void progmemPrintln(const char *str) { progmemPrint(str); Serial.println(); }
این کد میاد عکس های به صورت پشت سره هم نمایش میده
ممنون میشم دوستان راهنمایی کنند
دیدگاه