// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY // CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD. // SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP. //Technical support:goodtft@163.com #include // Core graphics library #include // Hardware-specific library #include #include // The control pins for the LCD can be assigned to any digital or // analog pins...but we'll use the analog pins as this allows us to // double up the pins with the touch screen (see the TFT paint example). #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_CD A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RD A0 // LCD Read goes to Analog 0 #define PIN_SD_CS 10 // Adafruit SD shields and modules: pin 10 #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin // When using the BREAKOUT BOARD only, use these 8 data lines to the LCD: // For the Arduino Uno, Duemilanove, Diecimila, etc.: // D0 connects to digital pin 8 (Notice these are // D1 connects to digital pin 9 NOT in order!) // D2 connects to digital pin 2 // D3 connects to digital pin 3 // D4 connects to digital pin 4 // D5 connects to digital pin 5 // D6 connects to digital pin 6 // D7 connects to digital pin 7 // For the Arduino Mega, use digital pins 22 through 29 // (on the 2-row header at the end of the board). // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // If using the shield, all control and data lines are fixed, and // a simpler declaration can optionally be used: // Adafruit_TFTLCD tft; #define MAX_BMP 10 // bmp file num #define FILENAME_LEN 20 // max file name length const int __Gnbmp_height = 320; // bmp hight const int __Gnbmp_width = 240; // bmp width unsigned char __Gnbmp_image_offset = 0; // offset int __Gnfile_num = 4; // num of file char __Gsbmp_files[4][FILENAME_LEN] = // add file name here { "flower.bmp", "tiger.bmp", "tree.bmp", "RedRose.bmp", }; File bmpFile; /*********************************************/ // These read data from the SD card file and convert them to big endian // (the data is stored in little endian format!) // LITTLE ENDIAN! uint16_t read16(File f) { uint16_t d; uint8_t b; b = f.read(); d = f.read(); d <<= 8; d |= b; return d; } // LITTLE ENDIAN! uint32_t read32(File f) { uint32_t d; uint16_t b; b = read16(f); d = read16(f); d <<= 16; d |= b; return d; } /*********************************************/ // This procedure reads a bitmap and draws it to the screen // its sped up by reading many pixels worth of data at a time // instead of just one pixel at a time. increading the buffer takes // more RAM but makes the drawing a little faster. 20 pixels' worth // is probably a good place #define BUFFPIXEL 60 // must be a divisor of 240 #define BUFFPIXEL_X3 180 // BUFFPIXELx3 void bmpdraw(File f, int x, int y) { bmpFile.seek(__Gnbmp_image_offset); uint32_t time = millis(); uint8_t sdbuffer[BUFFPIXEL_X3]; // 3 * pixels to buffer for (int i=0; i< __Gnbmp_height; i++) { for(int j=0; j<(240/BUFFPIXEL); j++) { bmpFile.read(sdbuffer, BUFFPIXEL_X3); uint8_t buffidx = 0; int offset_x = j*BUFFPIXEL; unsigned int __color[BUFFPIXEL]; for(int k=0; k>3; // read __color[k] = __color[k]<<6 | (sdbuffer[buffidx+1]>>2); // green __color[k] = __color[k]<<5 | (sdbuffer[buffidx+0]>>3); // blue buffidx += 3; } for (int m = 0; m < BUFFPIXEL; m ++) { tft.drawPixel(m+offset_x, i,__color[m]); } } } Serial.print(millis() - time, DEC); Serial.println(" ms"); } boolean bmpReadHeader(File f) { // read header uint32_t tmp; uint8_t bmpDepth; if (read16(f) != 0x4D42) { // magic bytes missing return false; } // read file size tmp = read32(f); Serial.print("size 0x"); Serial.println(tmp, HEX); // read and ignore creator bytes read32(f); __Gnbmp_image_offset = read32(f); Serial.print("offset "); Serial.println(__Gnbmp_image_offset, DEC); // read DIB header tmp = read32(f); Serial.print("header size "); Serial.println(tmp, DEC); int bmp_width = read32(f); int bmp_height = read32(f); if(bmp_width != __Gnbmp_width || bmp_height != __Gnbmp_height) { // if image is not 320x240, return false return false; } if (read16(f) != 1) return false; bmpDepth = read16(f); Serial.print("bitdepth "); Serial.println(bmpDepth, DEC); if (read32(f) != 0) { // compression not supported! return false; } Serial.print("compression "); Serial.println(tmp, DEC); return true; } void setup(void) { Serial.begin(9600); Serial.println(F("TFT LCD test")); #ifdef USE_ADAFRUIT_SHIELD_PINOUT Serial.println(F("Using Adafruit 2.4\" TFT Arduino Shield Pinout")); #else Serial.println(F("Using Adafruit 2.4\" TFT Breakout Board Pinout")); #endif Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height()); tft.reset(); uint16_t identifier = tft.readID(); if(identifier==0x0101) identifier=0x9341; if(identifier == 0x9325) { Serial.println(F("Found ILI9325 LCD driver")); } else if(identifier == 0x4535) { Serial.println(F("Found LGDP4535 LCD driver")); }else if(identifier == 0x9328) { Serial.println(F("Found ILI9328 LCD driver")); } else if(identifier == 0x7575) { Serial.println(F("Found HX8347G LCD driver")); } else if(identifier == 0x9341) { Serial.println(F("Found ILI9341 LCD driver")); } else if(identifier == 0x8357) { Serial.println(F("Found HX8357D LCD driver")); } else { Serial.print(F("Unknown LCD driver chip: ")); Serial.println(identifier, HEX); Serial.println(F("If using the Adafruit 2.4\" TFT Arduino shield, the line:")); Serial.println(F(" #define USE_ADAFRUIT_SHIELD_PINOUT")); Serial.println(F("should appear in the library header (Adafruit_TFT.h).")); Serial.println(F("If using the breakout board, it should NOT be #defined!")); Serial.println(F("Also if using the breakout, double-check that all wiring")); Serial.println(F("matches the tutorial.")); return; } tft.begin(identifier); tft.fillScreen(BLUE); //Init SD_Card pinMode(10, OUTPUT); if (!SD.begin(10)) { Serial.println("initialization failed!"); tft.setCursor(0, 0); tft.setTextColor(WHITE); tft.setTextSize(1); tft.println("SD Card Init fail."); }else Serial.println("initialization done."); } void loop(void) { for(unsigned char i=0; i<__Gnfile_num; i++) { bmpFile = SD.open(__Gsbmp_files[i]); if (! bmpFile) { Serial.println("didnt find image"); tft.setTextColor(WHITE); tft.setTextSize(1); tft.println("didnt find BMPimage"); while (1); } if(! bmpReadHeader(bmpFile)) { Serial.println("bad bmp"); tft.setTextColor(WHITE); tft.setTextSize(1); tft.println("bad bmp"); return; } bmpdraw(bmpFile, 0, 0); bmpFile.close(); delay(1000); delay(1000); } }