专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
BMP解码图片显示异常,求助下各位
2019-07-20 21:58
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
8454
9
1113
因为手上有一块2.4寸SPI(RGB 6-6-6)接口的显示屏,因为只显示BMP图片,也不需要像例程中对RGB做处理,所以把代码阉割了下,调试后终于显示出来了,但是显示的图片在中间有一长串锯齿状图案如下图:
原图跟代码我附在2楼,请各位大神帮忙看看!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
神奇的蛋蛋
2019-07-21 00:25
[mw_shl_code=c,true]bmpinfo BmpInfoX;
uint8_t bmpDecode(uint8_t *picname)
{
FIL *bmpFile;
FRESULT status;
//BMPINFOX *pbmptemp;
BMPINFOHEADERX bmpinfoheadx;
BMPFILEHEADERX bmpfileheadx;
uint8_t cnt;
uint8_t bitcount;
uint8_t bittype;
uint8_t *databuff;
uint8_t bmpbuff[3];
uint16_t i,j,k;
printf(" ×¼±¸½âÂëBMPͼƬ");
databuff = (uint8_t *)Malloc(LCD_WIDTH*3);
if(!databuff) return PIC_MEM_ERR;
bmpFile=(FIL *)Malloc(sizeof(FIL));
if(!bmpFile)
{
MemoryFree(databuff);
return PIC_MEM_ERR;
}
printf(" ÄÚ´æ·ÖÅä³É¹¦");
status = f_open(bmpFile,(const TCHAR *)picname,FA_READ|FA_OPEN_EXISTING);
if(status==FR_OK)
{
status = f_read(bmpFile,&bmpfileheadx,sizeof(BMPFILEHEADERX),(UINT *)&cnt);
if(status!=FR_OK) return PIC_READ_ERR;
status = f_read(bmpFile,&bmpinfoheadx,sizeof(BMPINFOHEADERX),(UINT *)&cnt);
if(status!=FR_OK) return PIC_READ_ERR;
bitcount =bmpfileheadx.bfOffBits;
bittype = bmpinfoheadx.biBitCount/8;
BmpInfoX.bmpWidth = bmpinfoheadx.biWidth;
BmpInfoX.bmpHeight = bmpinfoheadx.biHeight;
printf(" Æ«ÒÆÁ¿=%d",bitcount);
printf(" ͼÏñÀàÐÍ=%d",bittype);
printf(" ͼÏñ¸ß¶È=%d",BmpInfoX.bmpHeight);
printf(" ͼÏñ¿í¶È=%d",BmpInfoX.bmpWidth);
if((BmpInfoX.bmpWidth*bittype)%4) BmpInfoX.index = ((BmpInfoX.bmpWidth*bittype)/4+1)*4;
else BmpInfoX.index = BmpInfoX.bmpWidth*bittype;
printf(" ͼÏñʵ¼Ê¿í¶È=%d",BmpInfoX.index);
if(bittype >= 3)
{
printf(" ͼÏñÊÇ24λÕæ²Êͼ");
for(i=0;i<LCD_HEIGHT; i++)
{
if(LCD_WIDTH>BmpInfoX.bmpWidth)
{
printf(" ÆÁÄ»¿í¶È´óÓÚͼƬ¿í¶È");
f_read(bmpFile,databuff,BmpInfoX.index,(UINT *)&cnt);
for(j=cnt;j<LCD_WIDTH*3;j++)
{
databuff[j]=0x00;
}
}
else
{
f_read(bmpFile,databuff,LCD_WIDTH*3,(UINT *)&cnt);
if(LCD_WIDTH*3!=BmpInfoX.index)
{
printf(" ÆÁÄ»¿í¶ÈСÓÚͼƬ¿í¶È");
f_lseek(bmpFile,bitcount+(i+1)*BmpInfoX.index);
}
}
for(k=0;k<LCD_WIDTH;k++)
{
// printf("databuff[k]=0x%02x",databuff[j]);
bmpbuff[2]=databuff[k*3]; //B
bmpbuff[1]=databuff[k*3+1]; //G
bmpbuff[0]=databuff[k*3+2]; //R
LCDFastDrawPoint(k,i,bmpbuff);
//printf(" k=%d",k);
}
//printf(" i=%d",i);
}
f_close(bmpFile);
}
}
else
return PIC_OPEN_ERR;
MemoryFree((uint32_t *)databuff);
MemoryFree(bmpFile);
return 0;
}
void LCDFastDrawPoint(uint16_t x,uint16_t y,uint8_t *data)
{
SetWindow(x,y,1,1);
Zebra_SPI_RegWR(0x2C);
SPI_Prepare();
Zebra_SPI_RGBWR(data[0]);
Zebra_SPI_RGBWR(data[1]);
Zebra_SPI_RGBWR(data[2]);
// SetWindow(0,0,320,240);
}
[/mw_shl_code]
加载中...
查看其它9个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
uint8_t bmpDecode(uint8_t *picname)
{
FIL *bmpFile;
FRESULT status;
//BMPINFOX *pbmptemp;
BMPINFOHEADERX bmpinfoheadx;
BMPFILEHEADERX bmpfileheadx;
uint8_t cnt;
uint8_t bitcount;
uint8_t bittype;
uint8_t *databuff;
uint8_t bmpbuff[3];
uint16_t i,j,k;
printf(" ×¼±¸½âÂëBMPͼƬ");
databuff = (uint8_t *)Malloc(LCD_WIDTH*3);
if(!databuff) return PIC_MEM_ERR;
bmpFile=(FIL *)Malloc(sizeof(FIL));
if(!bmpFile)
{
MemoryFree(databuff);
return PIC_MEM_ERR;
}
printf(" ÄÚ´æ·ÖÅä³É¹¦");
status = f_open(bmpFile,(const TCHAR *)picname,FA_READ|FA_OPEN_EXISTING);
if(status==FR_OK)
{
status = f_read(bmpFile,&bmpfileheadx,sizeof(BMPFILEHEADERX),(UINT *)&cnt);
if(status!=FR_OK) return PIC_READ_ERR;
status = f_read(bmpFile,&bmpinfoheadx,sizeof(BMPINFOHEADERX),(UINT *)&cnt);
if(status!=FR_OK) return PIC_READ_ERR;
bitcount =bmpfileheadx.bfOffBits;
bittype = bmpinfoheadx.biBitCount/8;
BmpInfoX.bmpWidth = bmpinfoheadx.biWidth;
BmpInfoX.bmpHeight = bmpinfoheadx.biHeight;
printf(" Æ«ÒÆÁ¿=%d",bitcount);
printf(" ͼÏñÀàÐÍ=%d",bittype);
printf(" ͼÏñ¸ß¶È=%d",BmpInfoX.bmpHeight);
printf(" ͼÏñ¿í¶È=%d",BmpInfoX.bmpWidth);
if((BmpInfoX.bmpWidth*bittype)%4) BmpInfoX.index = ((BmpInfoX.bmpWidth*bittype)/4+1)*4;
else BmpInfoX.index = BmpInfoX.bmpWidth*bittype;
printf(" ͼÏñʵ¼Ê¿í¶È=%d",BmpInfoX.index);
if(bittype >= 3)
{
printf(" ͼÏñÊÇ24λÕæ²Êͼ");
for(i=0;i<LCD_HEIGHT; i++)
{
if(LCD_WIDTH>BmpInfoX.bmpWidth)
{
printf(" ÆÁÄ»¿í¶È´óÓÚͼƬ¿í¶È");
f_read(bmpFile,databuff,BmpInfoX.index,(UINT *)&cnt);
for(j=cnt;j<LCD_WIDTH*3;j++)
{
databuff[j]=0x00;
}
}
else
{
f_read(bmpFile,databuff,LCD_WIDTH*3,(UINT *)&cnt);
if(LCD_WIDTH*3!=BmpInfoX.index)
{
printf(" ÆÁÄ»¿í¶ÈСÓÚͼƬ¿í¶È");
f_lseek(bmpFile,bitcount+(i+1)*BmpInfoX.index);
}
}
for(k=0;k<LCD_WIDTH;k++)
{
// printf("databuff[k]=0x%02x",databuff[j]);
bmpbuff[2]=databuff[k*3]; //B
bmpbuff[1]=databuff[k*3+1]; //G
bmpbuff[0]=databuff[k*3+2]; //R
LCDFastDrawPoint(k,i,bmpbuff);
//printf(" k=%d",k);
}
//printf(" i=%d",i);
}
f_close(bmpFile);
}
}
else
return PIC_OPEN_ERR;
MemoryFree((uint32_t *)databuff);
MemoryFree(bmpFile);
return 0;
}
void LCDFastDrawPoint(uint16_t x,uint16_t y,uint8_t *data)
{
SetWindow(x,y,1,1);
Zebra_SPI_RegWR(0x2C);
SPI_Prepare();
Zebra_SPI_RGBWR(data[0]);
Zebra_SPI_RGBWR(data[1]);
Zebra_SPI_RGBWR(data[2]);
// SetWindow(0,0,320,240);
}
[/mw_shl_code]
一周热门 更多>