阅读:1518回复:3
T9输入法主程序
雁舞白沙 发表于21IC BBs 2003-1-4 15:54 转自技术交流:
实用的程序---T9输入法---主程序 //========================================主程序体========================================" unsigned char py_ime(unsigned char code **pchp,unsigned char input_py_val[]) { unsigned char code (*p1)[8],(*p2)[8],(*p3)[8]; unsigned char i=0; if (input_py_val[0]==0) return(0); //如果输入空字符返回0" if (input_py_val[0]=='i') return(0); if (input_py_val[0]=='u') return(0); if (input_py_val[0]=='v') return(0); p1=p2=PY_index_pointer[input_py_val][0]-0x61]; //计算入口树根" p3=PY_index_pointer[input_py_val][0]-0x60]; //设置指针界限" if (p1==0) return(0); //查询失败返回0" i=1; while (p1<p3){//查找 if(input_py_val==' ') break; //如果找到空格,就不再向下查找 if ((*p1)[i-1]==input_py_val) //条件满足,继续向下找 { if(i>1){ if ((*p1)[i-2]!=input_py_val[i-1]) break; } //如果已经比较一个,再比较下一次时,上一个也相等,若不等,则不再比较 p2=p1; i++; } else p1++; } //查找 *pchp=(unsigned char code *)((*p2)[6]+(*p2)[7]*256+py_mb_begin); //返回查询结果首地址" return i; //返回正确匹配个数,当为零时,即一个也没有匹配上 } void strto20h(unsigned char *buf,unsigned char n) { //用于清空字符串,将串清空成空格20 uchar i; for(i=0;i<n;i++) buf=0x20; } //用于清空字符串,将串清空成空格20 //将输入的汉字或字符显示在当前LCDX,LCDY的位置返回值为输入字符或汉字长度,一个汉字占两个数 unsigned int pyinput(unsigned char *pbuf,unsigned int len) { /存贮位置,最常输入数 uchar x,y; //用于记录显示地址 uchar pybuf[6]; //用于存贮输入的拼音字母 uint ibuf; //INT型临时变量 uchar pyi; //用于存贮 输入字母指针 uchar keyi; //用于存贮上一次的键值,即指明按的哪一个键,选择字母时用 uchar fxi; //方向记数,当为0时,不显示,也不起作为,当用方向键后,确认键也起作用 uchar fyi; //分页键,用在汉字显示分页用,一页13个汉字 uchar inputlen; //当屏文字长度,记事本,编辑最多只能编一屏,如果有第二屏,第一屏不能修改 uchar bzpy; //用于指明是拼音输入还是英文输入当为0时为数字输入,当为1时,为英文,当为2时, 拼音 if(len>239) { qdcx(); return 0; } //当总长度大于一屏时,长响,并返回0 bzpy=0; //初始化为数字 inputlen=0; //初始化为0即本次还未输入一个汉字 linestate=0; //先定义各行状态为0,只有换行时不完成,才置1 x=lcdx;y=lcdy; xszfhz('_',0); //显示光标 lcdx=0;lcdy=112; xsstr(pystr1,1,0); //返着显示,长度不受限制显示拼音 bzpyinput1: //当执行了中英文切换,跳到此处 strto20h(pybuf,6); //将输入字母空间清空 pyi=0; //未输入字母时,地址为0 lcdx=0;lcdy=96; if(bzpy<1) xsstr(pystr2+0,1,2); //当为0时,为数字输入 else if(bzpy<2) xsstr(pystr2+2,1,2); //当为1时,为英文 else xsstr(pystr2+4,1,2); //其它为拼音 lcdx=2;lcdy=96; xsnkb(0); //清掉无用信息,在提示行,其它行不管 if(bzpy<1) { //当为0时为数字输入 bzpysz: key=rbkey(); //等待一个值的输入 switch(key){ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: key=key+0x30; bzpysz1: if(inputlen>len-1) { //如果已经输入够数,再按数字键,不予处理 qdcx(); goto bzpysz; } //如果已经输入够数,再按数字键,不予处理 lcdx=x;lcdy=y; pbuf[inputlen]=key; xszfhz(key,0); //显示字母 x=lcdx;y=lcdy; //重新取回输入的汉字 xszfhz('_',0); //显示光标 inputlen++; //记数自动加1 goto bzpysz; //输入完数字后, case 10: //. key='.'; goto bzpysz1; case 11: //* key='*'; goto bzpysz1; case 12: // / key='/'; goto bzpysz1; case 13: //+ key='+'; goto bzpysz1; case 14: //- key='-'; goto bzpysz1; case 15: //= key='='; //借用KEY暂存符号 goto bzpysz1; case 16: if(bzpy<2) bzpy++; //如果小于2,则加1 else bzpy=0; //返回到数字输入 goto bzpyinput1; //重新显示中英文方式 case 17: //取消键,每按一次,当前位置的输入将删除 lcdx=x;lcdy=y; xszfhz(' ',0); //将原光标清掉 if(inputlen<1) return 0; //如果一个字母也没有输入,取消键退出 inputlen--; //总长度自动减1 if(pbuf[inputlen]>0xa0){ pbuf[inputlen]=0x20; //给一个空格 inputlen--; pbuf[inputlen]=0x20; //给一个空格 if(x>1) x-=2; else { y-=16; x=28; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //当已经清掉了该行,则该位也应该清掉 } //当需要换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 xszfhz(' ',0); } //即要删除的是汉字 else { pbuf[inputlen]=0x20; //给一个空格 if(x>0) x--; else { y-=16; x=29; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //清完一个后,且换行,有空位,清掉该标志 } //当需要换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 } //删除的是字母 goto bzpysz; //返回重新输入 case 20: return inputlen; //当按确认键返回时,返回输入数量 default: qdcx(); //不是有效的键值,长响 } //键值处理 goto bzpysz; } //数字输入 else if(bzpy<2){ //当为1时,为英文输入 bzpyinputyw: //英文输入跳转位 key=rbkey(); //取出一个键值 switch(key){//键值处理 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: keyi=key; //取出当前键值,进入显示提示信息阶段 fxi=0; //开始时第一个字母返显不处理翻页 break; case 10: //. key='.'; goto bzpyinputywt; case 11: //* key='*'; goto bzpyinputywt; case 12: // / key='/'; goto bzpyinputywt; case 13: //+ key='+'; goto bzpyinputywt; case 14: //- key='-'; goto bzpyinputywt; case 15: //= key='='; //借用KEY暂存符号 bzpyinputywt: //特殊符号处理+-*/=等 lcdx=x;lcdy=y; pbuf[inputlen]=key; xszfhz(key,0); //显示字母 goto bzpyinputywz1; //直接取出字符,上屏 case 16: if(bzpy<2) bzpy++; //如果小于2,则加1 else bzpy=0; //返回到数字输入 goto bzpyinput1; //重新显示中英文方式 case 17: //取消键,每按一次,当前位置的输入将删除 lcdx=x;lcdy=y; xszfhz(' ',0); //显示空格,清掉原来的光标 if(inputlen<1) return 0; //如果一个字母也没有输入,取消键退出 inputlen--; //总长度自动减1 if(pbuf[inputlen]>0xa0){ pbuf[inputlen]=0x20; //给一个空格 inputlen--; pbuf[inputlen]=0x20; //给一个空格 if(x>1) x-=2; else { y-=16; x=28; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //当已经清掉了该行,则该位也应该清掉 } //当需要换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 xszfhz(' ',0); } //即要删除的是汉字 else { pbuf[inputlen]=0x20; //给一个空格 if(x>0) x--; else { y-=16; x=29; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //清完一个后,且换行,有空位,清掉该标志 } //当需要换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 } //删除的是字母 goto bzpyinputyw; //返回重新输入 case 20: return inputlen; //当按确认键返回时,返回输入数量 default: qdcx(); goto bzpyinputyw; } //键值处理 bzpyinputyw1: //正确显示字母后,通过提供信息选择 if((keyi==1)||(keyi==7)||(keyi==9)){ lcdx=24;lcdy=96; xsstr(pystry[keyi],0,5); //显示5个可选字母 lcdx=24+fxi;lcdy=96; xsstr(pystry[keyi]+fxi,1,1); //将所选字母返显 lcdy=96; lcdx=16; //和显示特殊字符首址一样 xsnkb(8); //若提示信息前有其它,清掉 } //有5个字母可选, else if(keyi==0){ //特殊符号提示 lcdx=16;lcdy=96; xsstr(pyfhy,0,13); //显示特殊符号 lcdx=16+fxi;lcdy=96; xsstr(pyfhy+fxi,1,1); //将所选的特殊符号反显 } //特殊符号提示 else { //四个字符的显示 lcdx=25;lcdy=96; xsstr(pystry[keyi],0,4); //显示四个字母的提示 lcdx=25+fxi;lcdy=96; xsstr(pystry[keyi]+fxi,1,1); //反显所选字母 lcdy=96; lcdx=16; //和显示特殊字符首址一样 xsnkb(9); //若前面有信息,将之清掉 } //四个字符的显示 bzpyinputyw2: //选择字母无效,反回来重新选择 key=rbkey(); switch(key){//选择提示的字母 case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: if((keyi==1)||(keyi==7)||(keyi==9)){ if((key>0)&&(key<6)) break; //当选择12345时,正常 } //如果为5个显示字母 else if(keyi>0) { //不是第一种情况,且大于0,即是正常四个字母显示 if((key>0)&&(key<5)) break; } //正常的四个字母显示 else { //当为0时,即为特殊字符 if(key>0) break; //特殊字符是,1到9都有效, }//当为0时,即为特殊字符 qdcx(); goto bzpyinputyw2; //不满足以上条件时,即为无效数字,长响,返回 case 16: if(bzpy<2) bzpy++; else bzpy=0; //如果小于2,则加1,否则为0,返回到数字输入 lcdx=2;lcdy=96; xsnkb(0); //将后面的部分全部显示空格 goto bzpyinput1; //重新显示中文或英文 case 17: //取消键,清掉当前字母提示,返回秤新输入 lcdx=2;lcdy=96; xsnkb(0); goto bzpyinputyw; //返回去重新开始英文输入 |
|
|
1楼#
发布于:2003-01-09 07:37
T9输入法主程序
接上:
case 18: //左方向键 if(fxi>0) fxi--; else qdcx(); //如果到头,则不动 goto bzpyinputyw1; //回去重新选择 case 19: //右方向键 if((keyi==1)||(keyi==7)||(keyi==9)){ if(fxi<4) fxi++; //5字母提示,01234 else fxi=0; } //如果为5个显示字母 else if(keyi>0) { //不是第一种情况,且大于0,即是正常四个字母显示 if(fxi<3) fxi++; //当为四个字母显示时,0 123 else fxi=0; } //正常的四个字母显示 else { //当为0时,即为特殊字符 if(fxi<12) fxi++; //0123456789 10 11 12 else fxi=0; }//当为0时,即为特殊字符 goto bzpyinputyw1; //回去重新显,并显法标标位置 case 20: //确认键,直接进入下一列模拟数字选择,修改KEY key=fxi+1; //和数字键选择相当 break; default: qdcx(); goto bzpyinputyw1; //重新选择字母 } //选择提示的字母 bzpyinputywz: //正确选择字母后,作上屏显示结果结果在KEYI和key中 if(inputlen>len-1){ //如果已经输入够数,再按数字键,不予处理 qdcx(); lcdx=2;lcdy=96; xsnkb(0); //将原来显示的提供信息清掉,进入下一个字母的显示 goto bzpyinputyw; } //如果已经输入够数,再按数字键,不予处理 lcdx=x;lcdy=y; key--; if(keyi>0){//正常的数字键,不是特殊符号 pbuf[inputlen]=*(pystry[keyi]+key); xsstr(pystry[keyi]+key,0,1); //在指定位置显示 } //正常的数字键,不是特殊符号 else { //特殊的数字符号 pbuf[inputlen]=*(pyfhy+key); xsstr(pyfhy+key,0,1); //显示特殊符号 } //特殊的数字符号 bzpyinputywz1: //用在+-*/.号的直接处理 x=lcdx;y=lcdy; //重新取回输入的汉字 xszfhz('_',0); //显示光标 inputlen++; //记数自动加1 lcdx=2;lcdy=96; xsnkb(0); //将原来显示的提供信息清掉,进入下一个字母的显示 goto bzpyinputyw; //进入下一个字母的选择 }//为英输入法 else {//当为2时,为拼音输入,如果以后增加,则改成else if bzpyinputpy: //拼音输入跳转位 key=rbkey(); bzpyinputpyd: //动态显示汉字时,再输入字母 switch(key){ //拼音输入键处理 case 0: //特殊符号,直接进入汉字选择状态,和汉字一样处理 pch=pyfh; //显示符号将首指针找到,相相于拼音输入找到 pyi=1; //保证按取消键时,清掉 fxi=0; //方向键初始化为0 fyi=0; //分页键初始化为0 goto bzpyhz2; //直接进入汉字选择状态 case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: keyi=key; //保存字母序列 fxi=0; //初始化方向标志为0 break; case 16: if(bzpy<2) bzpy++; else bzpy=0; //如果小于2,则加1,否则为0,返回到数字输入 goto bzpyinput1; //重新显示中英文方式 case 17: //取消键,每按一次,当前位置的输入将删除 lcdx=x;lcdy=y; xszfhz(' ',0); //显示一个空格,将原来的光标清掉 if(inputlen<1) return 0; //如果一个字母也没有输入,取消键退出 inputlen--; //总长度自动减1 if(pbuf[inputlen]>0xa0){ pbuf[inputlen]=0x20; //给一个空格 inputlen--; pbuf[inputlen]=0x20; //给一个空格 if(x>1) x-=2; else { y-=16; x=28; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //清完一个后,且换行,有空位,清掉该标志 } //当换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 xszfhz(' ',0); } //即要删除的是汉字 else { pbuf[inputlen]=0x20; //给一个空格 if(x>0) x--; else { y-=16; x=29; key=1; key=key<<(y/16); //借用KEY暂存位比较值 因后面没有用KEY值 if(linestate&key){ x--; //当有空格时,X值再减1 linestate=linestate^key; //异或,清掉该位 } //清完一个后,且换行,有空位,清掉该标志 } //当需要换行时 lcdx=x;lcdy=y; xszfhz('_',0); //显示光标 } //删除的是字母 goto bzpyinputpy; //返回重新输入 case 20: //确认键处理,当输入拼音时,完成,当没有时,作编辑完成 if(pyi>0) goto bzpyhz1; //字母输入完毕,开始查找汉字 else{ return inputlen; //返回输入长度 } //完成汉字输入,对输入汉字进行处理 default: qdcx(); goto bzpyinputpy; //当不是有效键时,长响,重新输入 } //拼音输入键处理 //输入字母键,下面为选择字母 bzpyinputpy1: //拼音输入字母选择 lcdx=9;lcdy=96; xsnkb(16); //字母选择前清掉 lcdx=25;lcdy=96; xsstr(pystrp[keyi],0,4); //显示字母提供 lcdy=96; if((keyi==7)||(keyi==9)){ lcdx=fxi+25; xsstr(pystrp[keyi]+fxi,1,1); } //当为四个字母地, else { lcdx=fxi+26; //三个字母,向后一个位置 xsstr(pystrp[keyi]+fxi+1,1,1); }//当为三个字母显示时 key=rbkey(); //有字母提供,按键选择 switch(key){//选择字母 case 1: case 2: case 3: case 4: bzpyinputpy2: //通过确认键选择的,转到此处处理 if((keyi==7)||(keyi==9)) key--; //当显示四个字母时,从0开始取地址, else if(key==4) { qdcx(); goto bzpyinputpy1; //重新选择数字键 } //当显示三个字母时,输入4无效,应长响 pybuf[pyi]=pystrp[keyi][key]; //取出输入的字母 pyi++; //下一次取字,就放在下一个位置 lcdx=2;lcdy=96; xsstr(pybuf,0,6); //显示输入字母 lcdx=14;lcdy=96; xsnkb(0); //将后面显示的清掉 goto bzpyhz1; //每输入一个字母,均进行一次比较,显示 case 16: if(bzpy<2) bzpy++; else bzpy=0; //如果小于2,则加1,否则为0,返回到数字输入 lcdx=2;lcdy=96;xsnkb(0); //跳回之前将显示的提示清掉 goto bzpyinput1; //重新显示中英文方式 case 17: //当按取消键时,取消本次输入 if(pyi<1){ lcdx=14;lcdy=96;xsnkb(0); //清掉显示的字母提示 goto bzpyinputpy; //清掉显示的字母,返回重新输入, } //当按取消键时,一个字母也没有输入,则清掉,返回去重新显示 else goto bzpyhz1; //重新进入汉字提示状态 case 18: //向左方向键 if(fxi>0) fxi--; else qdcx(); goto bzpyinputpy1; //回去重新选择字母 case 19: //向右方向键 if((keyi==7)||(keyi==9)){ if(fxi<3) fxi++; //实际显示的位置还是0123 else fxi=0; //如果转一圈,则为1 }//如果为四个字母显示 else { if(fxi<2) fxi++; //实际显示的位置还是012 else fxi=0; } //三个字母显示 goto bzpyinputpy1; //回去重新选择字母 case 20: //确认键, key=fxi+1; //模拟数字选择 goto bzpyinputpy2; //和数字选择一样处理 default: qdcx(); goto bzpyinputpy1; } //选择字母 bzpyhz1: //输入完字母组后,进行汉字查找 key=py_ime(&pch,pybuf); if(key==0){ lcdx=2;lcdy=96; xsstr(pycwcz,0,0); //显示查无此字! yan1s(); goto bzpyhzz; //显示完了,从新开始汉字输入 } //当未查到时,显示查无此字 else if(key<pyi){ //当输入两个字母时,如果KEY还等于1,说明后面不符合组合 qdcx(); //长响一声,表明输入有误 pyi--; //输入字母数自动减1 pybuf[pyi]=0x20; //将刚才输入的字母清掉 lcdx=2;lcdy=96; xsstr(pybuf,0,6); //显示输入字母 goto bzpyhz2; //进入重新显示汉字状态 } //没有这种字母组合,返回重新输入 else { //字母有效 fxi=0; //方向键初始化为0 fyi=0; //分页键初始化为0 bzpyhz2: //如果汉字选择无效,返回重新选择,也是特殊符号入口 lcdx=9;lcdy=96; //前面空半格,后面空半格,最多一屏显示13个汉字 xsstr(pch+fyi*20,0,20); //显示输入汉字,最多显示13个,可通过数字选择 if(lcdx>2) xsnkb(0); //将余下部分显示为空格,如果有的话 lcdx=9+fxi*2;lcdy=96; ibuf=fyi*20; xsstr(pch+ibuf+fxi*2,1,2); //反显一个汉字,表明当前所选汉字 keyi=strlen(pch+ibuf); //取出从当前页开始余下部分字符串的长度 keyi--; //总长减1,得到正确长度,最后的 不要 key=rbkey(); //汉字提供完成后, switch(key){ //汉字提供完成后,开始选择汉字 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: goto bzpyinputpyd; //在汉字输入状态按数字键,转回拼音输入处理 bzpyhz5: //通过确认键完成的选择,最终相当于数字键 if(inputlen>len-1){ //当输入的汉字数达到一定数量时,提示信息 qdcx(); break; } //当输入的数字超过指定的数字时,不再处理 lcdx=x;lcdy=y; key--; key*=2; ibuf=key+fyi*20; xsstr(pch+ibuf,0,2); //显示一个汉字 x=lcdx;y=lcdy; //重新取回输入的汉字 xszfhz('_',0); //显示光标 pbuf[inputlen]=*(pch+ibuf); pbuf[inputlen+1]=*(pch+ibuf+1); inputlen+=2; //记数自动加2 break; //正确选择汉字后,完成本部分 case 13: //向左翻页 bzpyhz3: //当方向键减少到0时,转入翻页 if(fyi>0){ fyi--; //若翻到头,就翻不动 fxi=0; //每翻一个新页,方向键为0 } //翻页 else qdcx(); //不让翻页 goto bzpyhz2; //再次选择汉字 case 14: //向右翻面 bzpyhz4: //当方向键增加到后面时,转入翻页处理 if(keyi>20) fyi++; else fyi=0; //如果到头,则从新开始 fxi=0; goto bzpyhz2; //再次选择汉字 case 16: if(bzpy<2) bzpy++; else bzpy=0; //如果小于2,则加1,否则为0,返回到数字输入 lcdx=2;lcdy=96;xsnkb(0); //跳回之前将显示的提示清掉 goto bzpyinput1; //重新显示中英文方式 case 17: pyi--; //输入字母数自动减1 pybuf[pyi]=0x20; //将刚才输入的字母清掉 lcdx=2;lcdy=96; xsstr(pybuf,0,6); //显示输入字母 if(pyi<1){ lcdx=2;lcdy=96; xsnkb(0); goto bzpyinputpy; //重新输入字母 } //当为0时,重新输入字母,并清屏 else goto bzpyhz1; //重新查找汉字 case 18: //左方向键 if(fxi>0) fxi--; else goto bzpyhz3; //当方向键减少到0时,转入翻页 goto bzpyhz2; //再次选择汉字 case 19: //右方向键 if((fxi<9)&&(fxi<keyi/2)) fxi++; //当未到尾,且有效 else goto bzpyhz4; //当方向键增加到后面时,转入翻页处理 goto bzpyhz2; //再次选择汉字 case 20: //确认键处理,模拟键值选择 key=fxi+1; //取出当前的位置 goto bzpyhz5; //通过确认键完成的选择,最终相当于数字键 default: qdcx(); goto bzpyhz2; //不是有效键时,返回,重新选择 } //汉字提供完成后,开始选择汉字 } //查到汉字串,显示汉字串 bzpyhzz: lcdx=2;lcdy=96; xsnkb(0); //清空信息提供行 pyi=0; //清空拼音输入行,下一次从头开始 strto20h(pybuf,6); //将输入字母空间清空 goto bzpyinputpy; //进行下一个汉字的输入 }//为拼音输入法 return inputlen; //返回输入长度一个汉字算两个字节 } //输入法输入 |
|
|
3楼#
发布于:2006-04-05 18:10
|
|