<?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();
再次编译下载,成功。液晶现在可以自由使用了。
2、mctest命令处理程序框架的编写
修改支持命令个数的常数、添加命令字符串、初始化命令表的新命令、在输入命令文件中添加新命令、在Help命令处理程序中添加新命令显示、写新命令函数定义(暂时空着),编译下载,一个新的命令就添加成功了。
这次又要支持很多的命令,故工程中新增加一个文件media.c,用于处理多媒体相关的命令。
3、mctest命令处理程序内容的设计
处理程序进入一个循环,不断的接收从串口过来的字符。如果是“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是以汉字点阵数组为输入参数,不具有使用的通用性。所以接下来要实现像手机电子书类似的功能,需要改变参数,使它能够以汉字内码作为输入参数,实现汉字显示的通用性。
文章评论(0条评论)
登录后参与讨论