<?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 );//根据char1和char2计算出内码;
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,可以实现向上翻页了,但是非常容易出现乱码;而且有些时候,出现页面的连续跳转。
文章评论(0条评论)
登录后参与讨论