KL25、KL26、KL27中,我最喜欢的是KL26开发版。这不仅来自硬件配置,还来自软件资源支持。
别开它与其它板子比起来并不起眼,但基于这块开发板和所提供的例程,能将它打造成一个简单的多媒体开发平台。在前期,曾参考音频播放的例程实现了一个会讲故事的书的小作品,后来受时间的限制,就把后续的功能拓展放下了。前一段又进行了一点拓展,就是利用板载的SD卡来存放图像文件,并借助例程中的文件管理功能来读取图像文件,进而再通过数据的格式转换,由串口TFT显示屏再现图像内容。
在实现图像显示功能前,实现借助串口图像进行了图片文件的读取测试,经实验发现在读取文件过程中,对不同品牌的SDHC卡是存在一定区别的,有些卡是读不出信息,需精心挑选。图1是一个读取成功的界面,从中可以看到该图像文件的名称为1.BMP,其文件大小为230454个字节。从“42 4d 36 ...”开始是图像文件的参数信息,54字节后才是图像数据。
图1 读取1.BMP位图文件
图2 借助WinHEX进行对比
提取图像文件参数的函数如下:
[C] 纯文本查看 复制代码
?
010203040506070809101112BMP_HEADER TFTBMpGetHeadInfo(uint8_t *buf)
{
BMP_HEADER bmpHead;
bm = (buf[0] << 8) + buf[1];
// BM
bm = (buf[5]<<24) + (buf[4]<<16) + (buf[3]<<8) + buf[2];
// 文件大小
bm = (buf[21]<<24) + (buf[20]<<16) + (buf[19]<<8) + buf[18];
// 图像宽度
bm = (buf[25]<<24) + (buf[24]<<16) + (buf[23]<<8) + buf[22];
// 图像高度
bm = (buf[29] << 8) + buf[28];
// 每个像素的位数,单色位图为1,256色为8,16bit为16, 24bit为24
return
bmpHead;
}
其数据存放缓冲区及其数据结构的定义如下:
[C] 纯文本查看 复制代码
?
01020304050607080910unsigned
char
Buffer[2048];
//2k缓冲区
//bmpHead
typedef
struct
{
uint16 bfType;
// 说明文件类型,在windows系统中为BM
uint32 bfSize;
// 说明文件大小
uint32 biWidth;
// 说明图像宽度
uint32 biHeight;
// 说明图像高度
uint16 biBitCount;
// 每个像素的位数,单色位图为1,256色为8,16bit为16, 24bit为24
}BMP_HEADER;
进行16位色彩格式转换的函数为:
[C] 纯文本查看 复制代码
?
1234unsigned
int
bmp_555to565(unsigned
int
dat)
{
return
(unsigned
int
)(((dat&0x7c00)<<1)|((dat&0x03e0)<<1)|(dat&0x001f));
}
进行24位色彩格式转换的函数为:
[C] 纯文本查看 复制代码
?
1234unsigned
int
bmp_24to565(uint8_t r,uint8_t g,uint8_t b)
{
return
(((unsigned
int
)(r>>3)<<11)|((unsigned
int
)(g>>2)<<5)|((unsigned
int
)b>>3));
}
经图像文件的显示测试,其效果如3所示。整体的线路构成则如图4所示,在此基础上要实现数码相框的功能也就十分方便了。后面有时间的话,再将读取文件字库的功能补充上,到时显示中文的文本信息就不再困难了,集文字、图像、音频的多媒体播放平台将发挥其潜能。
图3 位图显示效果
图4 整体构成