⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ime.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 5 页
字号:
                                            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 + -