bf518控制AT070TN83 V.1液晶显示屏显示图片
上面搞定了color bar,接下来搞图片了。呵呵。
找了好多资料都是搞480x272的屏,7寸的资料好少。只能自己搞了。
下面开始吧。
所有初始化和前期的准备工作都和之前的一样,这里就不在重复了。其实显示图片和 color bar的原理是一样的,只不过color bar是自己建立的数组拼接的数据,图片是从外部读进来的数据。可以参考我论坛中的另一篇《bf518控制AT070TN83 V.1的7寸液晶显示屏代码及总结说明》
先定义个数组用于存放数据
section("MEM_SDRAM0_BANK0") unsigned char Inputdata[480*800*3+54];//图片文件读入缓冲
fp = fopen("../1.bmp", "rb");
fread(Inputdata, 1, 480*800*3+54, fp);//bmp图像数据有54个字节的头信息,fread函数读出来为BGR顺序
fclose(fp);
这样,bmp格式的图片数据就被读到Inputdata[]中了。每个像素点为3个字节数据,按BGR888顺序存储。
按照正常的数据处理方法,一般都把读出来的BGR数据转换成RGB格式然后在进行处理,但由于我的电路设计时,已经按照BGR顺序设计了,就跳过了转换这部分。
---------------------------------------------------------
如果有需要转换的,可以参照下面方法进行转换,这是一个480x272的转换例子。
void bgrtorgb24(void)
{
int i,j;
int a,b,c;
for(i=0;i<272;i++)
{
for(j=0;j<1440;j++)
{
TempBuffer_img[i][j] = Inputdata[i*1440+j+54];
}
}
for(i=0;i<272;i++)
{
for(j=0;j<480;j++)
{
a = TempBuffer_img[i][j*3];
b = TempBuffer_img[i][j*3+1];
c = TempBuffer_img[i][j*3+2];
TempBuffer_img[i][j*3] = c;
TempBuffer_img[i][j*3+1] = b;
TempBuffer_img[i][j*3+2] = a;
}
}
}
---------------------------------------------------------------------------------
为了方便处理,先把数据按照我需要的格式传递到二维数据中
section("MEM_SDRAM0_BANK0") unsigned char DisplayBuffer_BGR888[480][800*3];
for(i=0;i<480;i++)//缓冲数据读取到BGR888[]中
{
for(j=0;j<800*3;j++)
{
DisplayBuffer_BGR888[i][j] = Inputdata[i*2400+j+54];
}
}
接下来需要做的就是将BGR888转成BGR565.
for(i=0;i<480;i++)//转换为BGR565写入DisplayBuffer
{
for(j=0;j<800;j++)
{
DisplayBuffer_tmp[i][j] = DisplayBuffer_BGR888[i][j*3] & 0xF8;//B
DisplayBuffer_tmp[i][j] |= (DisplayBuffer_BGR888[i][j*3+1] >> 5) & 0x07;//GH
DisplayBuffer_tmp[i][j] = (DisplayBuffer_tmp[i][j] << 8) + ((DisplayBuffer_BGR888[i][j*3+1] << 3)& 0xe0);//GL
DisplayBuffer_tmp[i][j] |= (DisplayBuffer_BGR888[i][j*3+2] >> 3) & 0xF8;//R
}
}
转换完成后的图像在液晶上显示出来是上下翻转的,还需要进行一次处理。
for(i=0;i<480;i++)
{
for(j=0;j<800;j++)
{
DisplayBuffer[i+22][j] = DisplayBuffer_tmp[479-i][j];//图像上下翻转
}
}
这样,就得到了BGR565格式的数据,将DisplayBuffer[][]直接发送到液晶上显示出来就可以了。
有了之前做color bar的经验,做这一步可以说是比较简单的了。
chris ma 于2011年7月25日
QQ:5797378