<?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 { //大于0x80,Char1已经保存
TxtPtr++;
If ( TxtPtr > UserBuf[length-1] ){
刷新用户缓冲区;
TxtPtr=0
}
Char2 = *TxtPtr;
根据char1和char2计算出内码;
显示汉字;
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);
程序框架已经搭好了,下面就要开始代码的编写了。
文章评论(0条评论)
登录后参与讨论