在操作SD卡的时候,读取到BMP文件的内容要先释放到一个数组空间里,这个空间大小要设定好,否则会出莫名奇妙的问题。 BMP图片的文件名不能太长,否则无法读取,这个应该是Fatfs的问题,没有具体测试是几个,但是不能超过10个英文字母(包括10个)。 显示的格式要实现调整好,像我这块屏是320*240的,事先用画图进行修改好,他们的尺寸值要是8的倍数,否则读取时会出错。下面是修改的方法,(估计大家都会,就是怕自己忘记了),见下图。 下面就是把代码贴出来,这个代码只是移植成功了,但是BMP文件的格式没有去细致了解,中间一部分代码没有去深入的探究其原因。
C语言:
#include "TFCard_BMP.h"
/*==================================================================
用到的变量及宏定义
==================================================================*/
BMP_HEAD bmp; //图片文件头
BMP_POINT point;
/*==================================================================
* Function : RGB888ToRGB565
* Description : 把24位图变成16位图
* Input Para : unsigned char r , unsigned char g , unsigned char b
* Output Para : void
* Return Value: 颜色值
==================================================================*/
u32 RGB888ToRGB565(unsigned char r , unsigned char g , unsigned char b)
{
return (u32) (r & 0xF8) << 8 | (g & 0xFC) << 3 | (b & 0xF8) >> 3;
}
/*==================================================================
* Function : DrawPixel
* Description : 画点函数,在TFT的某一点上画一个颜色点
* Input Para : unsigned int x , unsigned int y , int Color ===》 x坐标,y坐标,颜色值
* Output Para : void
* Return Value: void
==================================================================*/
void DrawPixel(unsigned int x , unsigned int y , int Color)
{
LCD_SetGramPoint(x,y);
LCD_WR_Data(Color);
}
/*==================================================================
* Function : Show_BMP
* Description : 显示BMP格式的文件,分为图片和图标,图片尺寸是240*320是完全显示,图标只显示内容,其他白色的部分维持原来的颜色
* Input Para : unsigned char type , unsigned int point_x , unsigned int point_y , char *path
===》 显示的类型:PCITURE图片,ICON图标 ,x轴起始点 ,y轴起始点 ,图片在SD卡里的路径
* Output Para : void
* Return Value: void
==================================================================*/
void Show_BMP( unsigned char type , unsigned int point_x , unsigned int point_y , char *path )
{
FATFS fs; // 磁盘挂载点
FIL fil; // 文件打开点
FRESULT res; // 返回值类型结构体
//unsigned char buffer[4096*4]; // file copy buffer
unsigned char buffer[50000]; // 这个数组和堆栈空间大小直接相关
unsigned int br; // File R/W count
unsigned long tx,ty,r_data,g_data,b_data;
disk_initialize(0); // 初始化磁盘
res = f_mount(0,&fs); // 挂载设备
while(1)
{
res = f_open(&fil , path , FA_OPEN_EXISTING | FA_READ); // 读取图标路径
res = f_read(&fil , &bmp , sizeof(bmp),&br); // 读取文件
if((bmp.pic_head[0]=='B')&&(bmp.pic_head[1]=='M')) // 判断是不是BMP文件
{
res = f_lseek(&fil , ((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l)); // 采用了Windows的BMP格式,BMP原点在左下角
for(ty=0;ty<bmp.pic_h_l;ty++)
{
res = f_read(&fil , buffer , (bmp.pic_w_l)*3 , &br) ;
for(tx=0;tx<bmp.pic_w_l;tx++)
{
r_data = *(tx*3 +2+buffer);
g_data = *(tx*3 +1+buffer);
b_data = *(tx*3 +0+buffer);
if(tx<240)
{
point.x = tx;
point.y = bmp.pic_h_l -1 -ty;
point.r = r_data;
point.g = g_data;
point.b = b_data;
if(type == PICTURE) // 如果显示的是图片的话,白色部分照常显示
{
DrawPixel(point.x + point_x,point.y + point_y,RGB888ToRGB565(point.r,point.g,point.b));
}
else if(type == ICON) // 如果显示的是图标的话,白色部分不显示
{ // 以下代码根据 DrawPixel() 函数更改增加
LCD_SetGramPoint( point.x+point_x , point.y+point_y ); // 设定x轴,y轴的坐标
if(RGB888ToRGB565(point.r,point.g,point.b) == 0xFFFF) // 判断是不是白色部分
{
LCD_WR_Data( ili9320_BGR2RGB(LCD_RD_data()) ); // 如果是白色就读取当前颜色值并显示
}
else
{
LCD_WR_Data( RGB888ToRGB565(point.r,point.g,point.b) ); // 如果不是白色就显示ICON的颜色
}
}
}
}
}
f_close(&fil); // 关闭文件
f_mount(0,NULL); // 卸载设备
break; // 跳出while(1)
} // End of if((bmp.pic_head....
} // End of while(1)....
} // End of void Show_BMP(....
有什么错误或者不对的地方欢迎大家批评指正。