野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18332|回复: 5

请教在 2.4 寸 TFT 上显示内部 FLASH 图片的方法

[复制链接]
发表于 2013-12-9 11:34:30 | 显示全部楼层 |阅读模式
本帖最后由 PSIR 于 2013-12-9 13:36 编辑

Image2lcd_Setting.jpg

TFT-LCD 规格:2.4寸
驱动IC:ILI9341
硬体接线:TFT 模组的 D15~D0 接到一个 16bit 的 I/O PORT 的 D15~D0

各位好:

ILI9341 的初始化以及画点画线等相关函数都已经完成了,现在想在屏幕上显示如上图的一张图片,
大小是 85 × 113,16 位彩色,其余选项如图面上的设定。
转出来的点阵数据为:85 × 113 × 2(16BPP) = 19120 + 8个Byte的影像头数据 = 19218 个元素如下所示:

const unsigned char gImage_flower16bit_H[19218] = {
0X00,0X10,0X55,0X00,0X71,0X00,0X01,0X1B,        //8个Byte的影像头数据
         ..............................
};

我的问题是,当有包含 8 个Byte的影像头数据时,这段循环查表的程式要怎么写?

假设我已经对 ILI9341 设置好一个 85 × 113 的显示范围,
我该怎么顺序抓取资料才能让点阵数据在屏幕上正确显示?
因为我的资料输出是 16 位元,而点阵数据是 8 位元一组,
这意味着我必须抓两次 8 位元合成一个 16 位元来显示一个点的颜色值,
能否给我指导我一下具体的程式写法,谢谢。
回复

使用道具 举报

发表于 2013-12-9 13:29:43 | 显示全部楼层
绕过 8 个Byte 就而已。

参考我们提供的 显示函数。flash 和 sd 卡都是存储,与显示无关的。

配置 成 RGB565 格式 就好了,然后 用 16位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-9 14:43:53 | 显示全部楼层
山外メ雲ジ 发表于 2013-12-9 13:29
绕过 8 个Byte 就而已。

参考我们提供的 显示函数。flash 和 sd 卡都是存储,与显示无关的。

能否再具体说明一下,例如写段 for 循环的代码解释该如何取资料?谢谢。
回复 支持 反对

使用道具 举报

发表于 2013-12-9 14:53:36 | 显示全部楼层
PSIR 发表于 2013-12-9 14:43
能否再具体说明一下,例如写段 for 循环的代码解释该如何取资料?谢谢。

具体的使用说明,可以直接看我们的 例程。

例如这个 SD卡显示的(读取代码方式跟 flash 不一样而已,写液晶操作是一样的)
  1. /******************************************************
  2. * 函数名:Lcd_show_bmp
  3. * 描述  :LCD显示RGB888位图图片
  4. * 输入  : x                                        --显示横坐标(0-319)
  5.            y                                        --显示纵坐标(0-239)   
  6. *                                 pic_name                --图片名称
  7. * 输出  :无
  8. * 举例  :Lcd_show_bmp(0, 0,"/test.bmp");
  9. * 注意  :图片为24为真彩色位图图片
  10.                                          图片宽度不能超过320
  11.                                          图片在LCD上的粘贴范围为:纵向:  [x,x+图像高度]   横向 [Y,Y+图像宽度]
  12.                                          当图片为320*240时--建议X输入0  y输入0
  13. *********************************************************/   
  14. void Lcd_show_bmp(unsigned short int x, unsigned short int y,unsigned char *pic_name)
  15. {
  16.     int i, j, k;
  17.     int width, height, l_width;
  18.                   
  19.     BYTE red,green,blue;
  20.     BITMAPFILEHEADER bitHead;
  21.     BITMAPINFOHEADER bitInfoHead;
  22.     WORD fileType;

  23.     unsigned int read_num;
  24.     unsigned char tmp_name[20];
  25.     sprintf((char*)tmp_name,"0:%s",pic_name);
  26.     f_mount(0, &bmpfs[0]);

  27.         BMP_DEBUG_PRINTF("file mount ok \r\n");
  28.    
  29.     bmpres = f_open( &bmpfsrc , (char *)tmp_name, FA_OPEN_EXISTING | FA_READ);
  30.     Set_direction(0);

  31.     if(bmpres == FR_OK)
  32.     {
  33.         BMP_DEBUG_PRINTF("Open file success\r\n");
  34.         
  35.         //读取位图文件头信息        
  36.         f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);     
  37.         
  38.         if(fileType != 0x4d42)
  39.         {
  40.             BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
  41.             return;
  42.         }
  43.         else
  44.         {
  45.             BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");       
  46.         }        
  47.         
  48.         f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);   
  49.         
  50.         showBmpHead(&bitHead);
  51.         BMP_DEBUG_PRINTF("\r\n");
  52.         
  53.         //读取位图信息头信息
  54.         f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);        
  55.         showBmpInforHead(&bitInfoHead);
  56.         BMP_DEBUG_PRINTF("\r\n");
  57.     }   
  58.     else
  59.     {
  60.         BMP_DEBUG_PRINTF("file open fail!\r\n");
  61.         return;
  62.     }   
  63.    
  64.     width = bitInfoHead.biWidth;
  65.     height = bitInfoHead.biHeight;
  66.    
  67.     l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);                //计算位图的实际宽度并确保它为32的倍数            
  68.    
  69.     if(l_width>960)
  70.     {
  71.         BMP_DEBUG_PRINTF("\nSORRY, PIC IS TOO BIG (<=320)\n");
  72.         return;
  73.     }
  74.    
  75.     if(bitInfoHead.biBitCount>=24)
  76.     {

  77.         bmp_lcd(x,240-y-height,width, height);                                                                                                                                        //LCD参数相关设置

  78.         for(i=0;i<height+1; i++)
  79.         {       
  80.             
  81.             for(j=0; j<l_width; j++)                                                                                                                 //将一行数据全部读入
  82.             {
  83.                
  84.                 f_read(&bmpfsrc,pColorData+j,1,&read_num);
  85.             }            
  86.             
  87.             for(j=0;j<width;j++)                                                                                                                                 //一行有效信息
  88.             {
  89.                 k = j*3;                                                                                                                                                                //一行中第K个像素的起点
  90.                 red = pColorData[k+2];
  91.                 green = pColorData[k+1];
  92.                 blue =         pColorData[k];
  93.                 LCD_WR_Data(RGB24TORGB16(red,green,blue));                //写入LCD-GRAM
  94.             }            
  95.         }
  96.         bmp_lcd_reset();                                                                                                                                                                                                         //lcd扫描方向复原                
  97.     }   
  98.     else
  99.     {        
  100.         BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
  101.         return ;
  102.     }
  103.    
  104.     f_close(&bmpfsrc);   
  105. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-10 16:37:40 | 显示全部楼层
unsigned short send_H;
unsigned short send_L;
unsigned long size;
unsigned long temp=19120;  //85 × 113 × 2(16BPP)

for(size=0;size<temp;size++){
  send_H=gImage_flower16bit_H[size]; send_H<<=8;        //移到Hi Byte
  send_L=gImage_flower16bit_H[++size];
  LCD_WR_DATA( send_H | send_L );
}
----------------------------------------------------
我将8个Byte的影像头数据去掉并写了一小段程式测试,
这样写就行了,不过 Image2lcd 的设定要改成「高位在前」,
我也不知道什麼原因,欢迎大神指导。
回复 支持 反对

使用道具 举报

发表于 2013-12-10 16:45:58 | 显示全部楼层
PSIR 发表于 2013-12-10 16:37
unsigned short send_H;
unsigned short send_L;
unsigned long size;

因为你的代码就是配置为 高在前
  1. send_H=gImage_flower16bit_H[size]; send_H<<=8;        //移到Hi Byte
  2.   send_L=gImage_flower16bit_H[++size];
复制代码
可以直接用 16位 变量指针 来读取,这样效率更高。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-17 09:44 , Processed in 0.029658 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表