26键全键盘输入法开发

2019-07-21 02:02发布

本帖最后由 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 上传 点击文件名下载附件
源程序
最近又打算再搞一下输入法(事情),上周重新做了界面布局,大概这样子的 TIM图片20180622173311.jpg

TIM图片20180622173321.jpg

TIM图片20180622173328.jpg
前天又优化了一下,增加按钮间距,修改部分按键尺寸,调整按键布局等等,具体还没上机运行看,所以也没有图片接下来是验证界面和做最最复杂的逻辑处理,看过的都知道,虽然输入法没有高频词位置前置啥的,但是也是个很完整的一套输入法了,各功能上都下足了功夫,最重要的还是开源共进
首先改了一下拼音索引表结构,原来是这个样子滴//拼音索引表
//拼音索引表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,测试更新布局,只有最后几个按钮边框绘制稍有问题,我再看看上一张测试图
IMG_20180623_133322.jpg
后续更新...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。