TFT-LCD屏幕上精彩图片的美景

TFT-LCD屏幕显示图片

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

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

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

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

输出数据类型选择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,

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]);
	}
}

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

物联沃分享整理
物联沃-IOTWORD物联网 » TFT-LCD屏幕上精彩图片的美景

发表评论