你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【HAL库每天一例】第054例:LCD-显示图片(图片在SD卡)

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

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-054. LCD-显示图片(图片在SD卡)


/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-054. LCD-显示图片(图片在SD卡)
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【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****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg
CubeMX_5.jpg
CubeMX_6.jpg
CubeMX_7.jpg
CubeMX_8.jpg
CubeMX_9.jpg
CubeMX_10.jpg
CubeMX_11.jpg
CubeMX_12.jpg



bsp_bmp.h文件内容
  1. #ifndef __BSP_BMP_H__
  2. #define        __BSP_BMP_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"
  5. #include <string.h>
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>

  9. /* 类型定义 ------------------------------------------------------------------*/
  10. //位图文件头信息结构定义
  11. //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)
  12. #pragma pack(2) //两字节对齐,否则bmp_fileheader会占16Byte
  13. typedef struct
  14. {
  15.   uint16_t bfType;                              //固定为:bm  0x4d42
  16.   uint32_t bfSize;                                                                                                                         //文件大小                                                                                                                                                                4
  17.   uint16_t bfReserved1;                                                                                                 //保留字,不考虑                                                                                                                                         2
  18.   uint16_t bfReserved2;                                                                                                 //保留字,同上                                                                                                                                                 2
  19.   uint32_t bfOffBits;                                                                                                         //实际位图数据的偏移字节数,即前三个部分长度之和        4
  20. }BMP_FileHeader;

  21. typedef struct
  22. {
  23.   uint32_t biSize;                                                                                                                   //指定此结构体的长度,为40                                                                                                                 4
  24.   uint32_t biWidth;                                                                                                                 //位图宽                                                                                                                                                                                         4
  25.   uint32_t biHeight;                                                                                                                 //位图高                                                                                                                                                                                         4
  26.   uint16_t biPlanes;                                                                                                                 //平面数,为1                                                                                                                                                                         2
  27.   uint16_t biBitCount;                                                                                                         //采用颜色位数,可以是1,2,4,8,16,24新的可以是32        2
  28.   uint32_t biCompression;                                                                                         //压缩方式,可以是0,1,2,其中0表示不压缩                                                4
  29.   uint32_t biSizeImage;                                                                                                 //实际位图数据占用的字节数                                                                                                                4
  30.   uint32_t biXPelsPerMeter;                                                                                 //X方向分辨率                                                                                                                                                                        4
  31.   uint32_t biYPelsPerMeter;                                                                                 //Y方向分辨率                                                                                                                                                                        4
  32.   uint32_t biClrUsed;                                                                                                         //使用的颜色数,如果为0,则表示默认值(2^颜色位数)                        4
  33.   uint32_t biClrImportant;                                                                                   //重要颜色数,如果为0,则表示所有颜色都是重要的                                4
  34. }BMP_InfoHeader;

  35. typedef struct  
  36. {
  37.   uint8_t rgbBlue;                                                                                                           //该颜色的蓝色分量
  38.   uint8_t rgbGreen;                                                                                                         //该颜色的绿色分量
  39.   uint8_t rgbRed;                                                                                                                 //该颜色的红色分量
  40.   uint8_t rgbReserved;                                                                                                 //保留值
  41. }BMP_RGBQUAD;

  42. /* 宏定义 --------------------------------------------------------------------*/
  43. // 四个字节对齐  进1制处理
  44. #define WIDTHBYTES(bits)         (((bits)+31)/32*4)                //对于24位真彩色 每一行的像素宽度必须是4的倍数  否则补0补齐
  45. #define GETR_FROM_RGB16(RGB565)  (uint8_t((RGB565>>11)<<3))                                            //返回8位 R
  46. #define GETG_FROM_RGB16(RGB565)  (uint8_t(((RGB565 & 0x07ff)>>5)<<2))         //返回8位 G
  47. #define GETB_FROM_RGB16(RGB565)  (uint8_t(((RGB565 & 0x001f))<<3))      //返回8位 B
  48. //#pragma diag_suppress 870         //使编译器支持多字节字符,否则会有invalid multibyte character sequence警告

  49. /* 扩展变量 ------------------------------------------------------------------*/
  50. /* 函数声明 ------------------------------------------------------------------*/
  51. void Lcd_show_bmp(uint16_t x, uint16_t y,char *pic_name);

  52. #endif /* __BSP_BMP_H__ */

  53. /******************* (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. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码
液晶界面显示效果截图.png


收藏 1 评论2 发布时间:2016-6-28 08:40

举报

2个回答
stary666 回答时间:2016-6-28 10:24:55
Ian-392967 回答时间:2016-7-1 22:25:48
多谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版