📄 ime.c
字号:
PY_index_t,
PY_index_u,
PY_index_v,
PY_index_w,
PY_index_x,
PY_index_y,
PY_index_z,
PY_index_end};
char *ImeQuery(char *imestr)
{
struct PY_index *cpHZ,*cpHZedge;
char i,cInputStrLength;
cInputStrLength=strlen(imestr);
if(*imestr=='\0')return 0; //如果输入空字符返回0
for(i=0;i<cInputStrLength;i++)
*(imestr+i)|=0x20;
if(*imestr=='i')return 0; //错误拼音输入
if(*imestr=='u')return 0;
if(*imestr=='v')return 0;
cpHZ=PY_index_headletter[imestr[0]-'a']; //查首字母索引
cpHZedge=PY_index_headletter[imestr[0]-'a'+1]; //设置指针界限
imestr++; //指向拼音串第二个字母
while(cpHZ<cpHZedge)
{
for(i=0;i<cInputStrLength;i++)
{
if(*(imestr+i)!=*((*cpHZ).PY+i))break; //串不配,退出
}
if(i==cInputStrLength) //字母串
{
return (*cpHZ).PY_mb;
}
cpHZ++;
}
return 0; //无果
}
//返回 0-9,a-z 键值 和控制键
uint ImeKeyScan(uchar ln,uchar col)
{
uchar const KeyValue[]=
{K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, //0-9
K_XM1, K_XM2, K_XM3, K_XM4, K_XM5, K_XM6, K_XM7, K_XM8, K_XM9, K_XM10,
K_XM11, K_XM12, K_XM13, K_XM14, K_XM15, K_XM16, K_XM17, K_XM18, K_XM19,
K_XM20, K_XM21, K_XM22, K_XM23, K_XM24, K_XM25, K_HD //a-z
};
uchar i,val,tp[2];
uint time=0;
bit flg=1;
tp[1]=0;
val=0xFF;
while(val==0xFF)
{
val = GetKey();
time++;
if(time>CursorTime) //光标显示
{
time = 0;
if(flg) tp[0]='-';
else tp[0]=' ';
LcdDisplay(ln,col,tp,0x0B);
flg = ~flg;
}
}
for(i=0;i<36;i++) //是字母键或数字返回ASCII码
{
if(KeyValue[i]==val+0x1000)
{
if(i<10) return (i+'0'); //返回数字
else return ((i-10)+'a'); //返回小写字母
}
}
return val+0x1000; //是功能键则在键值上加上0x1000以和字母区分
}
//输入拼音返回汉字
//返回键值
uchar ImeInput(uchar *outbuff)
{
uint val; //临时变量
uchar disclearlinebuff[26]; //清显示用数组(一行)
uchar dispinbuff[15],dispinposition=0; //输入的拼音和指指
uchar i,j,addr,*dischinabuff; //汉字缓冲区(拼音查表后放入)
uchar dischinaflag=0,dischinalength=0; //显示汉字标记
uchar pageposition=0,pagelength=0;
uchar disbuff[30][12],tempbuff[10];
uchar const pagecursor=172,pagewidth=12; //翻页标志显示位置
uchar const digitcurpositiony[]={5,34,63,92,121,150};
uchar const pinyincursorposition=48;
outbuff[0] = 0;
for(i=0;i<23;i++) disclearlinebuff[i]=' ';
disclearlinebuff[i] = 0;
dispinbuff[0] = 0;
LcdDisplay(32,0," ",1); //清除第三行
LcdDisplay(48,0," ",1); //清除第四行
LcdDisplay(32,2,"拼音:",0x01);
DisplayFullRec(31,0,63,182,1);
DisplayFullRec(47,0,63,182,1);
while(1)
{
val = ImeKeyScan(32,48+dispinposition*8);
if(val>='a' && val<='z') //是字母
{
if(dispinposition<10)
{
dispinbuff[dispinposition++] = val;
dispinbuff[dispinposition] = 0;
LcdDisplay(32,pinyincursorposition,dispinbuff,0x0B); //显示拼音
dischinabuff = ImeQuery(dispinbuff); //查拼音
dischinaflag = 1; pageposition = 0;
}
}
else
{
if(val <'0' || val>'5')val-=0x1000;
addr = 0xFF;
switch(val)
{
case K_QC: if(dispinposition>0)
{
dispinbuff[0]=0;
pageposition = dispinposition = dischinalength = 0;
pagelength = 1;
LcdDisplay(32,48," ",0x0B); //清除拼音,16个空格
LcdDisplay(48,2," ",0x0B); //清除汉字,22个空格
break;
}
else return (uchar)val;
case K_LJ: if(dispinposition>0) dispinbuff[--dispinposition] = 0;
else return (uchar)val; //如果没有拼音,退格操作
LcdDisplay(32,48," ",0x0B); //清除拼音,16个空格
LcdDisplay(32,pinyincursorposition,dispinbuff,0x0B); //显示拼音
dischinabuff = ImeQuery(dispinbuff); //查拼音
dischinaflag = 1; pageposition = 0;
break;
case K_RIGHT:
case K_LEFT:
if(dispinposition==0)break;
dischinaflag = 1;
if((pageposition>0) && (val==K_LEFT))
pageposition--; //<-键
if((pageposition<pagelength-1) && (val==K_RIGHT))
pageposition++; //->键
break;
case K_XJ: addr = 0; //是小计键 返回第1个汉字
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
if(addr==0xFF) //数字键0~5有效 返回指定的汉字
addr = (val-'0')*2;
outbuff[2] = 0;
if(disbuff[pageposition][addr]>=0xa0 && dischinalength!=0) //是汉字?
{
outbuff[0] = disbuff[pageposition][addr++];
outbuff[1] = disbuff[pageposition][addr];
LcdDisplay(32,0,disclearlinebuff,0x0B); //清除拼音
LcdDisplay(48,0,disclearlinebuff,0x0B); //清除汉字
return (uchar)val;
}
else return (uchar)val; //如果指定位置没有汉字返回0
case K_HJ:
case K_UP:
case K_DOWN:
case K_TC:
case K_SR: return (uchar)val;
default: continue;
}
}
if(dischinaflag==1)
{
dischinaflag = 0;
dischinalength = strlen(dischinabuff);
pagelength = dischinalength/pagewidth;
if((dischinalength%pagewidth)!=0) pagelength++;
addr = 0;
for(i=0;i<30;i++) //PageLength*2
{
for(j=0;j<12;j++)
{
if(addr<dischinalength) disbuff[i][j] = dischinabuff[addr++];
else disbuff[i][j] = ' ';
}
if(i>pagelength*2) break; //转换完毕
}
addr = 0;
for(j=0;j<6;j++) //显示第一行汉字
{
tempbuff[0] = j+'0'; tempbuff[3] = 0;
tempbuff[1] = disbuff[pageposition][addr++];
tempbuff[2] = disbuff[pageposition][addr++];
LcdDisplay(48,digitcurpositiony[j],tempbuff,0x0B); //显示显汉
}
}
if(pageposition<pagelength-1)LcdDisplay(32,pagecursor,">",0x0B); //还有可显示的汉字,显示翻页标记>
else LcdDisplay(32,pagecursor," ",0x0B);
if(pageposition>0 ) LcdDisplay(32,pagecursor-16,"<",0x0B); //前面还有可显示的页,显示翻页标记<
else LcdDisplay(32,pagecursor-16," ",0x0B);
LcdDisplay(33,2,"拼音:",0x0B);
}
}
//区位输入
//CharOut: 字符输出
//DisStartLn: 显示起行 DisStartCol: 显示起始列
//返回其它键键值
//显示格式:
// -------------------
// | 区位 | xxxx | 字 |
// -------------------
//长度104点
uchar QuWeiInput(uchar disstartln, uchar disstartcol,uchar *charout)
{
uchar disparr[6];
uchar lastlocation = 0, instart,dischinastart;
uchar i, val, tp[2];
uint quweival;
uchar const inputlen = 4;
LcdDisplay(disstartln,disstartcol+4,"区位",1); //显示 ‘区位’
DisplayFullRec(disstartln-1, disstartcol, disstartln+15, disstartcol+112,1); //画框架
DisplayFullRec(disstartln-1, disstartcol+40, disstartln+15, disstartcol+40,1); //画竖线
DisplayFullRec(disstartln-1, disstartcol+88, disstartln+15, disstartcol+88,1); //画竖线
instart = disstartcol + 44;
dischinastart = disstartcol + 92;
charout[0] = 0;
tp[1]=0;
disparr[4] = ' ';
disparr[5] = 0;
while(1)
{
val = ScanNumber(disstartln,instart+lastlocation*8,'-',3);
if(val<= 10)
{//是数字键
if(lastlocation<inputlen)
{
if(val == 10)
{
disparr[lastlocation++] = '0';
if(lastlocation<inputlen)
disparr[lastlocation++] = '0';
}
else disparr[lastlocation++] = val + '0';
disparr[lastlocation] = 0;
}
}
else
{
val&=0x7f;
switch(val)
{
case K_QC: if(lastlocation!=0)
{
disparr[0] = ' ';
disparr[1] = ' ';
disparr[2] = ' ';
disparr[3] = ' ';
disparr[4] = ' ';
lastlocation = 0;
charout[0]=0;
charout[1]=0;
}
else return val;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -