OpenEdv-开源电子网

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

谁有兴趣 改写代码 实现电子书向上翻页功能 求助

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2012-5-1
在线时间
0 小时
发表于 2012-5-1 14:31:13 | 显示全部楼层 |阅读模式
STM32 带有的例程中有电子书功能   但只能向下翻页 
求大神改写代码 实现向上翻页功能
以下是例程中电子书代码

void Ebook_Play(void)
{    
 FileInfoStruct *FileInfo;      
 u16 index=0;  //当前选择的文件编号   
 //从根目录开始浏览
 if(FAT32_Enable)Cur_Dir_Cluster=FirstDirClust;//根目录簇号
  else Cur_Dir_Cluster=0;        
 Fat_Dir_Cluster=Cur_Dir_Cluster;//父目录就是当前目录
 while(1)
 {  
  OINT_COLOR=RED;   
  Load_Gui_Bro("选择");//显示GUI界面
  Show_Str(88,2,"电子图书",16,0x01);//叠加模式,非自动换行
   
  index=File_Browse(T_LRC|T_TXT|T_C|T_H);//浏览文件夹   
  if(!index)return;//结束浏览,退出此功能!!!!! 
                   
  en_Point.Key_Sta=Key_Up;         //释放显示期间的触发    
  FileInfo=&F_Info[0];//开辟暂存空间. 
  Get_File_Info(Cur_Dir_Cluster,FileInfo,T_LRC|T_TXT|T_C|T_H,&index);//得到这张图片的信息  
  Read_Book(FileInfo);//读取TXT文件     
 }
}
#define FSIZE 16
//文本文件读取程序 
//实现功能:把文件 FileName 打开.在液晶上显示出来
//打开txt/lrc文件

         
void Read_Book(FileInfoStruct *FileName)
{              
    u16 pointpos=0;   //指针位置  
    unsigned long offlenth=0;//文件读取的大小     
    u16 x=0,y=0;
    u8 *p=0;            //指向txt文件
    u8 temp[2]={0,0};   //换扇区使用
    u8 bHz=0;           //字符或者中文    
      
 u8 key,keyx,tcnt=0;
 u8 enout=0;//能否退出的标志
 u8 keycnt=0;


  if((FileName->F_Type&(T_LRC|T_TXT|T_C|T_H))==0)return;//不是TXT类型的文件
 F_Open(FileName);//打开文件  

 LCD_Clear(WHITE);//清屏
 OINT_COLOR=DARKBLUE;//深蓝色字体   
 while(1)
    {            
  F_Read(FileName,jpg_buffer);//读取数据     
   p=jpg_buffer; //指向txt数据首地址  
  do
        {          
         while(*p!=0)//数据未结束
         {        
          if(!bHz)
          {
           if(*p>0x80)bHz=1;//中文字符
           else             //ASCII字符
           {     
                        if(x>(240-FSIZE/2)){y+=FSIZE;x=0;}//一行已满,换行 
            if(y>(320-FSIZE))break;//越界返回     
            if(*p==13)//换行符号
            {        
                y+=FSIZE;
       x=0;
                p++;pointpos++;//跳过
            } 
            else LCD_ShowChar(x,y,*p,FSIZE,1);
      p++;pointpos++;
            x+=FSIZE/2; //字符,为全字的一半
           }
          }else
          {    
              bHz=0;//清除汉字标志
              if(x>(240-FSIZE)){y+=FSIZE;x=0;}//换行
           if(y>(320-FSIZE))break;//越界返回 
           //临界处理  
           if(pointpos==511)//保存上一扇区的最后一个字节,退出       
           {
               temp[0]=*p; //记录最后的字节               
               break;      //此扇区数据已经读完
           }
           if(temp[0])//上一次没有显示完
           {                        
               temp[1]=*p;//取第二扇区的第一个字节
              
      Show_Font(x,y,temp,16,1); //显示这个汉字,空心显示 
               p++;pointpos++;//偏移一个字节
               temp[0]=0;     //清除标记
           }else Show_Font(x,y,p,16,1); //显示这个汉字,空心显示     
          
           p+=2;pointpos+=2;     //指针偏移
           x+=FSIZE;      //下一个汉字偏移
          }
          if(pointpos>511)break;
         } 
            if(pointpos>=511)break;//一个扇区读取完毕,直接跳出,读下一个扇区,防止停顿    
    enout=0; //退出使能标志不使能
   key=0;  
   while(1) //是否显示下一屏数据
            {    
    keyx=AI_Read_TP(30);    
    if(keyx)//按键按下,并且支持点连按
    {      
     if(enout&&Is_In_Area(200,300,40,20))return;//返回

     key=Touch_To_Num(7); 
     if(key==KEY_FUNC)//按在中间
     {
      if(keyx!=2)key=0;//不是点触
     }else if(key==KEY_NEXT)
     {
      if(Pen_Point.Key_Reg&0x80)key=0;//没经过松开 
     }               
     en_Point.Key_Reg|=0x80;//标记按下
    }else Pen_Point.Key_Reg&=~0x80;//标记松开
       
    if(key==KEY_NEXT)//向下翻页
                {          
      keycnt=0;  
     if(enout){if(Is_In_Area(200,300,239,319))return;}//退出文件阅读       
      if(y>(320-FSIZE)){x=0;y=0;}//非结尾返回,屏幕已满,清屏      
                    if(offlenth+pointpos+1>=FileName->F_Size)goto QUIT;//文件读取结束(长度结束)     
                    else
     {
      LCD_Clear(WHITE);//清屏
      break;
      }
                }
    if(key==KEY_FUNC)//按中中间区域了         
    {           
      keycnt++;
     if(keycnt>=200)
     {
QUIT:
      keycnt=0;
      enout=1;//使能退出     
       OINT_COLOR=DARKBLUE;//深蓝色 
      LCD_DrawLine(0,297,239,297);
       LCD_Fill(0,298,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色) 
       LCD_Fill(0,308,239,319,GRAYBLUE); //填充底部颜色(灰蓝色)      
      OINT_COLOR=WHITE;//白色字体
      Show_Str(203,300,"返回",16,0x01);    //叠加模式,非自动恍
      OINT_COLOR=DARKBLUE;//深蓝色
     } 
    }
    key=0;//清除此次按键                
    delay_ms(10);
    tcnt++;
    if(tcnt>=20)
    {
     LED0=!LED0;
     tcnt=0;
    }
            }  
        }while(pointpos<511); 
        offlenth+=pointpos+1;//文件长度累加    
  pointpos=0;//清除指针计数器            
    }

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-1 14:53:06 | 显示全部楼层
向上翻页需要做页码地址标记,只要内存足够,就问题不大的.
每次进入下一页之前都记录本页的首地址.也就是需要4个字节来记录一个页面.
4K自己可以记录1000个页面,基本够用了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-1 14:53:48 | 显示全部楼层
向上翻页需要做页码地址标记,只要内存足够,就问题不大的.
每次进入下一页之前都记录本页的首地址.也就是需要4个字节来记录一个页面.
4K自己可以记录1000个页面,基本够用了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-6-26
在线时间
6 小时
发表于 2012-10-20 18:11:31 | 显示全部楼层
最近我也在研究电子书,参考这原子的程序重新编写代码,确实发现向上翻页比较麻烦,只有在显示每页文字的时候记录下第一个文字的位置。这个就占内存了,只能做有限的翻页比如10页,意思一下就行了。要做完美点就耗内存了。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2013-12-17 15:07:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢提供思路
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 14:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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