stm32f051系列教程 TFT LCD显示图片

   TFT LCD显示图片

 

我们需要编写一个读取图片的函数,为了简便,只写了读取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头文件信息,代码如下,这个代码是直接从网上移植过来的:

1
2
3
4
5
6
7
8
9
10
11
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;
}

然后对图像文件进行扫描:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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)));
  }

以上代码来自网络,移植到STM32F0上可行,特此声明。

因此对图像扫描显示后就可以在主函数中调用显示了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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[i] == 1) // 检测如果是BMP图片
  {
  strcpy (( char *)(filePath), ( char *)(tempPath));
  strcat (( char *)filePath, ( char *)(FileN[i]));
  TFTBmpDisplay((uint8_t*)filePath,0,0); // 显示出来图片
  delay(10);
  delay(10);
  delay(10);
  delay(10);
  delay(10);
  }
  }
}

实验下载现象:

显示照片如下:



http://www.eeboard.com/tutorials/%E9%9D%92%E9%A3%8Estm32f051%E6%95%99%E7%A8%8B%E7%AC%AC16%E8%AF%BEtft-lcd%E6%98%BE%E7%A4%BA%E5%9B%BE%E7%89%87/

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值