[STM32F1] 【HAL库每天一例】第055例:LCD-液晶截图

[复制链接]
 楼主| 亼亽 发表于 2016-6-29 09:37 | 显示全部楼层 |阅读模式
本帖最后由 亼亽 于 2016-6-29 09:39 编辑

【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-055. LCD-液晶截图

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-055. LCD-液晶截图
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
  本例程实现液晶模组显示24bit的bmp格式图片。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  
【3】操作及现象
将例程目录下的图片文件拷贝到SD卡中,并把SD卡插入到开发板上,把3.5寸TFT液晶模组插入开发
板中间液晶接口上,使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB
接口(需要安装驱动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序
之后,在串口调试助手窗口可接收到液晶模组ID信息,同时液晶屏幕亮起来,先后显示几张图片。

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


bsp_bmp.c文件内容
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: bsp_bmp.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: bmp图像显示实现
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "usart/bsp_debug_usart.h"
  19. #include "lcd/bsp_lcd.h"
  20. #include "ff.h"
  21. #include "bmp/bsp_bmp.h"

  22. /* 私有类型定义 --------------------------------------------------------------*/
  23. /* 私有宏定义 ----------------------------------------------------------------*/
  24. /* R(8bit) G(8bit) B(8bit)  --> RGB565  */
  25. #define RGB24TORGB16(R,G,B) ((R>>3)<<11)|((G>>2)<<5)|(B>>3)

  26. /* 如果不需要打印bmp相关的提示信息,将printf注释掉即可
  27. * 如要用printf(),需将串口驱动文件包含进来
  28. */
  29. #define BMP_DEBUG_PRINTF(FORMAT,...)  //printf(FORMAT,##__VA_ARGS__)        

  30. /* 私有变量 ------------------------------------------------------------------*/
  31. uint8_t pColorData[960];                                        /* 一行真彩色数据缓存 320 * 3 = 960 */
  32. FIL file;
  33. extern FRESULT f_res;
  34. UINT f_num;

  35. /* 扩展变量 ------------------------------------------------------------------*/
  36. /* 私有函数原形 --------------------------------------------------------------*/
  37. /* 函数体 --------------------------------------------------------------------*/
  38. /**
  39.   * 函数功能: 打印BMP文件的头信息,用于调试
  40.   * 输入参数: pBmpHead:BMP文件的头信息
  41.   * 返 回 值: 无
  42.   * 说    明:无
  43.   */
  44. static void showBmpHeader(BMP_FileHeader *pBmpHead)
  45. {
  46.     BMP_DEBUG_PRINTF("位图文件头:\n");
  47.     BMP_DEBUG_PRINTF("文件类型:%d\n",(*pBmpHead).bfType);
  48.     BMP_DEBUG_PRINTF("文件大小:%d\n",(*pBmpHead).bfSize);
  49.     BMP_DEBUG_PRINTF("保留字:%d\n",(*pBmpHead).bfReserved1);
  50.     BMP_DEBUG_PRINTF("保留字:%d\n",(*pBmpHead).bfReserved2);
  51.     BMP_DEBUG_PRINTF("实际位图数据的偏移字节数:%d\n",(*pBmpHead).bfOffBits);
  52.                 BMP_DEBUG_PRINTF("\n");        
  53. }

  54. /**
  55.   * 函数功能: 打印BMP文件的头信息,用于调试
  56.   * 输入参数: pBmpHead:BMP文件的头信息
  57.   * 返 回 值: 无
  58.   * 说    明:无
  59.   */
  60. static void showBmpInforHeader(BMP_InfoHeader *pBmpInforHead)
  61. {
  62.     BMP_DEBUG_PRINTF("位图信息头:\n");
  63.     BMP_DEBUG_PRINTF("结构体的长度:%d\n",(*pBmpInforHead).biSize);
  64.     BMP_DEBUG_PRINTF("位图宽:%d\n",(*pBmpInforHead).biWidth);
  65.     BMP_DEBUG_PRINTF("位图高:%d\n",(*pBmpInforHead).biHeight);
  66.     BMP_DEBUG_PRINTF("biPlanes平面数:%d\n",(*pBmpInforHead).biPlanes);
  67.     BMP_DEBUG_PRINTF("biBitCount采用颜色位数:%d\n",(*pBmpInforHead).biBitCount);
  68.     BMP_DEBUG_PRINTF("压缩方式:%d\n",(*pBmpInforHead).biCompression);
  69.     BMP_DEBUG_PRINTF("biSizeImage实际位图数据占用的字节数:%d\n",(*pBmpInforHead).biSizeImage);
  70.     BMP_DEBUG_PRINTF("X方向分辨率:%d\n",(*pBmpInforHead).biXPelsPerMeter);
  71.     BMP_DEBUG_PRINTF("Y方向分辨率:%d\n",(*pBmpInforHead).biYPelsPerMeter);
  72.     BMP_DEBUG_PRINTF("使用的颜色数:%d\n",(*pBmpInforHead).biClrUsed);
  73.     BMP_DEBUG_PRINTF("重要颜色数:%d\n",(*pBmpInforHead).biClrImportant);
  74.                 BMP_DEBUG_PRINTF("\n");
  75. }

  76. /**
  77.   * 函数功能: 显示bmp图片, 24位真彩色
  78.   * 输入参数: x:显示图片左上角x轴坐标
  79.   *           y:显示图片左上角y轴坐标
  80.   *           pic_name:显示图片文件名称
  81.   * 返 回 值: 无
  82.   * 说    明:图片宽度和高度根据图片大小而定
  83.   */
  84. void Lcd_show_bmp(uint16_t x, uint16_t y,char *pic_name)
  85. {
  86.         uint16_t i, j, k;
  87.         int width, height, l_width;
  88.   
  89.         BMP_FileHeader FileHeader;
  90.         BMP_InfoHeader InfoHeader;
  91.   
  92. /*-------------------------------------------------------------------------------------------------------*/
  93.         f_res=f_open(&file,pic_name, FA_OPEN_EXISTING|FA_READ);        
  94.         if(f_res == FR_OK)
  95.         {
  96.                 BMP_DEBUG_PRINTF("Open file success\r\n");

  97.                 /* 读取文件头信息  两个字节*/         
  98.                 f_res=f_read(&file,&FileHeader,sizeof(BMP_FileHeader),&f_num);     
  99.    
  100.                 /* 判断是不是bmp文件 "BM"*/
  101.                 if(FileHeader.bfType!=0x4d42)
  102.                 {
  103.                         BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
  104.                         return;
  105.                 }
  106.                 else
  107.                 {
  108.                         BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");        
  109.                 }
  110.                 /* 读取BMP文件头信息*/      
  111.                 showBmpHeader(&FileHeader);
  112.    
  113.                 /* 读取位图信息头信息 */
  114.                 f_res=f_read(&file,&InfoHeader,sizeof(BMP_InfoHeader),&f_num);      
  115.                 showBmpInforHeader(&InfoHeader);
  116.         }   
  117.         else
  118.         {
  119.                 BMP_DEBUG_PRINTF("file open fail!\r\n");
  120.                 return;
  121.         }  
  122. /*-------------------------------------------------------------------------------------------------------*/
  123.         width  = InfoHeader.biWidth;
  124.         height = InfoHeader.biHeight;
  125.   
  126.         /* 计算位图的实际宽度并确保它为32的倍数        */
  127.         l_width = WIDTHBYTES(width* InfoHeader.biBitCount);
  128.   
  129.         if((l_width>960)||(InfoHeader.biBitCount!=24))
  130.         {
  131.                 BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (X<=320 and bit!=16)\n");
  132.                 return;
  133.          }
  134.   f_lseek(&file,FileHeader.bfOffBits);
  135.    
  136.   if(InfoHeader.biBitCount == 24)
  137.   {
  138.     for(i=0;i<height;++i)
  139.     {
  140.       /* 开一个图片大小的窗口*/
  141.       LCD_OpenWindow(x, y+height-i-1, width, 1);
  142.       LCD_WRITE_CMD(0x2C);
  143.       /* 读取一行bmp的数据到数组pColorData里面 */
  144.       f_read(&file,pColorData,l_width,&f_num);      
  145.       for(j=0;j<width;j++)                                                                                            //一行有效信息
  146.       {        
  147.         k = j*3;                                                                                                                                         //一行中第K个像素的起点        
  148.         LCD_WRITE_DATA(RGB24TORGB16(pColorData[k+2],pColorData[k+1],pColorData[k])); //写入LCD-GRAM
  149.       }
  150.     }
  151.   }
  152.         f_close(&file);   
  153. }


  154. uint8_t Screen_shot(uint16_t x,uint16_t y,uint16_t Width,uint16_t Height, const char * filename)
  155. {
  156.         /* bmp  文件头 54个字节 */
  157.         uint8_t header[54] =
  158.   {
  159.                 0x42, 0x4d, 0, 0, 0, 0,
  160.                 0, 0, 0, 0, 54, 0,
  161.                 0, 0, 40,0, 0, 0,
  162.                 0, 0, 0, 0, 0, 0,
  163.                 0, 0, 1, 0, 24, 0,
  164.                 0, 0, 0, 0, 0, 0,
  165.                 0, 0, 0, 0, 0,
  166.                 0, 0, 0, 0, 0,
  167.                 0, 0, 0, 0, 0,
  168.                 0, 0, 0
  169.         };
  170.         
  171.         uint16_t i;
  172.         uint16_t j;
  173.         uint32_t file_size;     
  174.         uint16_t width;
  175.         uint16_t height;
  176.         uint8_t r,g,b;        
  177.         uint16_t read_data;
  178.         uint8_t kk[4]={0,0,0,0};        
  179.   
  180.         uint8_t ucAlign=Width%4;        
  181.         
  182.         /* 宽*高 +补充的字节 + 头部信息 */
  183.         file_size = Width * Height * 3 + Height*(Width%4) + 54;               

  184.         /* 文件大小 4个字节 */
  185.         header[2] = file_size&0x000000ff;
  186.         header[3] = (file_size >> 8) & 0x000000ff;
  187.         header[4] = (file_size >> 16) & 0x000000ff;
  188.         header[5] = (file_size >> 24) & 0x000000ff;
  189.         
  190.         /* 位图宽 4个字节 */
  191.         width=Width;        
  192.         header[18] = width & 0x000000ff;
  193.         header[19] = (width >> 8) &0x000000ff;
  194.         header[20] = (width >> 16) &0x000000ff;
  195.         header[21] = (width >> 24) &0x000000ff;
  196.         
  197.         /* 位图高 4个字节 */
  198.         height = Height;
  199.         header[22] = height &0x000000ff;
  200.         header[23] = (height >> 8) &0x000000ff;
  201.         header[24] = (height >> 16) &0x000000ff;
  202.         header[25] = (height >> 24) &0x000000ff;
  203.   
  204.         /* 新建一个文件 */        
  205.         f_res = f_open(&file,filename,FA_CREATE_ALWAYS|FA_WRITE);

  206.         if(f_res==FR_OK)
  207.         {   
  208.                 /* 将预先定义好的bmp头部信息写进文件里面 */
  209.                 f_res = f_write(&file, header,54, &f_num);               
  210.     for(i=0; i<Height; i++)            
  211.     {            
  212.       if(!(Width % 4))
  213.       {         
  214.         for(j=Width;j>0;j--)  
  215.         {                                       
  216.           read_data=LCD_GetPointPixel(y+j-1, x+i);                        
  217.          
  218.           r =  GETR_FROM_RGB16(read_data);
  219.           g =  GETG_FROM_RGB16(read_data);
  220.           b =  GETB_FROM_RGB16(read_data);

  221.           f_res = f_write(&file, &b,1, &f_num);
  222.           f_res = f_write(&file, &g,1, &f_num);
  223.           f_res = f_write(&file, &r,1, &f_num);
  224.         }
  225.       }
  226.       else
  227.       {        
  228.         for(j=Width;j>0;j--)   
  229.         {                                       
  230.           read_data = LCD_GetPointPixel(y+j-1, x+i);                                
  231.          
  232.           r =  GETR_FROM_RGB16(read_data);
  233.           g =  GETG_FROM_RGB16(read_data);
  234.           b =  GETB_FROM_RGB16(read_data);

  235.           f_res = f_write(&file, &b,1, &f_num);
  236.           f_res = f_write(&file, &g,1, &f_num);
  237.           f_res = f_write(&file, &r,1, &f_num);
  238.         }         
  239.         if( ucAlign )                                /* 如果不是4字节对齐 */
  240.           f_res = f_write ( & file, kk, ucAlign, & f_num );
  241.        }
  242.     }/* 截屏完毕 */  
  243.                 f_close(&file);
  244.                 return 1;               
  245.         }        
  246.         else if(f_res==FR_EXIST)  //如果文件已经存在
  247.                 return FR_EXIST;                                                 //8
  248.         else/* 截屏失败 */
  249.                 return 0;
  250. }

  251. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/


screen1.bmp
screen2.bmp
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝
快速回复 在线客服 返回列表 返回顶部