查看: 1746|回复: 0
打印 上一主题 下一主题

上传以前写的输入法程序,proteus仿真通过的

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-8 20:23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1
点击此处下载ourdev_235439.rar(文件大小:368K)
1
上图相应的程序:点击此处下载ourdev_235457.rar(文件大小:257K)





[tr][/tr]
为了能够实现汉字短信的无线收发,本系统加入了中文输入法,汉字采用了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’的汉字点阵地址 */
        }
}





回复
[url=]举报[/url]









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表