原创 STM32开发板上电子书的实现

2010-4-5 22:37 4565 9 9 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 


1、命令处理程序的代码


根据上午缩写的程序结构和执行流程,下午编写了代码:


      TxtStr = (u8 *)argv[1];  //获取文件名


      Percent =(DWORD) atoi ( argv[2] ); //获取起始比例


   Shell_ClearScreen( ); //清屏


      f_open ( &TxtFile, (const char *)TxtStr, FA_READ); //打开指定文件


      Percent = ( TxtFile.fsize * Percent )/100;


      f_lseek ( &TxtFile, Percent ); //文件指针调整到指定比例。


   f_read ( &TxtFile, (void *)UserBuf, 512, &ByteRead); //先填充用户缓冲区;


    while (1){


        if (DispRefresh){


               for ( ; ; ) {   // 7 && 大于等于倒数第二个位置时跳出循环,表示一屏已经显示满了。


                                  if ( (Lines ==7) && (CharCol >= 160-16) ) break;


                    Char1=*TxtPtr;


                    if ( Char1 <0x80 ){


                                    Shell_PutChar( Char1 );//显示英文字符;


                                    TxtPtr++;


                         if ( TxtPtr > &UserBuf[511] ){//指针指向末端


                            res = f_read ( &TxtFile, (void *)UserBuf, 512, &ByteRead); //刷新用户缓冲区;


                            TxtPtr=&UserBuf[0]; /指针回到开头


                         }   


                    }  // If ( Char1 <0x80 )结束


                   else {  //大于0x80的情况,Char1已经保存


                        TxtPtr++;


                        if ( TxtPtr > &UserBuf[511] ){


                            res = f_read ( &TxtFile, (void *)UserBuf, 512, &ByteRead); //刷新用户缓冲区;


                            TxtPtr=&UserBuf[0];


                        }


                        Char2 = *TxtPtr; /取得第二个字符


                        GBCode = (u16)( Char1*256 + Char2 );//根据char1char2计算出内码


                        Shell_PutHanzi ( GBCode );//显示汉字;


                        TxtPtr++;


                        if ( TxtPtr > &UserBuf[511] ){


                            res = f_read ( &TxtFile, (void *)UserBuf, 512, &ByteRead); //刷新用户缓冲区;


                            TxtPtr=&UserBuf[0];


                        }


                   }


             } //for的结束,刷屏循环结束


             DispRefresh = 0;  //显示刷新标志清0


        } // end of if (DispRefresh)


 


    CtrlCode = Uart_GetChar( );//获取用户控制码


        //如果是"ESC"字符,清屏,跳出循环;


      if ( CtrlCode == '\x1B' ) break;


    else if ( (CtrlCode == '\n') || (CtrlCode == ' ') ) { //如果是下翻标志


         Shell_ClearScreen( );//清屏;


         DispRefresh =1;//置位刷新显示标志;


    }


    else if ( CtrlCode == '\b' )  {      //如果是上翻标志


             if ( TxtPtr == &UserBuf[0] ) { //指针为0


                  if ( TxtFile.fptr>=512 )FilePtr = TxtFile.fptr-512;   


                          else FilePtr = 0;      //文件指针回退512字节,刷新用户缓冲区;


                             f_lseek ( &TxtFile, FilePtr );


                             f_read ( &TxtFile, (void *)UserBuf, 512, &ByteRead);


               TxtPtr = &UserBuf[512]-140;//指针从尾部退140个字符;


               Shell_ClearScreen( );


               DispRefresh =1;//置位显示刷新标志;


             }


             else if ( TxtPtr < &UserBuf[0] + 140 ) {//指针小于140字符{


                  TxtPtr = &UserBuf[0];  //指针退到缓冲区开头


                  Shell_ClearScreen( );


                  DispRefresh =1;   //置位显示刷新标志;


             }


             else {   //指针大于等于140字符


                 TxtPtr -= 140;    //指针退140个字符;


                 Shell_ClearScreen( );


                 DispRefresh =1;// 置位显示刷新标志


             }


    } //如果是上翻标志


 


  } //end of while(1);


2、实验的结果


我也没有想到这么顺利,第一次下载,电子书就成功的实现了。输入命令时,在液晶屏上就正确显示了电子书的内容。按下“空格”或者“回车”,可以顺利地实现向下翻页。但是按下退格键时,没有上翻。这个功能还得查看代码。


首先看了一下,加了一个清屏函数Shell_ClearScreen( ),再下载试一试。


按下退格键,液晶屏重新刷新了,但还是显示原来的内容。说明处理程序接收到了 “向上翻页的命令”,但是没有成功的执行,再次阅读代码。


改了每次退格的数字:


TxtPtr -= 140;    //指针退140个字符,改为320,可以实现向上翻页了,但是非常容易出现乱码;而且有些时候,出现页面的连续跳转。


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条