前言
FAT系统是当前广泛使用的读写sd卡和U盘等存储设备的轻量文件系统,本文介绍如何使用fat读取sd卡的bmp文件并实现lcd显示。
一、fat和bmp是什么?
如前言所述,fat为一轻量级文件系统,广泛用于读取外部存储设备。bmp为图片的一种格式,一个合格的计算机学者应当任何时候都应该了解任何多媒体文件以及计算机上的任何东西在硬件上其实都是0101二进制码,因此图片的本质也就是一串很长的二进制码而已,所以所谓对图片的解码就是拿到图片的二进制码然后放到屏幕上显示而已。
二、使用步骤
1.引入库
FAT为一个通用的lib库,学者可自行查找使用,重点是要学会其中库函数的使用。
FAT lib库
其中该库中几个重点函数的使用掌握了基本上可以解决大部分读写需求。
f_mount(&fs,“0:”,1); //挂载,0代表为SD卡
f_open(&file, filename, FA_READ|FA_OPEN_ALWAYS); //打开文件
f_read(&file, header, 54, &Br); //读取文件内容,54字节为bmp图片格式文件投信息
其他函数学者可自行查阅相关资料和到库函数中查看相关源码逻辑。
2.读取BMP格式数据并解析
代码如下:
//读取 BMP 文件头
unsigned char header[54];
res = f_read(&file, header, 54, &Br);
if(res == FR_OK)
{
printf("SD卡文件读取成功!\r\n");
}
printf("header文件读取成功!内容为:%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x \r\n",
header[0],header[1],header[2],header[3],header[4],header[18],header[19],header[20],header[21]);
// 解析 BMP 信息头
int width = *(int*)&header[18];
int height = *(int*)&header[22];
int bitCount = *(short*)&header[28];
printf("width, height,%02x,%02x \r\n", width,height);
其中文件头的第18,19,20,21字节代表图片的宽渡,22,23,24,25代表图片的高度,前5个字节,即第0,1,2,3,4字节代表图片的格式和格式版本。
bitCount代表图片中每个像素需要占的字节数,大多数都是24位,因此屏的显示像素如果是RGB565,还需要把24位转为16位的像素占位数来显示。
//24位色转18位色
#define RGB565(r, g, b) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3))
将得到的rgb565位色送屏显示,即可显示出对应的bmp格式图片。
总结
这个小功能的实现本身不难,主要在于对于FAT和bmp格式数据的熟悉,从而可以实现bmp格式图片到单片机屏幕上的显示。