高级会员

- 积分
- 579
- 金钱
- 579
- 注册时间
- 2019-8-4
- 在线时间
- 187 小时
|
15金钱
本帖最后由 taomao 于 2020-1-11 15:04 编辑
//DIR*picdirge
while(res==FR_OK)//打开成功
{
dir_sdi(&picdir,picindextbl[curindex]); //这样子不行
//问题1: 为什么改为picdirge (声明的一个结构体指针)才可以,使用结构体在程序调试的时候就发现picfileinfo.lfname为空,并未存储长文件名,不知为何,大神能指明可能的原因吗,比较懵逼
res=f_readdir(&picdir,&picfileinfo); //读取目录下的一个文件
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //错误了/到末尾了,退出
//问题2:这个不是循环播放图片吗,怎么可能退出这个循环,所以打开文件正常的情况下,后面的释放变量内存永远都不会执行吧
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
strcpy((char*)pname,"0:/PICTURE/"); //复制路径(目录)
strcat((char*)pname,(const char*)fn); //将文件名接在后面
LCD_Clear(BLACK);
ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片
Show_Str(2,2,240,16,pname,16,1); //显示图片名字
t=0;
while(1)
{
key=KEY_Scan(0); //扫描按键
if(t>250)key=1; //模拟一次按下KEY0
if((t%20)==0)LED0=!LED0;//LED0闪烁,提示程序正在运行.
if(key==KEY1_PRES) //上一张
{
if(curindex)curindex--;
else curindex=totpicnum-1;
break;
}else if(key==KEY0_PRES)//下一张
{
curindex++;
if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
break;
}else if(key==WKUP_PRES)
{
pause=!pause;
LED1=!pause; //暂停的时候LED1亮.
}
if(pause==0)t++;
delay_ms(10);
}
res=0;
}
myfree(SRAMIN,picfileinfo.lfname); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,picindextbl); //释放内存
}问题4 文件系统如何指定管理内存的大小,比如说例程说文件系统管理W25QXX前面12M的空间,但我想改为10M,因为我发现使用文件系统管理,W25QXX_Read这个函数就不起作用了,望知道的大神贴出代码告知在哪里设置问题5
minibmp_decode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u16 acolor,u8 mode)aclor这个参数不是用来混合改变原图片的颜色吗,
tmp_color=piclib_alpha_blend(tmp_color,acolor,mode&0X1F);
问题6 用串口调试新建文件显示返回值为0x11,我查了是LFN工作缓冲区不能分配,这个怎么解决
问题7 在底层diskio.c添加了例程RTC.C例程,并且按格式返回时间,怎么还不能显示文件创建时间信息,还有RTC为什么掉电很长时间,比如说1个小时,时间又会重新计数(短时间不会),
DWORD get_fattime (void)
{
u32 time;
time=(u32)(calendar.w_year-1987)<<25;
time+=(u32)calendar.w_month<<21;
time+=(u32)calendar.w_date<<16;
time+=(u32)calendar.hour<<11;
time+=(u32)calendar.min<<5;
time+=calendar.sec/2;
return time;
}
还有一个问题,原子哥,需不需要加f_closdir()这一句;
下面是自己的bmp.c文件,自己看懂例程后删掉例程再自己一步一步写的,有些许改动
u8 stdbmp_decode(const u8 *filename)
{
FIL *ftemp;
BITMAPINFO* bmp1;
u8 res,*data,rgb=0,bit,bicompression,flag;
UINT br;
u16 color=0,xsize,x0=0,realy,y0,count=0,readlen=BMP_DBUF_SIZE,x=0,skip;
u32 off;
data=mymalloc(SRAMIN,BMP_DBUF_SIZE);
ftemp=mymalloc(SRAMIN,sizeof(FIL));
bmp1=mymalloc(SRAMIN,sizeof(BITMAPINFO));
if(data==NULL||ftemp==NULL||bmp1==NULL) return 20;
res=f_open(ftemp,(TCHAR*)filename,0x01);
res=f_read(ftemp,data,BMP_DBUF_SIZE,(UINT*)&br);
if(res!=0) return res;
bmp1=(BITMAPINFO*)data;//没有分配空间
picinfo.ImgHeight=bmp1->bmiHeader.biHeight;
picinfo.ImgWidth=bmp1->bmiHeader.biWidth;
bit=bmp1->bmiHeader.biBitCount;
bicompression=bmp1->bmiHeader.biCompression;
off=bmp1->bmfHeader.bfOffBits;
xsize=((bit/8*picinfo.ImgWidth)%4)?(((bit/8*picinfo.ImgWidth)/4+1)*4) bit/8*picinfo.ImgWidth);
ai_draw_init();
y0=picinfo.ImgHeight;
realy=(y0*picinfo.Div_Fac)>>13;
while(1)
{
while(off<readlen)
{
//while(count<xsize)
if(bit==8) return 21;
if(bit==16)
{
switch(rgb)
{
case 0:
{
if(bicompression==BI_RGB)
{
color=data[off]&0x1f;
color+=(u16)(data[off]&0xe0)<<1;
}
else color=data[off];
break;
}
case 1:
if(bicompression==BI_RGB) color+=(u16)data[off]<<9;
else color+=(u16)data[off]<<8;
break;
}
}
if(bit==24)
{
switch(rgb)
{
case 0: color=data[off]>>3;break;
case 1: color+=((u16)data[off]&0xfc)<<3;break;
case 2: color+=((u16)data[off]&0xf8)<<8;break;
}
}
if(bit==32)
{
switch(rgb)
{
case 0: color=data[off]>>3;break;
case 1: color+=((u16)data[off]&0xfc)<<3;break;
case 2: color+=((u16)data[off]&0xf8)<<8;break;
case 3: break;
}
}
off++;
rgb++;
count++;
if(rgb==bit/8)
{
x0++;
rgb=0;
x=(x0*picinfo.Div_Fac)>>13;
flag=is_element_ok(x,realy,1);
if(flag) LCD_DrawPoint(picinfo.S_XOFF+x,realy+picinfo.S_YOFF-1,color);
color=0;
}
if(count==xsize)
{
if(y0==0) break;
y0--;
realy=(y0*picinfo.Div_Fac)>>13;
flag=is_element_ok(x,realy,0);
while(!flag) //此处改动,当图像在竖直方向缩小时,不必再执行上面代码,直接跳过数组里面的像素
{
off+=xsize;
y0--;
realy=(y0*picinfo.Div_Fac)>>13;
flag=is_element_ok(x,realy,0);
}
x0=0;
count=0;
}
}
if(off>BMP_DBUF_SIZE) //万一跳过的像素超出2K,文件指针偏移
{
skip=off-BMP_DBUF_SIZE;
f_lseek(ftemp,f_tell(ftemp)+skip);
}
off=0;
res=f_read(ftemp,data,readlen,(UINT*)&br);
if(res||br==0) break;
if(BMP_DBUF_SIZE!=br) readlen=br;
}
myfree(SRAMIN,data);
myfree(SRAMIN,ftemp);
myfree(SRAMIN,bmp1);
f_close(ftemp);
return res;
}
|
|