Advertisement
LeventeDaradici

Digital Photo Frame - Arduino Mega 2560 R3 with 3.5 inch TFT display - ILI9486 library

Apr 10th, 2022
1,085
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.63 KB | None | 0 0
  1. // IMPORTANT: LCDWIKI_KBV LIBRARY MUST BE SPECIFICALLY
  2. // CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
  3.  
  4. //This program is a demo of how to show a bmp picture from SD card.
  5.  
  6. //Set the pins to the correct ones for your development shield or breakout board.
  7. //the 16bit mode only use in Mega.you must modify the mode in the file of lcd_mode.h
  8. //when using the BREAKOUT BOARD only and using these 16 data lines to the LCD,
  9. //pin usage as follow:
  10. //             CS  CD  WR  RD  RST  D0  D1  D2  D3  D4  D5  D6  D7  D8  D9  D10  D11  D12  D13  D14  D15
  11. //Arduino Mega 40  38  39  /   41   37  36  35  34  33  32  31  30  22  23  24   25   26   27   28   29
  12.  
  13. //Remember to set the pins to suit your display module!
  14.  
  15. /**********************************************************************************
  16. * @attention
  17. *
  18. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  19. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  20. * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
  21. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  22. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  23. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  24. **********************************************************************************/
  25.  
  26. #include <SD.h>
  27. #include <SPI.h>
  28. #include <LCDWIKI_GUI.h> //Core graphics library
  29. #include <LCDWIKI_KBV.h> //Hardware-specific library
  30.  
  31. //the definiens of 16bit mode as follow:
  32. //if the IC model is known or the modules is unreadable,you can use this constructed function
  33. LCDWIKI_KBV my_lcd(ILI9486,40,38,39,1,41); //model,cs,cd,wr,rd,reset
  34.  
  35. #define  BLACK   0x0000
  36. #define BLUE    0x001F
  37. #define RED     0xF800
  38. #define GREEN   0x07E0
  39. #define CYAN    0x07FF
  40. #define MAGENTA 0xF81F
  41. #define YELLOW  0xFFE0
  42. #define WHITE   0xFFFF
  43.  
  44. #define PIXEL_NUMBER  (my_lcd.Get_Display_Width()/4)
  45. #define FILE_NUMBER 10
  46. #define FILE_NAME_SIZE_MAX 20
  47.  
  48. uint32_t bmp_offset = 0;
  49. uint16_t s_width = my_lcd.Get_Display_Width();  
  50. uint16_t s_heigh = my_lcd.Get_Display_Height();
  51. //int16_t PIXEL_NUMBER;
  52.  
  53. char file_name[FILE_NUMBER][FILE_NAME_SIZE_MAX];
  54.  
  55. uint16_t read_16(File fp)
  56. {
  57.     uint8_t low;
  58.     uint16_t high;
  59.     low = fp.read();
  60.     high = fp.read();
  61.     return (high<<8)|low;
  62. }
  63.  
  64. uint32_t read_32(File fp)
  65. {
  66.     uint16_t low;
  67.     uint32_t high;
  68.     low = read_16(fp);
  69.     high = read_16(fp);
  70.     return (high<<8)|low;  
  71.  }
  72.  
  73. bool analysis_bpm_header(File fp)
  74. {
  75.     if(read_16(fp) != 0x4D42)
  76.     {
  77.       return false;  
  78.     }
  79.     //get bpm size
  80.     read_32(fp);
  81.     //get creator information
  82.     read_32(fp);
  83.     //get offset information
  84.     bmp_offset = read_32(fp);
  85.     //get DIB infomation
  86.     read_32(fp);
  87.     //get width and heigh information
  88.     uint32_t bpm_width = read_32(fp);
  89.     uint32_t bpm_heigh = read_32(fp);
  90.     if((bpm_width != s_width) || (bpm_heigh != s_heigh))
  91.     {
  92.       return false;
  93.     }
  94.     if(read_16(fp) != 1)
  95.     {
  96.         return false;
  97.     }
  98.     read_16(fp);
  99.     if(read_32(fp) != 0)
  100.     {
  101.       return false;
  102.      }
  103.      return true;
  104. }
  105.  
  106. void draw_bmp_picture(File fp)
  107. {
  108.   uint16_t i,j,k,l,m=0;
  109.   uint8_t bpm_data[PIXEL_NUMBER*3] = {0};
  110.   uint16_t bpm_color[PIXEL_NUMBER];
  111.   fp.seek(bmp_offset);
  112.   for(i = 0;i < s_heigh;i++)
  113.   {
  114.     for(j = 0;j<s_width/PIXEL_NUMBER;j++)
  115.     {
  116.       m = 0;
  117.       fp.read(bpm_data,PIXEL_NUMBER*3);
  118.       for(k = 0;k<PIXEL_NUMBER;k++)
  119.       {
  120.         bpm_color[k]= my_lcd.Color_To_565(bpm_data[m+2], bpm_data[m+1], bpm_data[m+0]);
  121.         m +=3;
  122.       }
  123.       for(l = 0;l<PIXEL_NUMBER;l++)
  124.       {
  125.         my_lcd.Set_Draw_color(bpm_color[l]);
  126.         my_lcd.Draw_Pixel(j*PIXEL_NUMBER+l,i);
  127.       }    
  128.      }
  129.    }    
  130. }
  131.  
  132. void setup()
  133. {
  134.     Serial.begin(9600);
  135.    my_lcd.Init_LCD();
  136.    my_lcd.Fill_Screen(BLUE);
  137.    //s_width = my_lcd.Get_Display_Width();  
  138.    //s_heigh = my_lcd.Get_Display_Height();
  139.    //PIXEL_NUMBER = my_lcd.Get_Display_Width()/4;
  140.    if(PIXEL_NUMBER == 60)
  141.    {
  142.        strcpy(file_name[0],"flower.bmp");
  143.        strcpy(file_name[1],"tiger.bmp");
  144.        strcpy(file_name[2],"tree.bmp");
  145.        strcpy(file_name[3],"RedRose.bmp");
  146.    }
  147.    else
  148.    {
  149.        strcpy(file_name[0],"01.bmp");
  150.        strcpy(file_name[1],"02.bmp");
  151.        strcpy(file_name[2],"03.bmp");
  152.        strcpy(file_name[3],"04.bmp");
  153.        strcpy(file_name[4],"05.bmp");
  154.        strcpy(file_name[5],"06.bmp");
  155.        strcpy(file_name[6],"07.bmp");
  156.        strcpy(file_name[7],"08.bmp");
  157.        strcpy(file_name[8],"09.bmp");
  158.        strcpy(file_name[9],"10.bmp");
  159.  
  160.    }
  161.   //Init SD_Card
  162.    pinMode(53, OUTPUT);
  163.    
  164.     if (!SD.begin(53))
  165.     {
  166.       my_lcd.Set_Text_Back_colour(BLUE);
  167.       my_lcd.Set_Text_colour(WHITE);    
  168.       my_lcd.Set_Text_Size(1);
  169.       my_lcd.Print_String("SD Card Init fail!",0,0);
  170.     }
  171. }
  172.  
  173. void loop()
  174. {
  175.     int i = 0;
  176.     File bmp_file;
  177.     for(i = 0;i<FILE_NUMBER;i++)
  178.     {
  179.        bmp_file = SD.open(file_name[i]);
  180.        if(!bmp_file)
  181.        {
  182.             my_lcd.Set_Text_Back_colour(BLUE);
  183.             my_lcd.Set_Text_colour(WHITE);    
  184.             my_lcd.Set_Text_Size(1);
  185.             my_lcd.Print_String("didnt find BMPimage!",0,10);
  186.             while(1);
  187.         }
  188.         if(!analysis_bpm_header(bmp_file))
  189.         {  
  190.             my_lcd.Set_Text_Back_colour(BLUE);
  191.             my_lcd.Set_Text_colour(WHITE);    
  192.             my_lcd.Set_Text_Size(1);
  193.             my_lcd.Print_String("bad bmp picture!",0,0);
  194.             return;
  195.         }
  196.           draw_bmp_picture(bmp_file);
  197.          bmp_file.close();
  198.          delay(5000);
  199.      }
  200. }
  201.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement