我用其他的屏幕做图像显示,所以在原子哥原有的例程上进行了修改,将原有的LCD相关的都去掉了,BMP解码文件也做了相应的修改(只解码单色文件)。但是在文件读取解码显示的时候出现了问题,文件的打开,第一次读取和第二次读取都很正常,但是第三次读取的时候出现了奇怪的现象,f_read返回了9,就是Id不等。经过我仔细追查发现f_bmp->fs整个的值都发生了改变fs_type由2变成了112,drv更是又0变成了133,所有的值都是错误的所以validate(fs)的时候就返回了9。为了检查错误我特地将解码文件改成如下,去掉了解码显示部分,只有读取部分。求原子哥帮忙查找下错误原因啊!
[mw_shl_code=c,true]u8 stdbmp_decode(const u8 *filename,u8 frame)
{
FIL* f_bmp;
u16 br;
u16 count;
u8 cor=0;
u8 rgb ,color_byte;
u16 x ,y;
u8 color;
u16 col=0;
u16 countpix=0;//记录像素
u8 res;
u16 temp[4];
u8 nowbit;
u8 bitcolor;
u8 tempbit;
//u8 data[256];
u8 butto[16]={0xaa,0xa9,0xa6,0xa5,0x9a,0x99,0x96,0x95,0x6a,0x69,0x66,0x65,0x5a,0x59,0x56,0x55};
u8 *databuf; //数据读取存放地址
u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度
u8 *bmpbuf; //数据解码地址
u8 biCompression=0; //记录压缩方式
u16 rowlen; //水平方向字节数
BITMAPINFO *pbmp; //临时指针
#if BMP_USE_MALLOC == 1 //使用malloc
databuf=(u8*)mymalloc(readlen); //开辟readlen字节的内存区域
//data=(u8*)mymalloc(256);
if(databuf==NULL)return PIC_MEM_ERR; //内存申请失败.
f_bmp=(FIL *)mymalloc(sizeof(FIL)); //开辟FIL字节的内存区域
if(f_bmp==NULL) //内存申请失败.
{
myfree(databuf);
return PIC_MEM_ERR;
}
#else //不使用malloc
//databuf=bmpreadbuf;
//f_bmp=&f_bfile;
#endif
res=f_open(f_bmp,(const TCHAR*)filename,FA_READ);//打开文件
if(res==0)//打开成功.
{
f_read(f_bmp,databuf,readlen,(UINT *)&br);//读出readlen个字节
pbmp=(BITMAPINFO *)databuf;//得到BMP的头部信息
count=pbmp->bmfHeader.bfOffBits; //数据偏移,得到数据段的开始地址
color_byte=pbmp->bmiHeader.biBitCount/8; //彩色位 16/24/32
cor=pbmp->bmiHeader.biBitCount;
biCompression=pbmp->bmiHeader.biCompression;//压缩方式
picinfo.ImgHeight=pbmp->bmiHeader.biHeight; //得到图片高度
picinfo.ImgWidth=pbmp->bmiHeader.biWidth; //得到图片宽度
//ai_draw_init();//初始化智能画图
//水平像素必须是4的倍数!!
//rowlen=256;
if(cor==1)
{rowlen=256; }
else
{
if((picinfo.ImgWidth*color_byte)%4)rowlen=((picinfo.ImgWidth*color_byte)/4+1)*4;
else rowlen=picinfo.ImgWidth*color_byte;
}
//开始解码BMP
color=0;//颜色清空
x=0 ;
y=picinfo.ImgHeight;
rgb=0;
bmpbuf=databuf;
while(1)
{
if(cor>1)
{
}
else
{
res=f_read(f_bmp,databuf,readlen,(UINT *)&br);
if(br!=readlen){readlen=br;}//最后一批数据
if(res||br==0)break; //读取出错
bmpbuf=databuf;
count=0;
}
f_close(f_bmp);//关闭文件
}
}
#if BMP_USE_MALLOC == 1 //使用malloc
myfree(databuf);
myfree(f_bmp);
#endif
return res; //BMP显示结束.
} [/mw_shl_code]
|