打印
[STM32F1]

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

[复制链接]
814|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
亼亽|  楼主 | 2016-6-28 08:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将**每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://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使用。
  *
  * 淘宝:
  * 论坛: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.h文件内容
#ifndef __BSP_BMP_H__
#define        __BSP_BMP_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f1xx_hal.h"
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

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

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

typedef struct  
{
  uint8_t rgbBlue;                                                                                                           //该颜色的蓝色分量
  uint8_t rgbGreen;                                                                                                         //该颜色的绿色分量
  uint8_t rgbRed;                                                                                                                 //该颜色的红色分量
  uint8_t rgbReserved;                                                                                                 //保留值
}BMP_RGBQUAD;

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

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

#endif /* __BSP_BMP_H__ */

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




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

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

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

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

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

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

/**
  * 函数功能: 显示bmp图片, 24位真彩色
  * 输入参数: x:显示图片左上角x轴坐标
  *           y:显示图片左上角y轴坐标
  *           pic_name:显示图片文件名称
  * 返 回 值: 无
  * 说    明:图片宽度和高度根据图片大小而定
  */
void Lcd_show_bmp(uint16_t x, uint16_t y,char *pic_name)
{
        uint16_t i, j, k;
        int width, height, l_width;
  
        BMP_FileHeader FileHeader;
        BMP_InfoHeader InfoHeader;
  
/*-------------------------------------------------------------------------------------------------------*/
        f_res=f_open(&file,pic_name, FA_OPEN_EXISTING|FA_READ);       
        if(f_res == FR_OK)
        {
                BMP_DEBUG_PRINTF("Open file success\r\n");

                /* 读取文件头信息  两个字节*/         
                f_res=f_read(&file,&FileHeader,sizeof(BMP_FileHeader),&f_num);     
   
                /* 判断是不是bmp文件 "BM"*/
                if(FileHeader.bfType!=0x4d42)
                {
                        BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
                        return;
                }
                else
                {
                        BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");       
                }
                /* 读取BMP文件头信息*/      
                showBmpHeader(&FileHeader);
   
                /* 读取位图信息头信息 */
                f_res=f_read(&file,&InfoHeader,sizeof(BMP_InfoHeader),&f_num);      
                showBmpInforHeader(&InfoHeader);
        }   
        else
        {
                BMP_DEBUG_PRINTF("file open fail!\r\n");
                return;
        }  
/*-------------------------------------------------------------------------------------------------------*/
        width  = InfoHeader.biWidth;
        height = InfoHeader.biHeight;
  
        /* 计算位图的实际宽度并确保它为32的倍数        */
        l_width = WIDTHBYTES(width* InfoHeader.biBitCount);
  
        if((l_width>960)||(InfoHeader.biBitCount!=24))
        {
                BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (X<=320 and bit!=16)\n");
                return;
         }
  f_lseek(&file,FileHeader.bfOffBits);
   
  if(InfoHeader.biBitCount == 24)
  {
    for(i=0;i<height;++i)
    {
      /* 开一个图片大小的窗口*/
      LCD_OpenWindow(x, y+height-i-1, width, 1);
      LCD_WRITE_CMD(0x2C);
      /* 读取一行bmp的数据到数组pColorData里面 */
      f_read(&file,pColorData,l_width,&f_num);      
      for(j=0;j<width;j++)                                                                                            //一行有效信息
      {        
        k = j*3;                                                                                                                                         //一行中第K个像素的起点        
        LCD_WRITE_DATA(RGB24TORGB16(pColorData[k+2],pColorData[k+1],pColorData[k])); //写入LCD-GRAM
      }
    }
  }
        f_close(&file);   
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/





沙发
mmuuss586| | 2016-6-28 20:25 | 只看该作者
谢谢分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

216

帖子

48

粉丝