⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t9.c

📁 单片机器实现T9拼音!是一个应用很广的技能!只要用汉字的地方就可以实现拼音输入!实现人机交互!
💻 C
字号:
/*
首先:希望下一个人可以出个3.0了,加入一些联想输入或者加入笔划输入等等。国人会感激你的。

促进中国文化,发扬中文输入法。


特点是直接在Keil下仿真,切换到串口窗口就可以直接看到结果。
要移植此输入法,只需要看懂unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,struct t9PY_index code  ** List_match_PY_Mb)函数
和拼音码表以及拼音索引的关系,基本上就没什么问题了。

仿真步骤如下:
1、打开解压缩文件,用keil c打开工程文件,然后编译运行即可
2、由于Keil的模拟串口是单字节显示,汉字显示为乱码。在win2000或win XP下,用其他窗口覆盖模拟串口窗口,再激活模拟串口窗口即可正确显示汉字
3、在Keil环境下可以直接按“Ctrl+F5”键仿真,按“F5”全速运行,切换到在串口依次输入: //
     9466*.1    486*.3   64*.6    426***.5 试试:-)   
4、按键是根据通用手机键盘设置的,全部在PC的小键盘操作):         //
   Num                /:上一拼音?*:下一拼音                          //
   7:pqrs    8:tuv    9:wxyz   -:前翻页                               //
   4:ghi    5:jkl    6:mno    +:后翻页                               //
   1:?    2:abc    3:def    回车键:输入状态和选字状态切换          //
   0:?            .和空格及回车键:输入状态和选字状态切换          //
*/





//--------------------------------------------------------------------------//
//                                T9拼音输入法2.0                              //
//                    (c) Copyright 2006 liuchongshan                       //
//                            All Rights Reserved                           //
//                                    V2.0                                  //
//--------------------------------------------------------------------------//
//标 题: T9拼音输入法模块                                                  //
//文件名: 51t9py.c                                                          //
//版 本: V2.00                                                             //
//修改人: 刘崇山                E-mail:lasergo@163.com                      //
//日 期: 06-03-31                                                          //
//描 述: T9拼音输入法模块                                                  //
//声 明:                                                                   //
//                 促进中国文化,发扬中文输入法,尽请多用多更新             //
//                让中国人做事的效益更高,免做重复之事,浪费资源            //
//-----用于商业?随便了,盗版的东西n多,自己看着办吧,反正我是用于学习的----//
//--------------------------------------------------------------------------//

//原始创建人: 徐文军      (感谢徐文军大哥了^_^)                             //
//在徐大哥公开的t9输入法上加了码表和参考凌阳单片机提供的t9输入法,修改了一些//
//冬冬.其实几百年前我就找到了徐文军大哥网上提供的文件,可惜缺少文件而造成很多//
//时间浪费,现在经过两天的奋战,终于...拿来给大家分享                         //


//-----本人一再强调:公布出来就是为了后人可以站在前人的基础上更进一步!!!-----//                                                                     //



//--------------------------------------------------------------------------//
#include<string.h>
#include<stdio.h>
#include"PY_mb.h"
//#include"51t9_MB.h"
#include"51t9py_indexa.h"

#define CNTLQ      0x11
#define CNTLS      0x13
#define DEL        0x7F
#define BACKSPACE  0x08
#define CR         0x0D
#define LF         0x0A

unsigned char cpt9PY_Mblen;
struct t9PY_index code  * cpt9PY_Mb[16];//主要用于存放匹配的拼音码表地址,只有cpt9PY_Mb[0]存放的是一个不匹配的拼音码表地址.
//匹配并不是指相比较的字符长短一样,不是完全匹配.例如:34跟346是匹配的,34跟34是完全匹配(在这里我们不需要使用完全匹配)





//========================================================================
//	语法格式:	unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,struct t9PY_index code  ** List_match_PY_Mb)
//	实现功能:	获取与输入相匹配的T9拼音列表
//	参数:		p_PadInput	输入的按键序列,由'0'~'9'组成的字符串
//				List_match_PY_Mb	存储"获取到的拼音索引地址"的数组
//	返回值:	获取到完全匹配拼音数量
//  移植注意:	List_match_PY_Mb所指向的存储结构,即用于存放匹配的拼音码表地址的存储结构.第一个元素存放的是一个不匹配的拼音码表地址.其他为匹配的拼音码表地址
//========================================================================
unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,struct t9PY_index code  ** List_match_PY_Mb)
{
    struct t9PY_index *p_PY_CurrenIndex,*p_PY_LastIndex,*p_PY_TempIndex;
    unsigned char i,j,cInputStrLength;
	unsigned char    T9PY_Match_NUM=0; //完全匹配拼音数量
    j=0;                                        //j为匹配最大值
	if(*p_PadInput=='\0')return(0);       //如果输入空字符返回0//

    cInputStrLength=strlen(p_PadInput);     //获取输入拼音串长度//
 

    p_PY_CurrenIndex=&(t9PY_index2[0]);                        //首索引地址赋值,p_PY_CurrenIndex为当前拼音索引地址
    p_PY_LastIndex=t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]);//最后索引地址之后的地址(作下一语句比较用)
	while(p_PY_CurrenIndex < p_PY_LastIndex)  //遍历字母索引表.或者使用语句: while((p_PY_CurrenIndex->t9PY_T9[0])!='\n')                       
	{
        for(i=0;i<cInputStrLength;i++)
        {
               if(*(p_PadInput+i)!=*((*p_PY_CurrenIndex).t9PY_T9+i))    //检查是否匹配
            {
                if (i+1 > j) 
                {
                    j=i+1;                    //j为不匹配字符串中前面字符匹配的最大值,例如:被比较字符串(键盘输入的字符串)为985,相比较的2个字符串(码表索引里面的字符串)为983和953,则j=2
                    p_PY_TempIndex=p_PY_CurrenIndex;
                }
                break;                        //不匹配,退出//
            }            
        }
        if((i==cInputStrLength) && (T9PY_Match_NUM<16))    //匹配,最多16组.匹配并不是指相比较的字符长短一样,不是完全匹配
        {
		
            List_match_PY_Mb[T9PY_Match_NUM]=p_PY_CurrenIndex;//
            T9PY_Match_NUM++;
        }
        p_PY_CurrenIndex++;
    }
     if(j!=cInputStrLength)                 //不匹配但最多匹配字符的1组
        List_match_PY_Mb[0]=p_PY_TempIndex;//
    return (T9PY_Match_NUM);                //输出完全匹配组数,0为无果而终//
}




//=========================================================================
/*
char * t9PY_ime_mb(char *p_PadInput)
{
    if(t9PY_ime(strInput_t9PY_str) > 0)
        return ((*(cpt9PY_Mb[0])).PY_mb);
    else
        return (PY_mb_space);
}
*/


void t9PY_Test(void)
{
    bit PYEnter=0;
    bit HZok=0;
    unsigned char temp;
//    unsigned char temp2;
    unsigned char t9PYn=0;
    char idata inline[16]={0x00};
    idata char chinese_word[3]="  ";
    char tempchar,Add=0,i=0;
    struct t9PY_index *cpTemp;
//    cpTemp=t9PY_index2;
    printf ("\n按键 /:上一拼音 *:下一拼音 .和空格及回车键:输入状态和选字状态切换\n");         //
    printf ("请按键:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz \n");          //
    while(!HZok)
    {
        tempchar=getchar();
        switch (tempchar)
        {
//            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                  if (~PYEnter)
                 {
                    inline[i]=tempchar;
                    i++;
                    Add=0;
                   cpt9PY_Mblen=T9PY_Get_Match_PY_MB(inline,cpt9PY_Mb);
                }
                break;
            case '/':
                if (t9PYn >0) t9PYn --;
                break;
            case '*':
                t9PYn ++;
                if (t9PYn >=cpt9PY_Mblen) t9PYn --;
                break;
            case '-':
                if (Add >= 19) Add -=19;
                break;
            case '=':
            case '+':
                if (Add < strlen((*cpTemp).PY_mb) -19 )Add +=19;
                break;
            case BACKSPACE:
                if (i>0) i--;
                inline[i]=0x00;
                Add=0;
                cpt9PY_Mblen=T9PY_Get_Match_PY_MB(inline,cpt9PY_Mb);
                break;
            case '.':                        //输入状态和选字状态切换
            case ' ':
            case '\n':
                PYEnter ^=1;
                break;
            default     :
                break;
        }

        printf ("                                               \n");
          if (PYEnter)
         {
//            printf ("Choise");
              cpTemp=cpt9PY_Mb[t9PYn];
            if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
            {
                HZok=1;
                t9PYn=0;
                printf ("                                                 \n");
			  	printf ("Target of Chinese word you had selected :  ");
                chinese_word[0]=*((*cpTemp).PY_mb+(Add/2)*2+(tempchar-'1')*2+1);//Add除于2后又乘于2的作用是为了获得偶数(因为拼音码表首字符是'@'而不是汉字)
                chinese_word[1]=*((*cpTemp).PY_mb+(Add/2)*2+(tempchar-'1')*2+2);
                   printf (chinese_word);//显示最后选择的一个汉字
                   printf ("\n");
            }
            else
            {
			printf ("\n\n  The spell of your Selection : ");
                printf ((*(cpTemp)).PY);//输出你选择的拼音
                printf ("\n\n\n press NUM keys to select,or press '+' and '-' for other \n"); 
                   printf ((*cpTemp).PY_mb+(Add/2)*2+1);//显示你选择拼音对应的汉字,供给选择
                   printf ("\n1 2 3 4 5 6 7 8 9\n");
            }
        }
        else 
        {
            printf ("Spell  ");
            for (temp=t9PYn;temp<cpt9PY_Mblen;temp++)
            {
                cpTemp=cpt9PY_Mb[temp];
//                    temp2=((strlen((*(cpTemp)).PY_mb)-Add)/2);
//                    printf ("%2bd:%02bd:",temp,temp2);
                    printf (":");
                    printf ((*(cpTemp)).PY);
//                       printf ((*(cpTemp)).PY_mb+Add);
//                printf ("\n");
            }
//               printf ("\n");
        }
    }
}

//-----以下为测试程序---------------------------------------------------------------------//
#include <REG52.H>
#include <stdio.h>
#ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
    char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
#endif                                   /* Stop Exection with Serial Intr.   */
                                         /* is enabled                        */
void main (void) {
    char input_string[]="98";

/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
    SCON  = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr      */
    TMOD |= 0x20;                /* TMOD: timer 1, mode 2, 8-bit reload        */
    TH1   = 250;                   /* TH1:  reload value for 9600 baud @ 11.0592MHz */
    TR1   = 1;                       /* TR1:  timer 1 run                          */
    TI    = 1;                          /* TI:   set TI to send first char of UART    */
#endif

/*------------------------------------------------
Note that an embedded program never exits (because
there is no operating system to return to).  It
must loop and execute forever.
------------------------------------------------*/
//  printf ("Hello World\n");   /* Print "Hello World" */
    printf ("\n");
//    printf ("%s\n",input_string);
//   printf (t9PY_ime_mb(input_string));
    printf ("按键对应(全部在PC的小键盘操作)\n");
    printf ("        /-上一拼音 *-下一拼音\n"); 
    printf ("7-pqrs  8-tuv     9-wxyz   --前翻页\n");
    printf ("4-ghi    5-jkl       6-mno    +-后翻页\n");
    printf ("1-无效  2-abc    3-def    回车键-输入状态和选字状态切换\n");
    printf ("0-无效             .和空格及回车键-输入状态和选字状态切换\n\n");
	putchar(*(PY_mb_a+1));
	putchar(*(PY_mb_a+2));
    while(1)
    {
        t9PY_Test();
    }
}
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -