原创 汉字显示的测试程序

2010-4-4 20:30 3124 9 9 分类: MCU/ 嵌入式

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

 


1、程序框架的修改


我编写程序都是积累式的,以前曾经编写过五个按键输入、液晶作为显示终端的命令输入界面。这个界面一直是有效的,现在汉字显示要使用液晶屏,所以要经过一些修改。


修改的地方如下:


1)主程序占用了液晶的一行,写液晶的那句话注释掉。


//  Shell_PutStrPC(0,0,Str,Yellow,Black);  //不要占据屏幕了


2)键盘、液晶命令界面的主任务删除掉。实际就是不创建这个任务了。


//OSTaskCreate(Task_CmdShell,(void *)0,&Task_CmdShellStk[TaskStk_Size-1],Task_CmdShell_Prio);


//该任务暂时不需要了。


3)在键盘扫描任务中,使读键子程序总是返回0(不管有没有按键)


KeyCurrent=GetKeyState();     //总是返回0


4)在无按键输入处理流程中,将关闭液晶显示的指令去掉


因为在以前的程序中,当一分钟左右没有按键输入的时候,系统会自动关闭液晶显示(模拟手机的模式),现在要注释掉。


//                    DisplayOn=0;   //不要关闭屏幕


//                    LCD_DisplayOff();


 


再次编译下载,成功。液晶现在可以自由使用了。


2mctest命令处理程序框架的编写


修改支持命令个数的常数、添加命令字符串、初始化命令表的新命令、在输入命令文件中添加新命令、在Help命令处理程序中添加新命令显示、写新命令函数定义(暂时空着),编译下载,一个新的命令就添加成功了。


这次又要支持很多的命令,故工程中新增加一个文件media.c,用于处理多媒体相关的命令。


 


3mctest命令处理程序内容的设计


处理程序进入一个循环,不断的接收从串口过来的字符。如果是“ESC”键按下( 0x1B ),则跳出循环。


定义一个标志字符,当接收到ESC时,设置标志为1。采用 do while循环结构。


定义两个字符变量,接收一个字符后进行判断。如果小于0x80,说明是普通的ascii码,进行相应处理。如果大于0x80,判断是否DBCS的第一个字节。接收第二个字节,同时判断是否DBCS第二字节,如果满足条件,计算出对应汉字在字库文件中对应的存储位置。


打开字库文件,定位到存储位置,读取32个字节存入缓冲区。然后调用液晶显示程序显示汉字。


 


      do {


         Char1 = Uart_GetChar ( );  //这个字符是从串口字符队列中取得的。


         if ( Char1 < 0x80 ){


                if ( Char1 == 0x1B ) break; //退出输入模式


                else if ( Char1 = '\b' ){  //处理退格命令


                }


                else if ( Char1 = '\r' ) continue; //\r跳过不处理,只处理\n


                else if ( Char1 = '\n' ){ //处理换行


                }


                else if ( ISPRTCHAR ( Char1 ) ) //是可打印字符


                        Shell_PutChar ( Char1 );


                else {         //其它控制字符不处理,显示一个空格


                Shell_PutChar ( '\x20' );


                }


         }


         else {


               if ( !ISDBCS1(Char1) ) break;  //是否DBCS的低字节


               else {


                     Char2 = Uart_GetChar ( );


                           if ( !ISDBCS1(Char1) ) break;  //是否DBCS的高字节


                           DBCSFlag = TRUE;   //该标志标明上一个输入是汉字还是英文,方便删除。


                           CharPos = (DWORD)( ( (Char2 - 0xA1)*94 + (Char1-0xA1) )*32 );  //计算的字库中的存储位置


 


                           res = f_open ( &HZKFile, (const char *)FileStr, FA_READ );


                           if ( res !=FR_OK ) break;


                           res = f_lseek ( &HZKFile, CharPos ); //移动到点阵存储位置


                           if ( res !=FR_OK ) break;


                           res=f_read ( &HZKFile, (void *)HZArray, 32, &ByteRead );


                           if ( res !=FR_OK ) break;


                           Shell_PutHanzi ( HZArray );


               }


         }


      } while ( 1 );


 


经过调试发现,从串口先送出来的是内码的高字节,然后才是低字节,与我先前的推测相反。我在txt文件中写入了一个“小”字(它的内码是 0xD<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0A1,再用UltraEdit打开,发现的确是高位在前,也就是D0在低位


改过之后,可以在液晶上随心所欲的输出汉字了。


 


缺陷:所编写的这个汉字输入函数 Shell_PutHanzi是以汉字点阵数组为输入参数,不具有使用的通用性。所以接下来要实现像手机电子书类似的功能,需要改变参数,使它能够以汉字内码作为输入参数,实现汉字显示的通用性。


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

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