• TFT-LCD屏幕显示图片


    TFT-LCD屏幕显示图片

    TFT_LCD显示图片时,图片大小选择要适配屏幕大小,如果要竖屏显示的话,则屏幕宽x高为240x320,所以图片也要找240x320的,

    如果是横屏显示,则屏幕宽x高为320x240,所以图片也要找320x240的

    图片取模软件 —— Image2Lcd v2.9

    因为本次实验是竖屏显示,所以先在网上找一张240x320的图片,然后用图片取模软件打开

    在这里插入图片描述

    输出数据类型选择C语言数据,扫描模式为水平,输出灰度默认是单色的,因为屏幕是16位的,所以要改为16位真彩色,最大宽度和高度与图片一致,取消包含图像头数据,勾选高位在前,这与后面编写代码有关,然后点击下方的16位彩色,在颜色位数上选择RGB565的数据格式;然后就可点击保存,命名为Picture1.h,文件里会有图片的取模数据,后续在代码中导入该头文件直接使用即可

    代码

    Picture1.h

    这个数组就是用取模软件取出的图片数据,数据比较大,有153600个字节,差不多150KB,一定要用const修饰,放到STM32的内部Flash中,因为图片大小为320*240个像素点,每个像素点由16位确定,共两个字节,所以320 * 240 * 2 = 153600

    STM32F103ZET6的Flash大小为512KB,所以同样大小的图片最多只能存放三张;如果用外部Flash芯片如16M或者64M大小的,则可以放更多的图片

    const unsigned char gImage_Picture1[153600] = { /* 0X10,0X10,0X00,0XF0,0X01,0X40,0X01,0X1B, */
    0XA4,0X0C,0X93,0XCB,0XA4,0X2D,0XAC,0X8E,0XA4,0X0C,0XA4,0X0C,0XB4,0X8E,0XBC,0XAE,
    0XAC,0X2D,0XBC,0XAE,0XC4,0XEF,0X8B,0X49,0X8B,0X48,0XAC,0X2C,0XC4,0XCE,0XC4,0XAE,
    0XC4,0XCE,0XCC,0XEE,0XC4,0X8D,0XDD,0X50,0XD5,0X50,0XC4,0XAE,0XAB,0XEB,0XC4,0XCE,
    0XCC,0XEF,0XA3,0XEB,0XC4,0XCF,0XEE,0X14,0XD5,0X30,0XBC,0X6D,0XCC,0XCE,0XCC,0XEF,
    
    • 1
    • 2
    • 3
    • 4
    • 5
    TFT_LCD.c

    在前面显示中英文代码基础上增加这个显示图片的函数

    首先同样要设置窗口,然后用switch语句判断图片序号,用一个常量指针指向不同图片序号的图片数组;再逐行写入图片数据

    /**
     * @name   LCD_ShowPicture
     * @brief  LCD屏幕显示图片
     * @param  usXstar:窗口起点x轴坐标
     * 			usYstar:窗口起点y轴坐标
     * 			usPicH:图片的水平分辨率
     * 			usPicV:图片的垂直分辨率
     * 			ucPicNum:图片序号
     * @retval None  
     */
    static void LCD_ShowPicture(uint16_t usXstar,uint16_t usYstar,uint16_t usPicH,uint16_t usPicV,uint8_t ucPicNum)
    {
    	uint32_t uiIndex;
    	const uint8_t * pcPic = NULL;
    	//设置窗口大小
    	LCD_SetWindows(usXstar,usYstar,usPicH,usPicV);
    
    	//获取图像数据首地址
    	switch (ucPicNum)
    	{
    		case 1: pcPic = gImage_Picture1;break;
    		case 2: pcPic = gImage_Picture2;break;
    		case 3: pcPic = gImage_Picture3;break;
    		default: pcPic = gImage_Picture1;break;
    	}
    	
    	//逐行写入图片数据
    	/*
    	因为TFT-LCD屏幕是16位的,即每个像素点的数据是16位,占两个字节,usPicH*usPicV表示图片共有多少个像素点,
    	总共的像素点乘以2就表示图片取模数组里字节的个数,如240*320*2 = 153600
    	*/
    	for(uiIndex=0;uiIndex<usPicH*usPicV*2;uiIndex+=2)
    	{
    		//因为图片取模时是数据高位在前,每次都是写两个字节(16位),所以要将第一个字节左移8位,再或上第二个字节作低8位
    		LCD_WRITE_DATA((pcPic[uiIndex]<<8) | pcPic[uiIndex+1]);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    System.c

    系统运行函数中直接调用TFT_LCD显示图片函数,x,y轴的坐标都是从0开始,传入屏幕的宽240,高320,图片序号为1,烧录代码后便能显示图片,代码量比较大,烧录慢要等待

    /*
    * @name   Run
    * @brief  系统运行
    * @param  None
    * @retval None   
    */
    static void Run()
    {
      TFT_LCD.LCD_ShowPicture(0,0,LCD_WIGHT,LCD_HIGHT,1);             //屏幕显示图片
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    显示效果

    图片1
    在这里插入图片描述
    图片2
    在这里插入图片描述

  • 相关阅读:
    矢量三维电磁铁的技术参数
    centos7下部署oracle 11g
    Java IDEA controller导出CSV,excel
    【CSS】笔记5-定位、网页布局总结、元素显示隐藏
    Request和Response常用方法
    Spring框架—POJO对象模型
    java-php-python-ssm学校图书馆管理系统计算机毕业设计
    JVM-JAVA-类加载过程
    【SAP后台配置】如何通过前台屏幕字段找到对应SPRO后台路径?
    猿创征文| Dcoker实战:Linux环境安装Redis图文教程
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/127832886