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

📄 61t9_input.c

📁 单片机拼音输入代码 单片机使用的是HETEK061A
💻 C
字号:
//==========================================================================//
//	文件名称:	61T9_Input.c  												//	
//	功能描述:	T9拼音输入法模块 											//	
//	维护记录:	2005-11-10	v1.0											//
//==========================================================================//
//																			//
//                                小丑  Mz出品                              //
//                            All Rights Reserved                           //
//                                    V1.0                                  //
//声 明:                                                                   //
//        以下代码仅提供给网友免费学习使用,非商业用途	                    //
//--------------------------------------------------------------------------//
//描 述:                                                                   //
//       1、根据网友张凯、徐文军先生的PY输入法子程序改编,增加索引、完善主程//
//			序、修改输入法信息收集的数据整合,使之更方便不同用户使用不同的显//
//			示器接口API,并使之可在unSP IDE下进行仿真。						//
//       2、由于unSP IDE不支持中文的调试信息输出,所以在调试时,用户是看不到//
//			信息的,不过本工程还是保留了此项功能,以便后续有可能的情况:)  //
//		 3、用户想看调试结果时,最好在断点处,观察Temp_HZGet当中的元素,在  //
//			IDE的变量观察窗当中可以看到中文。								//
//       4、按键对应(根据我自己的手机设置的,全部在PC的小键盘操作):         //
//          Num                /:上一拼音?*:下一拼音                        //
//          7:pqrs    8:tuv    9:wxyz   -:前翻页                            //
//          4:ghi    5:jkl    6:mno    +:后翻页                             //
//          1:?    2:abc    3:def   回车键:输入确认,每一次输入都以回车结束//
//          0:删掉一个字母           .和空格:输入状态和选字状态切换         //
//--------------------------------------------------------------------------//
#include <string.h>
#include <stdio.h>
#include "PY_mb.h"
#include "61T9PY_index.h"

//
struct T9PY_Show Temp_HZGet;
//========================================================================
//	语法格式:	unsigned char t9PY_ime(char *strInput_t9PY_str)
//	实现功能:	查找完全匹配的索引数据,for T9
//	参数:		char *strInput_t9PY_str 	当前输入的字符串
//	返回值:	输出完全匹配的字符串个数,为0时表示无结果
//========================================================================
unsigned char t9PY_ime(char *strInput_t9PY_str)
{
    struct T9PY_Index *cpHZ,*cpHZedge,*cpHZTemp;
    unsigned char i,j,cInputStrLength;

    Temp_HZGet.CPT9_PY_Number = 0;                 //完全匹配组数
    j = 0;                                        //j为匹配最大值
    cInputStrLength=strlen(strInput_t9PY_str);     //输入拼音串长度//
    if(*strInput_t9PY_str=='\0')return(0);       //如果输入空字符返回0//

    cpHZ=&(t9PY_index2[0]);                        //查首字母索引//
    cpHZedge=(struct T9PY_Index*)(t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]));
//    strInput_t9PY_str++;                        //指向拼音串第二个字母//
    while(cpHZ < cpHZedge)                       //待查询记录条数
    {
        for(i=0;i<cInputStrLength;i++)
        {
               if(*(strInput_t9PY_str+i)!=*((*cpHZ).t9PY_T9+i))    //检查字符串匹配
            {
                if (i+1 > j) 
                {
                    j=i+1;                    //j为匹配最大值
                    cpHZTemp=cpHZ;
                }
                break;                        //发现字母串不配,退出//
            }            
        }
        if((i==cInputStrLength) && (Temp_HZGet.CPT9_PY_Number<16))    //字母串全配,最多8组
        {
            Temp_HZGet.CPT9_PY_Mb[Temp_HZGet.CPT9_PY_Number] = cpHZ;
            Temp_HZGet.CPT9_PY_Number++;
        }
        cpHZ++;
    }
     if(j!=cInputStrLength)                  //不完全匹配输出最多匹配的1组
        Temp_HZGet.CPT9_PY_Mb[0]=cpHZTemp;
    return (Temp_HZGet.CPT9_PY_Number);      //输出完全匹配组数,0为无果而终//
}
//========================================================================
//	语法格式:	void T9PY_Get(void)
//	实现功能:	T9输入法控制程序,包括显示控制和检索等,用户可以修改里面的
//				有关显示部分的代码,使用printf和scanf仅为调试而已
//	参数:		无
//	返回值:	无
//========================================================================
void T9PY_Get(void)
{
    unsigned char temp;				//中间变量
    unsigned int Update_flag=0;
    //....just for test
    char name[1];
    //....end
    char tempchar;
    struct T9PY_Index *cpTemp;
    //初始化有关拼音输入时刷新及最终结果的结构体
    for(temp=0;temp<8;temp++)
    	Temp_HZGet.PY_String[temp] = 0;
    Temp_HZGet.PY_String_Index = 0;
    Temp_HZGet.HZ_Add = 0;
    Temp_HZGet.HZ_GB[1] = 0;
    Temp_HZGet.PY_T9Number = 0;
    Temp_HZGet.HZ_Select = 0;
    Temp_HZGet.HZ_Over = 0;
   
    printf ("请按键:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz \n");          //
    while(!(Temp_HZGet.HZ_Over))
    {
        scanf( "%s",name);
        tempchar = *name;
        if(tempchar!=0)
        {
        	Update_flag = 1;	//显示刷新标志位
        	switch (tempchar)
        	{
	            case '1':
    	        case '2':
        	    case '3':
	            case '4':
	            case '5':
	            case '6':
	            case '7':
	            case '8':
	            case '9':			//符合要求的拼音字母输入,则进行设整
          		  	if (~Temp_HZGet.HZ_Select)
            		{
						Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = tempchar;
						Temp_HZGet.PY_String_Index++;
						Temp_HZGet.HZ_Add = 0;
						if(!(t9PY_ime(Temp_HZGet.PY_String)))
						{						//若输入无效,则删掉当前输入的字母
							Temp_HZGet.PY_String_Index--;
							Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = 0;
							t9PY_ime(Temp_HZGet.PY_String);//重新调整
						}
					}
                	break;
            	case '/':						//符合索引的拼音串的索引号指向下一个
               		if(Temp_HZGet.PY_T9Number > 0)Temp_HZGet.PY_T9Number--;
                	break;
            	case '*':						//符合索引的拼音串的索引号指向上一个
                	Temp_HZGet.PY_T9Number++;
                	if(Temp_HZGet.PY_T9Number > Temp_HZGet.CPT9_PY_Number)Temp_HZGet.PY_T9Number--;
                	break;
            	case '-':						//汉字显示时向上翻页
                	if(Temp_HZGet.HZ_Add > 12) Temp_HZGet.HZ_Add -= 12;
                	break;
            	case '+':						//汉字显示时向下翻页
                	if(Temp_HZGet.HZ_Add < strlen((*cpTemp).PY_mb)-12) Temp_HZGet.HZ_Add+=12;
                	break;
            	case '0':						//按0键,则删除刚输入的一个字母
                	if(Temp_HZGet.PY_String_Index>0) Temp_HZGet.PY_String_Index--;
                	Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = 0x00;
                	Temp_HZGet.HZ_Add = 0;
                	t9PY_ime(Temp_HZGet.PY_String);
                	break;
            	case '.':                        //输入状态和选字状态切换
            	case '\n':
            	case '=':
                	Temp_HZGet.HZ_Select ^=1;
                	break;
            	default:
            		Update_flag = 0;			//假如是没有定义的键按下,则不允许显示刷新
                	break;
        	}
        }
        //....可在此处清看门狗
        if(Update_flag!=0)						//当显示刷新非零时,表示有效键按下了,需要刷新
        {
        	Update_flag = 0;					//置零
        	if (Temp_HZGet.HZ_Select)				//已有回车键按下后,即当前处于选字状态
        	{
        		printf ("选");
        		cpTemp=(struct T9PY_Index *)Temp_HZGet.CPT9_PY_Mb[Temp_HZGet.PY_T9Number];
        		if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
        		{								//判断当前的按键是否符合选字要求?即在选字状态下有1~9键按下
        			Temp_HZGet.HZ_Over = 1;		//结束标识置1
                	Temp_HZGet.PY_T9Number = 0;
                								//获取拼音输入结果,得到的是汉字的GB码,十六位
               		Temp_HZGet.HZ_GB[0] = *((*cpTemp).PY_mb+Temp_HZGet.HZ_Add+(tempchar-'1'));
                	printf ("\n");
            	}
            	else
            	{								//显示当前可选的汉字,用户可根据自己的显示器接口函数修改代码
            		printf (":"); 
                	printf ((*cpTemp).PY_mb+Temp_HZGet.HZ_Add);
            	}
        	}
        	else 
        	{									//以下代码显示当前的拼音字母串,用户可据自己的显示器接口修改
            	printf ("拼");
       			for(temp = Temp_HZGet.PY_T9Number;temp<Temp_HZGet.CPT9_PY_Number;temp++)
            	{								//可加入显示控制,以控制当前一行显示多少个串
                	cpTemp=(struct T9PY_Index *)Temp_HZGet.CPT9_PY_Mb[temp];
                    printf (":");
                    printf ((*(cpTemp)).PY);
            	}
				printf ("\n");					//.....
        	}
        }
    }
}

⌨️ 快捷键说明

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