OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5838|回复: 5

ALIENTEK 7寸屏显示图片问题

[复制链接]

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
发表于 2013-5-27 09:38:07 | 显示全部楼层 |阅读模式

我想实现7寸屏只显示一张图片就停止在当前图片,不想图片连续显示,程序看了几遍,改了几处还是没有实现所要的目标,原子哥帮忙一下吧,如果太忙就指点一下思路吧,谢谢了。
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//02,图片显示测试部分

//得到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;
}
//02,图片显示测试
//循环显示SD卡,PICTURE文件夹下面的图片文件。
void picture_display_test(void)
{
 u8 res;
  DIR picdir;    //图片目录
 FILINFO picfileinfo;//文件信息
 u8 *fn;      //长文件名
 u8 *pname;   //带路径的文件名
 u16 totpicnum;   //图片文件总数
 u16 curindex;  //图片当前索引
// u8 key;    //键值
// u8 pause=0;   //暂停标记
// u8 t;
 u16 temp;
 u16 *picindextbl; //图片索引表
 LCD_Clear(WHITE);
 Show_Str(60,50,lcddev.width,16,"测试2:图片显示测试",16,0);
 Show_Str(60,70,lcddev.width,16,"KEY0:下一张图片",16,0);
 Show_Str(60,90,lcddev.width,16,"KEY1:上一张图片",16,0);
 Show_Str(60,110,lcddev.width,16,"WK_UP:暂停/继续 自动播放",16,0);
  while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
  {    
  Show_Str(60,130,lcddev.width,16,"PICTURE文件夹错误!",16,0);
  delay_ms(200);     
  LCD_Fill(60,130,lcddev.width,130+16,WHITE);//清除显示     
  delay_ms(200);     
 } 
 totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
   while(totpicnum==NULL)//图片文件为0  
  {    
  Show_Str(60,130,lcddev.width,16,"没有图片文件!",16,0);
  delay_ms(200);     
  LCD_Fill(60,130,lcddev.width,130+16,WHITE);//清除显示     
  delay_ms(200);     
 }  
   picfileinfo.lfsize=_MAX_LFN*2+1;      //长文件名最大长度
 picfileinfo.lfname=mymalloc(SRAMIN,64);     //为长文件缓存区分配内存
  pname=mymalloc(SRAMIN,128);        //为带路径的文件名分配内存
  picindextbl=mymalloc(SRAMIN,2*totpicnum);    //申请2*totpicnum个字节的内存,用于存放图片索引
  while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
  {    
  Show_Str(60,130,lcddev.width,16,"内存分配失败!",16,0);
  delay_ms(200);     
  LCD_Fill(60,130,lcddev.width,130+16,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)//取高四位,看看是不是图片文件 
   {
    picindextbl[curindex]=temp;//记录索引
    curindex++;
   }    
  }
 }  
 delay_ms(1200);
 Show_Str(60,130,lcddev.width,16,"开始显示...",16,0);
 delay_ms(1800); 
 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,lcddev.width,16,pname,16,1);    //显示图片名字
   t=0;
  while(1)
  {
   key=KEY_Scan();     //扫描按键
   if(t>250&&(pause==0))key=1;  //非暂停状态,每2.5秒,模拟一次按下KEY0 
   if(key==2)      //上一张
   {
    if(curindex)curindex--;
    else curindex=totpicnum-1;
    break;
   }else if(key==1)    //下一张
   {
    curindex++;      
    if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
    break;
   }else if(key==3)      
   {
    pause=!pause;
    LED1=!pause;  //暂停的时候LED1亮. 
   }  
   t++;
   if((t%20)==0)LED0=!LED0;      
   delay_ms(10);
  }        
  res=0; 
  
 }  
 
 myfree(SRAMIN,picfileinfo.lfname); //释放内存      
 myfree(SRAMIN,pname);    //释放内存      
 myfree(SRAMIN,picindextbl);   //释放内存
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-27 10:30:19 | 显示全部楼层
这很简单啊...
直接加入一句:while(1);
就完了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
295
金钱
295
注册时间
2012-11-11
在线时间
24 小时
发表于 2013-5-27 11:06:17 | 显示全部楼层
最好在while里面加一句按键检测判断语句,检测到按键break;然后继续显示下一张图片。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-5-27 12:09:55 | 显示全部楼层
whike(1);
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2013-5-27 15:32:35 | 显示全部楼层
说的我有点迷茫了,是在哪里加while(1);啊?
回复 支持 反对

使用道具 举报

29

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2013-5-4
在线时间
0 小时
 楼主| 发表于 2013-5-27 15:47:30 | 显示全部楼层
弄好了,谢谢各位的指点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表