本帖最后由 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]='\0';//添加结束符 }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]='\0';//不匹配的位数去掉 if(inputlen>1)result_num=t9.getpymb(inputstr);//重新获取完全匹配字符数 } }else //没有任何匹配 { inputlen--; inputstr[inputlen]='\0'; } }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; } } }
跟上源程序 |