为了能够实现汉字短信的无线收发,本系统加入了中文输入法,汉字采用了12*16的点阵,设计了1000多个汉字,共用了大概50K的代码空间,因而选用64K的单片机正好符合系统设计的要求。 4.4.1 数据结构的设计: struct t9PY_index { char code *t9PY_T9; /*对应的按键输入的数字*/ char code *PY; /*输入的数字对应的拼音*/ char code *PY_mb; /*拼音对应的汉字点阵表*/ };
例如{"948264","zhuang",PY_mb_zhuang},当按键连续按入"948264",对应的拼音为"zhuang",汉字的首地址为PY_mb_zhuang,其实是数组PY_mb_zhuang的数组名,定义如下。 unsigned char code PY_mb_zhuang[]= /*庄桩装壮状幢撞*/ { /*-- 文字: 庄 --*/ 0x00,0xFE,0x02,0x22,0x22,0x22,0xFB,0x22,0x22,0x22,0x02,0x00,0x06,0x01,0x04,0x04, 0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00, /*省略*/ };
4.4.2 按键拼音查找表的设计 struct t9PY_index code t9PY_index2[] ={ {"","",PY_mb_a }, {"2","a",PY_mb_a}, {"3","e",PY_mb_e}, {"4","i",PY_mb_a}, {"6","o",PY_mb_o}, {"8","u",PY_mb_a}, {"8","v",PY_mb_a}, /*省略*/ }; 4.4.3 算法的设计 当数据结构和拼音查找表设计完成后,就是算法的设计了。 源程序如下: /******************************************************************** *T9 输入法查找函数 *函数声明:unsigned char *T9PY(char *inputstr,uchar length); *参数说明:inputstr为字符串的地址,length为字符串的长度 *函数功能:把找到的汉字点阵表的首地址放在数组T9PY_mb中 ********************************************************************/ unsigned char *T9PY(char *inputstr,uchar length) { struct t9PY_index *cpHZ,*cpHZedge; unsigned char i; PY_num=0; if(*inputstr=='\0')return(0); /*如果输入空字符返回0 */ cpHZ=&(t9PY_index2[0]); /*取得查找表的首地址 */ cpHZedge=t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]); /*取得查找表的末地址 */ while(cpHZ < cpHZedge) /*如果没有搜索到末地址则继续 */ { for(i=0;i<length;i++) { if(*(inputstr+i)!=*((*cpHZ).t9PY_T9+i)) /*检查字符串匹配 */ { break; /*发现字母串不配则退出 */ } } if(i==length&&Y_num<=3) { T9PY_mb[PY_num]=cpHZ;/*存下搜索到的对应的拼音 */ PY_num++; } cpHZ++; } if (PY_num>0) { p_py=T9PY_mb[0]->Y; return(T9PY_mb[0]->Y_mb); /*返回拼音对应汉字点阵的地址 */ } else { return(PY_mb_a); /*没有查到则返回拼音’a’的汉字点阵地址 */ } }
|