本帖最后由 xcc521 于 2018-6-26 00:22 编辑
可能是不太习惯9键输入法吧,用习惯了26键输入法,于是决定给开发板也做一个26键的全键盘输入法
平台全支持(不用讲了吧,应用层,跟硬件没关系)
这个程序是去年三月份做的了,这个图片也是翻的空间截图出来的,不太清楚,26键也是对其的,不好看
第一版输入法
下面是26键主程序,篇幅限制原因,省略部分
//字符表const u8* kbs_tbl[30]={ "Q","W","E","R","T","Y","U","I","O","P", "A","S","D","F","G","H","J","K","L","←", "SHIFT","Z","X","C","V","B","N","M","SPACE","ENTER",};
u16 kbdxsize; //虚拟键盘按键宽度u16 kbdysize; //虚拟键盘按键高度//得到触摸屏的输入//x,y:键盘坐标//返回值:按键键值(1~9有效;0,无效)u8 py_get_keynum(u16 x,u16 y){ u16 i,j; static u8key_x=0;//0,没有任何按键按下;1~9,1~9号按键按下 u8 key=0; tp_dev.scan(0); if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下 { for(i=0;i<3;i++) { for(j=0;j<10;j++) { if(tp_dev.x[0]<(x+j*kbdxsize+kbdxsize)&&tp_dev.x[0]>(x+j*kbdxsize)&&tp_dev.y[0]<(y+i*kbdysize+kbdysize)&&tp_dev.y[0]>(y+i*kbdysize)) { key=i*10+j+1; //获取按键数字编号 break; } } if(key) { if(key_x==key)key=0; else { py_key_staset(x,y,key_x-1,0); key_x=key; py_key_staset(x,y,key_x-1,1); } break; } } }elseif(key_x) { py_key_staset(x,y,key_x-1,0); key_x=0; } //key=my_tbl[i*10+j+1]; returnkey; }
int main(void) { u8 i=0; u8 result_num; u8 cur_index; u8 key; u8inputstr[7]; //最大输入6个字符+结束符 u8 inputlen; //输入长度
delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 usmart_dev.init(72); //初始化USMART LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 LCD_Init(); //初始化LCD W25QXX_Init(); //初始化W25Q128 tp_dev.init(); //初始化触摸屏 my_mem_init(SRAMIN); //初始化内部内存池 exfuns_init(); //为fatfs相关变量申请内存 f_mount(fs[0],"0:",1); //挂载SD卡 f_mount(fs[1],"1:",1); //挂载FLASH. POINT_COLOR=RED; while(font_init()) //检查字库 { LCD_ShowString(30,50,200,16,16,"FontError!"); delay_ms(200); LCD_Fill(30,50,240,66,WHITE);//清除显示 } RESTART: POINT_COLOR=RED; Show_Str(30,85,200,16,"My_Keyboard",16,0); Show_Str(30,105,200,16,"输入: 匹配: ",16,0); Show_Str(30,125,200,16,"拼音: 当前: ",16,0); Show_Str(30,145,210,32,"结果:",16,0);
if(lcddev.id==0X5510) {kbdxsize=45;kbdysize=36;} py_load_ui(0,399); memset(inputstr,0,7); //全部清零 inputlen=0; //输入长度为0 result_num=0; //总匹配数清零 cur_index=0; while(1) { i++; delay_ms(10); key=py_get_keynum(0,399); if(key) { if(key==20)//删除 { if(inputlen)inputlen--; inputstr[inputlen]=' ';//添加结束符 }else { //inputstr[inputlen]=key+'0';//输入字符 获取数字字符串,根据数字字符串获取拼音表,根据拼音获取文字 switch(key) { case1:inputstr[inputlen]='Q'; break; case2:inputstr[inputlen]='W'; break; case3:inputstr[inputlen]='E'; break; case4:inputstr[inputlen]='R'; break; case5:inputstr[inputlen]='T'; break; case6:inputstr[inputlen]='Y'; break; case7:inputstr[inputlen]='U'; break; case8:inputstr[inputlen]='I'; break; case9:inputstr[inputlen]='O'; break; case10:inputstr[inputlen]='P'; break; case11:inputstr[inputlen]='A'; break; case12:inputstr[inputlen]='S'; break; case13:inputstr[inputlen]='D'; break; case14:inputstr[inputlen]='F'; break; case15:inputstr[inputlen]='G'; break; case16:inputstr[inputlen]='H'; break; case17:inputstr[inputlen]='J'; break; case18:inputstr[inputlen]='K'; break; case19:inputstr[inputlen]='L'; break; case20://inputstr[inputlen]=0;//删除键 break; case21://inputstr[inputlen]=0;//SHIFT键 break; case22:inputstr[inputlen]='Z'; break; case23:inputstr[inputlen]='X'; break; case24:inputstr[inputlen]='C'; break; case25:inputstr[inputlen]='V'; break; case26:inputstr[inputlen]='B'; break; case27:inputstr[inputlen]='N'; break; case28:inputstr[inputlen]='M'; break; case29://inputstr[inputlen]=0;//空格键 break; case30://inputstr[inputlen]=0;//回车键 break; default: break; } //inputstr[inputlen]=key+'0'; if(inputlen<7)inputlen++; } if(inputstr[0]!=NULL) { key=t9.getpymb(inputstr); //得到匹配的结果数 if(key)//有部分匹配/完全匹配的结果 { result_num=key&0X7F; //总匹配结果 cur_index=1; //当前为第一个索引 if(key&0X80) //是部分匹配 { inputlen=key&0X7F; //有效匹配位数 inputstr[inputlen]=' ';//不匹配的位数去掉 if(inputlen>1)result_num=t9.getpymb(inputstr);//重新获取完全匹配字符数 } }else //没有任何匹配 { inputlen--; inputstr[inputlen]=' '; } }else { cur_index=0; result_num=0; } LCD_Fill(30+40,105,30+40+48,110+16,WHITE); //清除之前的显示 LCD_ShowNum(30+144,105,result_num,1,16); //显示匹配的结果数 Show_Str(30+40,105,200,16,inputstr,16,0); //显示有效的数字串 py_show_result(cur_index); //显示第cur_index的匹配结果 } key=KEY_Scan(0); if(key==WKUP_PRES&&tp_dev.touchtype==0)//KEY_UP按下,且是电阻屏 { tp_dev.adjust(); LCD_Clear(WHITE); gotoRESTART; } if(result_num) //存在匹配的结果 { switch(key) { caseKEY1_PRES://下翻 if(cur_index>1)cur_index--; elsecur_index=result_num; py_show_result(cur_index); //显示第cur_index的匹配结果 break; caseKEY0_PRES://清除输入 LCD_Fill(30+40,145,lcddev.width,145+48,WHITE); //清除之前的显示 gotoRESTART; } } if(i==30) { i=0; LED0=!LED0; } } }
跟上源程序
拼音输入法26.zip
(2.07 MB, 下载次数: 254)
2018-6-22 18:13 上传
点击文件名下载附件
源程序
最近又打算再搞一下输入法(
事情)
,上周重新做了界面布局,大概这样子的
前天又优化了一下,增加按钮间距,修改部分按键尺寸,调整按键布局等等,具体还没上机运行看,所以也没有图片接下来是验证界面和做最最复杂的逻辑处理,看过的都知道,虽然输入法没有高频词位置前置啥的,但是也是个很完整的一套输入法了,各功能上都下足了功夫,最重要的还是开源共进
首先改了一下拼音索引表结构,原来是这个样子滴//
拼音索引表
//
拼音索引表const py_index py_index3[]={{"","",(u8*)PY_mb_space},{"2","a",(u8*)PY_mb_a},{"3","e",(u8*)PY_mb_e},{"6","o",(u8*)PY_mb_o},{"24","ai",(u8*)PY_mb_ai},{"26","an",(u8*)PY_mb_an},{"26","ao",(u8*)PY_mb_ao},{"22","ba",(u8*)PY_mb_ba},{"24","bi",(u8*)PY_mb_bi},{"26","bo",(u8*)PY_mb_bo},{"28","bu",(u8*)PY_mb_bu},{"22","ca",(u8*)PY_mb_ca},
此处省略很多行…};
第一版修改之后
//
拼音索引表
const py_index py_index3[]={{"","",(u8*)PY_mb_space},{"A","a",(u8*)PY_mb_a},{"E","e",(u8*)PY_mb_e},{"O","o",(u8*)PY_mb_o},{"AI","ai",(u8*)PY_mb_ai},{"AN","an",(u8*)PY_mb_an},{"AO","ao",(u8*)PY_mb_ao},{"BA","ba",(u8*)PY_mb_ba},{"BI","bi",(u8*)PY_mb_bi},{"BO","bo",(u8*)PY_mb_bo},{"BU","bu",(u8*)PY_mb_bu},{"CA","ca",(u8*)PY_mb_ca},
此处省略很多行…};
现在这版
typedef struct{ constchar *PYList; //
拼音检索字符串 int num; //
总汉字数 constchar *HZGB; //
以所定义的拼音组合的汉字GB
码的指针}PYDef;
//
拼音组合的汉字字库//
拼音检索的结构体struct PYS{ char*PYSerList; //
拼音检索字符 constunsigned char *PYRankOneList; //
以所定义的拼音组合的汉字字库的指针};
/**
拼音检索的结构体数组*/struct PYS const py_index_26[] = { {"a",PY_mb_a}, {"ai",PY_mb_ai}, {"an",PY_mb_an}, {"ang",PY_mb_ang}, {"ao",PY_mb_ao},
{"ba",PY_mb_ba}, {"bai",PY_mb_bai}, {"ban",PY_mb_ban}, {"bang",PY_mb_bang}, {"bao",PY_mb_bao}, {"bei",PY_mb_bei}, {"ben",PY_mb_ben}, {"beng",PY_mb_beng}, {"bi",PY_mb_bi}, {"bian",PY_mb_bian}, {"biao",PY_mb_biao}, {"bie",PY_mb_bie}, {"bin",PY_mb_bin}, {"bing",PY_mb_bing}, {"bo",PY_mb_bo}, {"bu",PY_mb_bu}, {"ca",PY_mb_ca},
此处省略很多行…};
这样存储应该可以省一些内存吧,后续更新...
2018.06.22,测试更新布局,只有最后几个按钮边框绘制稍有问题,我再看看上一张测试图
后续更新...
一周热门 更多>