📄 直接在keil下仿真的t9拼音输入法(完整版).txt
字号:
特点是直接在Keil下仿真,切换到串口窗口就可以直接看到结果。
希望大家喜欢哦
仿真步骤如下:
1、把3个帖子的内容分别保存为51t9py.c,51t9py_indexa.h,5py_mb.h,放在同一目录下,将51t9py.c加入工程编译
2、由于Keil的模拟串口是单字节显示,汉字显示为乱码,所以要加挂RICHWIN或RichView这种会重新刷新显示的中文平台,或手工刷新屏幕,所以请先到 http://www.pchome.net/dl/chinese.htm 下载RichView,安装运行
3、在Keil环境下可以直接按“Ctrl+F5”键仿真,按“F5”全速运行,切换到在串口依次输入: //
64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6试试:-)
4、按键对应(根据我自己的手机设置的,全部在PC的小键盘操作): //
Num /:上一拼音?*:下一拼音 //
7:pqrs 8:tuv 9:wxyz -:前翻页 //
4:ghi 5:jkl 6:mno +:后翻页 //
1:? 2:abc 3:def 回车键:输入状态和选字状态切换 //
0:? .和空格及回车键:输入状态和选字状态切换 //
*/
//请把这个帖子的内容保存为51t9py.c
//--------------------------------------------------------------------------//
// 源程序大公开 //
// (c) Copyright 2001-2003 xuwenjun //
// All Rights Reserved //
// V1.00 //
//--------------------------------------------------------------------------//
//标 题: T9拼音输入法模块 //
//文件名: 51t9py.c //
//版 本: V1.00 //
//修改人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 05-4-8 //
//描 述: T9拼音输入法模块 //
//声 明: //
// 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
// 如用于商业用途请与作者联系. E-mail:xuwenjun@21cn.com //
// 有问题请mailto xuwenjun@21cn.com 欢迎与我交流! //
//--------------------------------------------------------------------------//
//老版本: 无 老版本文件名: //
//创建人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 02-11-05 //
//描 述: //
// 1、很久以前的程序,根据网友张 凯、李 强的51py输入法子程序改编, //
// 增加索引、完善主程序、测试程序,使之在Keil下直接仿真 //
// 2、在Keil环境下可以直接按“Ctrl+F5”键仿真,切换到在串口依次输入: //
// 64*.6 426***.5 98*.7 936.3 586.1 4826*.1 9464*.7 64*.6试试:-) //
// 3、由于Keil的模拟串口是单字节显示,汉字显示为乱码,所以要加挂 //
// RICHWIN或RichView这种会重新刷新显示的中文平台,或手工刷新屏幕 //
// (RichView可以到 http://www.pchome.net/dl/chinese.htm 下载) //
// 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"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];
unsigned char t9PY_ime(char *strInput_t9PY_str)
{
struct t9PY_index *cpHZ,*cpHZedge,*cpHZTemp;
unsigned char i,j,cInputStrLength;
cpt9PY_Mblen=0; //完全匹配组数
j=0; //j为匹配最大值
cInputStrLength=strlen(strInput_t9PY_str); //输入拼音串长度//
if(*strInput_t9PY_str=='\0')return(0); //如果输入空字符返回0//
cpHZ=&(t9PY_index2[0]); //查首字母索引//
cpHZedge=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) && (cpt9PY_Mblen<16)) //字母串全配,最多8组
{
cpt9PY_Mb[cpt9PY_Mblen]=cpHZ;
cpt9PY_Mblen++;
}
cpHZ++;
}
if(j!=cInputStrLength) //不完全匹配输出最多匹配的1组
cpt9PY_Mb[0]=cpHZTemp;
return (cpt9PY_Mblen); //输出完全匹配组数,0为无果而终//
}
char * t9PY_ime_mb(char *strInput_t9PY_str)
{
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;
t9PY_ime(inline);
}
break;
case '/':
if (t9PYn >0) t9PYn --;
break;
case '*':
t9PYn ++;
if (t9PYn >=cpt9PY_Mblen) t9PYn --;
break;
case '-':
if (Add >= 12) Add -= 12;
break;
case '=':
case '+':
if (Add < strlen((*cpTemp).PY_mb) -12 )Add += 12;
break;
case BACKSPACE:
if (i>0) i--;
inline[i]=0x00;
Add=0;
t9PY_ime(inline);
// cpTemp=cpt9PY_Mb[t9PYn];
break;
// case '\n':
case '.': //输入状态和选字状态切换
case ' ':
case '\n':
PYEnter ^=1;
break;
default :
// HZok=1;
break;
}
printf (" \r");
if (PYEnter)
{
printf ("选");
cpTemp=cpt9PY_Mb[t9PYn];
if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
{
HZok=1;
t9PYn=0;
printf (" \r");
// printf ("%s\n",inline);
chinese_word[0]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2);
chinese_word[1]=*((*cpTemp).PY_mb+Add+(tempchar-'1')*2+1);
printf (chinese_word);
printf ("\n");
}
else
{
// printf ((*(cpTemp)).PY);
printf (":");
printf ((*cpTemp).PY_mb+Add);
// printf ("\n拼音1 2 3 4 5 6 7 8 9\r");
}
}
else
{
printf ("拼");
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";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -