这是我在一个项目中用到的T9拼音输入法,基本实现在GB2132的全部输入,多音字的输入处理,标点,拼音,数字等。 本输入法检索快,效率高,字库全,是在一般嵌入式系统中有很好的应用。 字库编码部分较长,没有贴出来,可以下载源码包。请大家下载使用,但要保持magicchip原创。
T9拼音输入法源码下载:https://bbs.21ic.com/upfiles/img/20093/200932711246603.rar 贪吃蛇源码下载:https://bbs.21ic.com/upfiles/img/20093/2009327112542318.rar 俄罗斯方块源码包(有BUG):https://bbs.21ic.com/upfiles/img/20093/2009331105428542.rar
大家如果觉得这些东西对自已有用,就顶一下本贴,也算是对我的支持!!!!!!!
/******************************************************************************* **功能:输入法索引程序 **创建:magicchip **日期:20080509 *******************************************************************************/ void py_index_sub(void) { uint8 i; uint8 flag = 0x55; uint32 temp; uint8 mblentemp; mblentemp = t9pyfun.mblen;
t9pyfun.mblen = 0x00; if ((t9pyfun.pysrf == T9PY) && (t9pyfun.firstno != ' ')) //拼音输入法 { for (i=0;i<t9PY_indexlen[t9pyfun.firstno];i++) { if (t9pyfun.t9py == (*(t9PY_index_headno[t9pyfun.firstno]+i)).t9PY) { t9pyfun.mblen++; flag = 0xaa; t9pyfun.t9PY_addr = (t9PY_index_headno[t9pyfun.firstno]+i); for (i++;i<t9PY_indexlen[t9pyfun.firstno];i++) { if (t9pyfun.t9py == (*(t9PY_index_headno[t9pyfun.firstno]+i)).t9PY) t9pyfun.mblen++; else break; } break; } } if (flag == 0x55) //没有查找完全对应的拼音组合, { for (i=0;i<t9PY_indexlen[t9pyfun.firstno];i++) { temp = (*(t9PY_index_headno[t9pyfun.firstno]+i)).t9PY; while (temp > t9pyfun.t9py) { temp >>= 4; if (temp == t9pyfun.t9py) { t9pyfun.t9PY_addr = t9PY_index_headno[t9pyfun.firstno]+i; t9pyfun.mblen++; i = t9PY_indexlen[t9pyfun.firstno]; flag = 0xaa; break; } } } if (flag == 0x55) { t9pyfun.t9py >>= 4; t9pyfun.mblen = mblentemp; } } } else if(t9pyfun.pysrf == T9SZ) //数字输入 { t9pyfun.mblen++; t9pyfun.t9PY_addr = &t9PY_sz[t9pyfun.firstno]; } else if(t9pyfun.pysrf == T9BD) //标点输入 { t9pyfun.mblen++; t9pyfun.t9PY_addr = t9PY_index0; } else if(t9pyfun.pysrf == T9DX) //大写英文字母输入 { if ((t9pyfun.firstno>1)&&(t9pyfun.firstno<10)) { t9pyfun.mblen++; t9pyfun.t9PY_addr = &t9PY_ABC[t9pyfun.firstno]; } } else if(t9pyfun.pysrf == T9XX) //小写英文字母输入 { if ((t9pyfun.firstno>1)&&(t9pyfun.firstno<10)) { t9pyfun.mblen++; t9pyfun.t9PY_addr = &t9PY_abc[t9pyfun.firstno]; } } }
uint16 straddrx; //字符显示位置 uint16 straddry; uint16 t9pyaddrx; //拼音显示位置 uint16 t9pyaddry; uint16 indexaddrx; //索引显示位置 uint16 indexaddry; uint8 indexdata; //索引值,也即选出的字在索引表中的位置.
uint8 hzbuff[512]; //输入256个汉字 uint16 hzlen; //输放汉字的个数 uint16 hzin; //往缓冲区输入汉字的位置 uint16 hzout; //从缓冲区取出汉字的位置
#define indextablen 15 //每次显示索引处的长度,最大值为15个汉字。
/********************************************************************************************************* ** create by : magicchip ** create data: 2008-06-04 ** 输入数数: ** 功能: 显示输入法 ** 入口参数: ** 出口参数: **------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void dispsrf(void) { const uint8 *strsrf[] = {"标点","大写","小写","拼音","数字"}; const uint8 disp_srf[] = "输入法:"; SetFgColor(RED); SetBgColor(TIANLANSE); SetCharCoord(SRF_X,SRF_Y);
PrintGB((uint8*)disp_srf,4); PrintGB((uint8*)strsrf[t9pyfun.pysrf],2); }
/********************************************************************************************************* ** create by : magicchip ** create data: 2008-06-04 ** 输入数数: ** 功能: 显示字符处光标和拼音处光标 ** 入口参数: ** 出口参数: **------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void dispgb(uint16 gbchar) { SetFgColor(RED); SetBgColor(TIANLANSE); SetCharCoord(straddrx,straddry); PrintoneASCII(gbchar); SetCharCoord(t9pyaddrx,t9pyaddry); PrintoneASCII(gbchar); }
/********************************************************************************************************* ** create by : magicchip ** create data: 2008-06-11 ** 输入数数: ** 功能: 显示输入的内容 ** 入口参数: ** 出口参数: **------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void dispsf(void) { uint8 i=0,j=0; SetFgColor(RED); SetBgColor(TIANLANSE); if (hzlen > 0) //缓冲区内有显示的内容 { SetCharCoord(straddrx,straddry); while(1) { if (hzbuff[hzout] > 0x80) //显示汉字 { PrintoneGB(&hzbuff[hzout]); hzout += 2; straddrx += 16; if (straddrx > 304) { straddrx = 0; straddry += 16; if (straddry > 223) { straddry = 16; SetFgColor(TIANLANSE); Draw_Rect(0x27,0,16,319,223); //清除显示区域 SetFgColor(TIANLANSE); } SetCharCoord(straddrx,straddry); } } else if (hzbuff[hzout] > 0) // 显示ASC { PrintoneASCII(hzbuff[hzout]); hzout ++; straddrx += 8; if (straddrx > 312) { straddrx = 0; straddry += 16; if (straddry > 223) { straddry = 16; SetFgColor(TIANLANSE); Draw_Rect(0x27,0,16,319,223); //清除显示区域 SetFgColor(TIANLANSE); } SetCharCoord(straddrx,straddry); } } else break; } }
t9pyaddrx = 0; SetCharCoord(t9pyaddrx,t9pyaddry); PrintASCII(" "); if (t9pyfun.mblen > 0) //索引内容 { t9pyaddrx = 0; SetCharCoord(t9pyaddrx,t9pyaddry); while(t9pyfun.t9py >> (4*i)) //显示索引拼音 { PrintoneASCII(*((*t9pyfun.t9PY_addr).PY+i)); i++; t9pyaddrx += 8; }
if (*(*t9pyfun.t9PY_addr).PY_mb > 0x80) //显示汉字索引列表 { if (!(*((*t9pyfun.t9PY_addr).PY_mb+indexdata*2))) //设置开始显示索引汉字的位置. { indexdata = 0; i = 0; } else i = 2*indextablen*(indexdata/indextablen); SetCharCoord(indexaddrx,indexaddry); //设置汉字索引表显示的位置. while(*((*t9pyfun.t9PY_addr).PY_mb+i)) //显示索引汉字 { if (i/2 == indexdata) { SetFgColor(WHITE); SetBgColor(BLACK); PrintoneGB((uint8*)(((*t9pyfun.t9PY_addr).PY_mb+i))); i += 2; SetFgColor(RED); SetBgColor(TIANLANSE); } else { PrintoneGB((uint8*)(((*t9pyfun.t9PY_addr).PY_mb+i))); i += 2; } j++; //保证索引列表不溢出 if (j >= indextablen) break; } } else //标点或大小写字母索引显示 { if (!(*((*t9pyfun.t9PY_addr).PY_mb+indexdata))) //设置开始显示索引的位置. { indexdata = 0; i = 0; } else i = 2*indextablen*(indexdata/(2*indextablen)); SetCharCoord(indexaddrx,indexaddry); //设置索引表显示的位置. while(*((*t9pyfun.t9PY_addr).PY_mb+i)) //显示索引字符 { if (i == indexdata) { SetFgColor(WHITE); SetBgColor(BLACK); PrintoneASCII(*((*t9pyfun.t9PY_addr).PY_mb+i)); i ++; SetFgColor(RED); SetBgColor(TIANLANSE); } else { PrintoneASCII(*((*t9pyfun.t9PY_addr).PY_mb+i)); i ++; } j++; //保证索引列表不溢出 if (j >= (2*indextablen)) break; } } } }
/********************************************************************************************************* ** create by : magicchip ** create data: 2008-06-11 ** 输入数数: ** 功能: 初始化索引量,使之清0。 ** 入口参数: ** 出口参数: **------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void clrindex(void) { t9pyfun.firstno = ' '; //初始输入数字按键为空 t9pyfun.mblen = 0; //初始码表长度为0 t9pyfun.mbtimes = 0; //索引切换次数为0 t9pyfun.t9py = 0; //初始按键组合为0 indexdata = 0; }
/********************************************************************************************************* ** create by : magicchip ** create data: 2008-06-04 ** 输入数数: ** 功能: 汉字输入法任务 ** 入口参数: ** 出口参数: **------------------------------------------------------------------------------------------------------- ** Modified by: ** Modified date: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void T9pyTask(void *pdata) { uint8 err; uint16 i; uint8 gbflag; void *key; pdata = pdata;
suspendt9pytask: OSTaskSuspend(T9pyTaskPrio); ClearScreen(TIANLANSE); SetBgColor(TIANLANSE);
hzlen = 0; hzin = 0; hzout = 0; for (i=0;i<512;i++) hzbuff = 0x00;
clrindex(); t9pyfun.pysrf = T9PY; //初始输入法为拼音 straddrx = 0; straddry = 16; t9pyaddrx = 0; t9pyaddry = 224; indexaddrx = 80; //索引显示位置 indexaddry = 224; dispsrf(); OSMboxAccept(KeyMbox); //清除按键 while(1) { key = OSMboxPend(KeyMbox,50,&err); if (err == OS_NO_ERR) { if ((uint32)key == KEY_JH) // 输入法切换 { if ((++t9pyfun.pysrf) > T9SZ) t9pyfun.pysrf = T9DX; dispsrf(); } else if ((uint32)key == KEY_XH) // 输入标点符号, { t9pyfun.mblen++; t9pyfun.t9PY_addr = t9PY_index0; dispsf(); } else if (((uint32)key>=0x30) &&((uint32)key<=0x39)) //输入内容 { if (t9pyfun.pysrf == T9PY) { if (((uint32)key>=0x32) &&((uint32)key<=0x39)) //输入内容 { t9pyfun.mbtimes = 0; indexdata = 0; if (t9pyfun.firstno == ' ') t9pyfun.firstno = (uint32)key-0x30; t9pyfun.t9py = ((t9pyfun.t9py<<4) | ((uint32)key - 0x30)); py_index_sub(); dispsf(); } else if ((uint32)key == T9N00) //索引切换. { t9pyfun.t9PY_addr++; t9pyfun.mbtimes++; indexdata = 0; if (t9pyfun.mbtimes >= t9pyfun.mblen) { t9pyfun.mbtimes = 0; t9pyfun.t9PY_addr -= t9pyfun.mblen; } dispsf(); } else if ((uint32)key == T9N01) //输入空格 { if (hzlen < 255) { hzlen ++; hzbuff[hzin++] = ' '; hzbuff[hzin++] = ' '; clrindex(); dispsf(); } } } else if (t9pyfun.pysrf == T9SZ) //输入数字 { if (hzlen < 255) { hzlen ++; hzbuff[hzin++] = (uint32)key; hzbuff[hzin++] = ' '; clrindex(); dispsf(); } } else if ((t9pyfun.pysrf == T9DX) || (t9pyfun.pysrf == T9XX)) //输入字母 { if (((uint32)key>=0x32) &&((uint32)key<=0x39)) //输入内容 { if (t9pyfun.firstno == ' ') { t9pyfun.mbtimes = 0; indexdata = 0; t9pyfun.firstno = (uint32)key-0x30; t9pyfun.t9py = ((t9pyfun.t9py<<4) | ((uint32)key - 0x30)); py_index_sub(); dispsf(); } } else if ((uint32)key == T9N01) //输入空格 { if (hzlen < 255) { hzlen ++; hzbuff[hzin++] = ' '; hzbuff[hzin++] = ' '; clrindex(); dispsf(); } } } } else if ((uint32)key == KEY_LEFT) { if (t9pyfun.mblen > 0) { if (indexdata == 0) //删除索引拼音 { if ((t9pyfun.t9py > 0) && (t9pyfun.pysrf == T9PY)) { t9pyfun.t9py >>= 4; if (t9pyfun.t9py == 0) clrindex(); else py_index_sub(); dispsf(); } else { clrindex(); dispsf(); } } else { //索引汉字表左移 indexdata--; dispsf(); } } else if (hzlen > 0) //删除输入的汉字. { if (straddrx == 0) { straddrx = 304; straddry -= 16; } else straddrx -= 16; hzlen--; hzbuff[--hzin] = 0; hzbuff[--hzin] = 0; hzout -= 2; SetCharCoord(straddrx,straddry); PrintASCII(" "); } } else if ((uint32)key == KEY_RIGHT) { if (t9pyfun.mblen>0) { indexdata++; dispsf(); } } else if ((uint32)key == KEY_ENTER) { if (t9pyfun.mblen>0) { if (hzlen < 255) { if (*(*t9pyfun.t9PY_addr).PY_mb > 0x80) //输入汉字 { hzlen ++; hzbuff[hzin++] = *((*t9pyfun.t9PY_addr).PY_mb+indexdata*2); hzbuff[hzin++] = *((*t9pyfun.t9PY_addr).PY_mb+indexdata*2+1); clrindex(); dispsf(); } else //输入字符 { hzlen ++; hzbuff[hzin++] = *((*t9pyfun.t9PY_addr).PY_mb+indexdata); hzbuff[hzin++] = ' '; clrindex(); dispsf(); } } else { clrindex(); dispsf(); } } } else if ((uint32)key == KEY_MENU) { OSTaskResume(GuiTaskPrio); //恢复GUI任务 goto suspendt9pytask; } &nb |