我把战舰的图片显示实验,copy到MINI板上,图片没有显示啊。FATFS文件系统没有问题。但是就是不显示啊,FATFS打开目录,读取文件都没有问题,但是图片不显示,移植到MINI板可能是什么原因出现这个问题啊?求解,上源码。
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "rtc.h"
#include "wkup.h"
#include "dma.h"
#include "24cxx.h"
#include "flash.h"
#include "mmc_sd.h"
#include "text.h"
#include "spi.h"
#include "string.h"
#include "malloc.h"
#include "exfuns.h"
#include "usmart.h"
#include "touch.h"
#include "usart2.h"
#include "piclib.h"
//得到path路径下,目标文件的总个数
//path:路径
//返回值:总有效文件数
u16 pic_get_tnum(u8 *path)
{
u8 res;
u16 rval=0;
DIR tdir; //临时目录
FILINFO tfileinfo; //临时文件信息
u8 *fn;
res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存
if(res==FR_OK&&tfileinfo.lfname!=NULL)
{
while(1)//查询总的有效文件数
{
res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件
if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//取高四位,看看是不是图片文件
{
rval++;//有效文件数增加1
}
}
}
return rval;
}
// PICTURE 照片
int main(void)
{
u8 res;
u8 t;
DIR picdir; //图片目录
FILINFO picfileinfo;//文件信息
u8 *pname; //带路径的文件名
u16 totpicnum; //图片文件总数
u16 *picindextbl; //图片索引表
u16 curindex; //图片当前索引
u8 *fn; //长文件名
u8 pause=0; //暂停标记
u16 temp;
u8 key;
//u8 fontok=0;
//u32 total,free;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LCD_Init(); //初始化液晶
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
usmart_dev.init(72); //usmart初始化
TP_Init(); //初始化触摸屏
mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(0,fs[0]); //挂载SD卡(注册一个工作区)
POINT_COLOR=RED;
while(SD_Initialize()) //检测SD卡
{
LCD_ShowString(60,150,200,16,16,"SD Card Error!");
delay_ms(200);
LCD_Fill(60,150,240,150+16,WHITE);//清除显示
delay_ms(200);
LED0=!LED0;//DS0闪烁
}
//key=KEY_Scan();
//fontok=font_init(); //检查字库是否OK
while(font_init()) //检查字库是否ok
{
LCD_ShowString(60,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(60,50,240,66,WHITE);//清除显示
}
Show_Str(60,60,100,16,"图片显示",16,0);
while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
{
Show_Str(60,100,240,16,"PICTURE文件夹错误!",16,0);
delay_ms(200);
LCD_Fill(60,100,240,166,WHITE);//清除显示
delay_ms(200);
}
totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
while(totpicnum==NULL) //图片文件为0
{
Show_Str(60,100,240,16,"没有图片文件!",16,0);
delay_ms(200);
LCD_Fill(60,100,240,166,WHITE);//清除显示
delay_ms(200);
}
picfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize); //为长文件缓存区分配内存
pname=mymalloc(SRAMIN,picfileinfo.lfsize); //为带路径的文件名分配内存
picindextbl=mymalloc(SRAMIN,2*totpicnum); //申请2*totpicnum个字节的内存,用于存放图片索引
while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
{
Show_Str(60,150,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(60,150,240,146,WHITE);//清除显示
delay_ms(200);
}
//记录索引
res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
if(res==FR_OK)
{
curindex=0;//当前索引为0
while(1)//全部查询一遍
{
temp=picdir.index; //记录当前index
res=f_readdir(&picdir,&picfileinfo); //读取目录下的一个文件
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//取高四位,看看是不是图片文件
{
LCD_ShowString(10,10,80,16,16,"tp test");
picindextbl[curindex]=temp;//记录索引
curindex++;
}
}
}
Show_Str(60,150,240,16,"开始显示...",16,0);
delay_ms(1500);
piclib_init(); //初始化画图
curindex=0; //从0开始显示
res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); //打开目录
while(res==FR_OK)//打开成功
{
dir_sdi(&picdir,picindextbl[curindex]); //改变当前目录索引
res=f_readdir(&picdir,&picfileinfo); //读取目录下的一个文件
if(res!=FR_OK||picfileinfo.fname[0]==0)break; //错误了/到末尾了,退出
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);//显示图片
Show_Str(2,2,240,16,pname,16,1); //显示图片名字
t=0;
while(1)
{
key=KEY_Scan(); //扫描按键
//if(t>250)key=KEY_RIGHT; //模拟一次按下右键
if(t>250)key=1; //模拟一次按下KEY0
if(key==2) //上一张(KEY1)
{
if(curindex)curindex--;
else curindex=totpicnum-1;
break;
}
else if(key==1)//下一张(KEY0)
{
curindex++;
if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
break;
}//else if(key==KEY_UP)
else if(key==3)//KEY2
{
pause=!pause;
LED1=!pause; //暂停的时候LED1亮.
}
if(pause==0)t++;
delay_ms(10);
}
res=0;
}
myfree(SRAMIN,picfileinfo.lfname); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,picindextbl); //释放内存
}代码太多,上工程。
|