|
第16课 TFT LCD显示图片
硬件准备:
端口配置:
硬件连接:
PB0-PB7---DB0-DB7 低8位
PC0-PC7---DB8-DB7 高8位
PD2---WR PC12---RD PC11---CS PC10---RS PB11---CM
其中WR :写信号输入引脚,低电平时有效。
RD :读信号输入引脚,低电平时有效。
CS:TFT液晶屏的片选信号,低电平时有效。
RS:写数据和写命令选择引脚。取高写数据,取低写命令。
CM:选择8BIT和16BIT选择引脚。
软件准备:
由于f051的内存非常小,我们采用SD卡存储一个图片文件进行显示,这个工程的树建立如下:
我们需要编写一个读取图片的函数,为了简便,只写了读取BMP文件的读取函数。BMP 文件格式,又称为 Bitmap(位图)或是 DIB(Device -Independent D evice,设备无关位图),是Windows 系统中广泛使用的图像文件格式。
BMP 文件可以保存单色位图、16色或256 色索引模式像素图、24位真彩色图象,每种模式种单一像素的大小分别为 1/8 字节,1/2 字节,1 字节和3 字节。
我们设计显示 BMP 。这种文件格式还定义了像素在开始处有一个文件头,大小为54字节。保存了包括文件格式标识、颜色数、图象大小、压缩方式等信息,图象的宽度和高度都是一个 32位整数,在文件中的地址分别为 0x0012和0x0016。54个字节以后,如果是16色和256位色BMP ,则还有一个颜色表,但24位色BMP 没有这个。因此我们大体需要编写两个函数,首先是读取BMP头文件信息,代码如下,这个代码是直接从网上移植过来的:
[c]
BMP_HEADER TFTBmpGetHeadInfo(uint8_t *buf){ BMP_HEADER bmpHead;
bmpHead.bfType = (buf[0] << 8) + buf[1]; // BM bmpHead.bfSize = (buf[5]<<24) + (buf[4]<<16) + (buf[3]<<8) + buf[2]; // 文件大小 bmpHead.biWidth = (buf[21]<<24) + (buf[20]<<16) + (buf[19]<<8) + buf[18]; // 图像宽度 bmpHead.biHeight = (buf[25]<<24) + (buf[24]<<16) + (buf[23]<<8) + buf[22];// 图像高度 bmpHead.biBitCount = (buf[29] << 8) + buf[28]; // 每个像素的位数,单色位图为1,256色为8,16bit为16, 24bit为24 return bmpHead;}
[/c]
然后对图像文件进行扫描:
[c]
uint8_t TFTBmpDisplay(uint8_t *bmpName,uint16_t x,uint16_t y){ FATFS fs; // 建立文件系统 FIL file; // 建立文件 UINT br; // 字节计数器 FRESULT res; // 返回值信息 BMP_HEADER bmpHead; // 头信息 uint16_t i;
f_mount(0, &fs); // 挂载文件系统 res = f_open(&file, (const TCHAR *)bmpName, FA_OPEN_EXISTING|FA_READ); // 打开BMP文件并读取到file中 if(res != FR_OK) { return res; } else { res = f_read(&file, Buffer, 54, &br); // 读取头文件信息 if(res != FR_OK) { return res; // 返回错误表示 } else { bmpHead = TFTBmpGetHeadInfo(Buffer); // 获取头信息
&nbsp;
if (bmpHead.bfType == 0x424D) // 判断是否为BMP图像 { LCD_WR_REG_DATA(0x0003, 0x1010); // 由下而上显示 LCD_XYRAM(x, y, x+bmpHead.biWidth-1, y+bmpHead.biHeight-1); LCD_WR_REG_DATA(0x0020,x);//设置X坐标位置 LCD_WR_REG_DATA(0x0021,y+bmpHead.biHeight-1);//设置Y坐标位置(注意:在由下而上显示的时候,这里y坐标应该是最下边的值) LCD_WR_REG(0x0022); //指向RAM寄存器,准备写数据到RAM while(1) { res = f_read(&file, Buffer, 240, &br); //读取240个数据 if(res||br==0) //错误跳出 break; for(i=0;i<80;i++) { // 在TFT上显示一个像素点的颜色 LCD_WR_DATA(((Buffer[i*3+2]/8)<<11 | (Buffer[i*3+1]/4)<<5 |(Buffer[i*3]/8))); }
[/c]
以上代码来自网络,移植到STM32F0上可行,特此声明。
因此对图像扫描显示后就可以在主函数中调用显示了:
[c]
num = FileScan("picture"); // 扫描picture文件 if(num>50)num = 50; // 最多50个文件 strcpy((char *)tempPath, "picture/"); // 把文件名路径给了tempPath暂存
while(1) {for(i=0; i<num; i++) // 循环扫描文件得到哪个是BMP文件 { if(flag == 1) // 检测如果是BMP图片 { strcpy((char *)(filePath), (char *)(tempPath)); strcat((char *)filePath, (char *)(FileN)); TFTBmpDisplay((uint8_t*)filePath,0,0); // 显示出来图片 delay(10); delay(10); delay(10); delay(10); delay(10); } }}
[/c]
实验下载现象:
显示照片如下:
|
|