小学生
最后登录1970-1-1
在线时间 小时
注册时间2017-10-17
|
咨询求助:
问题描述: 使用野火3.2寸液晶显示屏,不能正常显示图片。
硬件环境: STM32F103VCT6 +野火3.2寸显示屏 (STM32 配置成为FSMC工作模式)
软件环境: MDK4.74
具体测试过程:
1. STM32F103配置成为FSMC模式,显示屏能够正常显示单色。
2. 参考网站上提供的“22、FSMC-液晶屏显示BMP图片”例程上进行修改,由于硬件设计上没有配置SD卡,配置了SPI NorFlash要用于存储其他数据,没有用文件系统。
通过软件将bmp源文件数据格式读取出来,形成一个数组数据,保存为.h文件加入工程中(图标很小,所以形成的数据量少)
3. 修改后显示屏能够正常显示16*16的英文字符。
4. 刷图片则不能正确显示,图片大小是正确的,但内容一团乱麻。我确保源文件内容正确,因为BMP格式分析上的数据都可以对应上。
5. 麻烦前辈们指点指点。
6. 主要修改如下函数。
void Lcd_show_bmp(unsigned short int x, unsigned short int y)
{
int i, j, k;
int width, height, l_width;
BYTE red,green,blue;
BITMAPFILEHEADER bitHead;
BITMAPINFOHEADER bitInfoHead;
WORD fileType;
u8 *p;
unsigned int read_num;
unsigned char tmp_name[20];
unsigned int a=0;
rt_uint32_t b=0;
u32 len=0;
/*-------------------------------------------------------------------------------------------------------*/
//BMP_DEBUG_PRINTF("Open file success\r\n");
/* 读取文件头信息 两个字节*/
//f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num); //注释掉文件读取函数,直接取数据
rt_memcpy(&fileType,&gImage_output1[0],sizeof(WORD));
/* 判断是不是bmp文件 "BM" 2字节*/
if(fileType != 0x4d42)
{
BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
return;
}
else
{
BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");
}
/* 读取BMP文件头信息,12字节*/
// f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num); //注释掉文件读取函数,直接取数据
rt_memcpy(&bitHead,&gImage_output1[2],sizeof(tagBITMAPFILEHEADER));
showBmpHead(&bitHead);
/* 读取位图信息头信息 ,40字节*/
//f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num); //注释掉文件读取函数,直接取数据
rt_memcpy(&bitInfoHead,&gImage_output1[2+12],sizeof(BITMAPINFOHEADER));
showBmpInforHead(&bitInfoHead);
// b=53;
//
///*-------------------------------------------------------------------------------------------------------*/
width = bitInfoHead.biWidth;
height = bitInfoHead.biHeight;
/* 计算位图的实际宽度并确保它为32的倍数 */
l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);
if(l_width > 960)
{
BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
return;
}
//
/* 设置Lcd Gram 扫描方向为: 右下角->左上角 */
Lcd_GramScan( 3 );
/* 开一个图片大小的窗口*/
LCD_OpenWindow(x, y, width, height);
/* 判断是否是24bit真彩色图 */
if(bitInfoHead.biBitCount >= 24)
{
for(i=0;i< height; i++)
{
/* 读取一行bmp的数据到数组pColorData里面 */
#if 0
for(j=0; j< l_width; j++)
{
// f_read(&bmpfsrc,pColorData+j,1,&read_num);
a=1;
}
#elif 1
//f_read(&bmpfsrc,pColorData,l_width/2,&read_num);
//f_read(&bmpfsrc,pColorData+l_width/2,l_width/2,&read_num);
rt_memcpy(pColorData,&gImage_output1[b+i*width],l_width);
//j=a;
#else
//f_read(&bmpfsrc,pColorData,l_width,&read_num);
//a=j;
#endif
for(j=0; j<width; j++) //一行有效信息
{
k = j*3; //一行中第K个像素的起点
red = pColorData[k+2];
green = pColorData[k+1];
blue = pColorData[k];
LCD_WR_Data(RGB24TORGB16(red,green,blue)); //写入LCD-GRAM
}
}
}
else
{
BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 24BITS REAL COLOR");
return ;
}
//f_close(&bmpfsrc);
}
|
|