原创 STM32开发板上模拟电子书显示的设计

2010-4-5 12:12 2880 8 8 分类: MCU/ 嵌入式

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

 

 


1、程序功能的设计


在命令界面上,添加mctxt命令,这个命令可以带两个参数,一个是文本文档的名字,再一个就是本次阅读的起始点。比如:


mctxt 0:/doc/电子书.txt 10


就是要读取 电子书.txt 的内容,从10%的地方开始。


要能够支持上下翻页的功能:空格或者回车就向下翻页,退格键用于向上翻页,“ESC“就退出。


2、程序实现的方案和资源规划


因为液晶屏是160x128的,最多显示80个汉字,如果真的用于电子书的话,一眼扫过去就看完了。所以翻页的功能就显得特别重要。


这里用户要设置一个缓冲区,比如320个字节,就可以存储最少 2个屏的数据。由于可能是中英文混合,屏幕中有些地方可能会留出空格,也就是一屏幕可能不是绝对的显示80个汉字,可能小于(160字节)。


电子书的内容都是从文件中读取的,什么时候该更新用户的缓冲区,也是一个比较重要的问题。


我设置的液晶输出函数,每次在输入到最后一个字节的时候,都会自动清屏,回到液晶的左上角。所以在电子书显示的时候,最多只能显示到最后一行的倒数第二个字节。


 


 


先进行一次实际操作模拟:


在串口输入命令:mctxt (电子书文件名) 0。表明是从头开始阅读。这时候读文件函数先把用户设定的缓冲字节数读进缓冲区。应该设置一个指针,这是指向缓冲区开头。


然后开始刷屏输出,在显示的过程中,要特别注意显示的字节个数,当到达最后一行最后一个字节的时候,要自动停止,退出刷屏。同时此时指针指向的位置要保存


如果此时用户输入“回车”表示要下翻,则先进行清屏。从指针当前位置开始,开始刷屏输出。如果在显示过程中,指针位置到达缓冲区末尾。说明当前缓冲已经用完了,要重新刷新当前缓冲区。指针再指向0,从头开始取字节刷屏,直到显示满一屏位置


另有一个特别重要的问题,如果缓冲区的最后一个字节是汉字的一半怎么办?先要保存这个字节,缓冲区刷新后,再获取另一个字节。实际使用时会不会出问题,这里先留出这个问题。


 


 


接下来是最重要的向上翻页的功能,指针要向前定位。可能就会定位在一个内码的中间,这样后面很多字符的显示都会不伦不类了(只能期待整篇文章都是中文了)。但我一时也想不到好的解决办法,先马虎过去。


每次退,指针退140个字符,相当于70个中文字符。当然要先判断指针是否超前缓冲区这么多,如果小于140个字符,则退到缓冲区头部。如果指针在头部时,接受到向上翻页命令,则刷新用户缓冲区,同时从缓冲区尾部开始退。


 


3、程序结构的设计和执行流程


mctxt命令处理程序中:


先初始化显示指针为0,设置一个显示刷新标志,初始化时为1


TxtPtr = 0;   DispRefresh =1;


 


While (1){


     If (DispRefresh){


        For ( ; ; ) {


           Char1=* TxtPtr;


           If ( Char1 <0x80 ){


                           显示英文字符;


                           TxtPtr++;


             If ( TxtPtr > UserBuf[length-1] ){


                    刷新用户缓冲区;


                     TxtPtr=0


             }


             If 7 && 大于等于倒数第二个位置 break


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


           Else {  //大于0x80Char1已经保存


             TxtPtr++;


             If ( TxtPtr > UserBuf[length-1] ){


                    刷新用户缓冲区;


                     TxtPtr=0


                       }


             Char2 = *TxtPtr;


             根据char1char2计算出内码;


             显示汉字;


            


             TxtPtr++;


             If ( TxtPtr > UserBuf[length-1] ){


                    刷新用户缓冲区;


                     TxtPtr=0


                       }


If 7 && 大于等于倒数第二个位置 break


           }


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


     DisplayRefresh = 0  //显示刷新标志清0


   } // end of if (DispRefresh)


 


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


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


 


如果是下翻标志 {


    清屏;


    置位刷新显示标志;


}


如果是上翻标志{


    指针为0{


       刷新用户缓冲区;


       指针从尾部退140个字符;


       置位显示刷新标志;


    }


    指针小于140字符{


       指针退到缓冲区开头;


       置位显示刷新标志;


    }


    指针大于等于140字符 {


       指针退140个字符;


       置位显示刷新标志


    }


} //如果是上翻标志


 


} //end of while(1);


 


 


程序框架已经搭好了,下面就要开始代码的编写了。


 

PARTNER CONTENT

文章评论0条评论)

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