📄 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 + -