输入法移植

http://www.edacode.com/2010-04-09-09-21-35/item/447-proteus.html

最近要做个项目,需要在STM32F103ZE  UCGUI上面移植个输入法,上网查了很多资料,但是开源的资料很少,大部分方案都是采用T9输入法。下面是在网上找到的一个自己设计的输入法,感人感觉写得不错,不过还没有拿到板子修改去试,不过这种思路很不错,拿过来分享啦,gelivalble!

原址:http://www.edacode.com/2010-04-09-09-21-35/item/447-proteus.html

源码及防真见附件

“1”和“2”键选者上下,OK键确定,除法键选者汉字。

为了能够实现汉字短信的无线收发,本系统加入了中文输入法,汉字采用了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&&PY_num<=3)
{
T9PY_mb[PY_num]=cpHZ;/*存下搜索到的对应的拼音 */
PY_num++;
}
cpHZ++;
}
if (PY_num>0)
{
p_py=T9PY_mb[0]->PY;
return(T9PY_mb[0]->PY_mb); /*返回拼音对应汉字点阵的地址 */
}
else
{
return(PY_mb_a); /*没有查到则返回拼音’a’的汉字点阵地址 */
}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值