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

📄 main.c

📁 拼音输入法用在单片机上.rar
💻 C
📖 第 1 页 / 共 4 页
字号:
                        return 0;//超时返回
                }
		
	}while(1);
		
}



/*********************************************************
程序功能: 显示拼音串(第i个拼音反显,0<=i<=5)              *
输入参数: 第i个拼音反显,拼音个数j,拼音串地址pinyin_buf   *
占用资源: 整型变量k,t                                    *
返回参数: 无                                             *
*********************************************************/

void pinyin_display(uchar i,uchar j,uchar pinyin[6][7])
{ 
	uchar n,k,t=0;
        n=0;
        //--------------------------------------------------
        //出错停止
        if(j>6||j==0) 
        {
                lcd_string(0,"get pin error2!");
                getchar();
        }
        if(i>5)
        {
                lcd_string(0,"get pin error3!");
                getchar();
        }
        //--------------------------------------------------
	if(i>2)
                if(i<6)
                        if(j>3)
                                if(j<7)
                                        t=3;
        lcd_cursor(0,3);
        for(k=0;k<3;k++)
        {
                if((k+t)==i)
                {
                        while(pinyin[k+t][n]!='\0')n++;
                        lcd_bytes(1,pinyin[i],n);//反显拼音
                        lcd_clear_bytes(6-n);
                }
                else
                {
                        lcd_bytes(0,pinyin[k+t],6);
                        if(k==2)lcd_clear_bytes(2);
                }
        }
        //--------------------------------------------------
        lcd_cursor(16,3);
        if(j>3)
                if(j<7)
                {
                        if(i<3)
                                lcd_string(0,">>");//下页有拼音提示
                        if(i>2)
                                lcd_string(0,"<<");//上页有拼音提示
                }

}

/*********************************************************
  程序功能: 汉字内码显示(j:第j个汉字反显,j=0不反显)     *
  输入参数: j,hanzi_buf;                                 *
  占用资源: 整型变量k,指针变量hanzi_p;                   *
  返回参数: 无                                           *
*********************************************************/
void hanzi_display(uchar j,uchar hanzi_buf[21])
{

        uchar k;
        uchar * hanzi_p=hanzi_buf;
        //-------------------------
        //出错处理
        if(j>10)
        {
                lcd_string(0,"j>return_hz_total");
                getchar();
        }
        //--------------------------
        lcd_cursor(0, 4);
        for(k=1;k<=10;k++)
        {
                if(*hanzi_p=='\0')//取到汉字的个数少于给定的数目,原来显示位置的汉字要清除掉
                {
                        lcd_clear_bytes(2);
                        hanzi_p+=2;
                }
                else if(k==j)hanzi_p=lcd_hanzi(1,hanzi_p);//反黑显示的汉字
                else if(k!=j)hanzi_p=lcd_hanzi(0,hanzi_p);
        }
        //--------------------------
}


/*********************************************************
程序功能: 将数字键输入分别化为大小写字母,放入汉字缓存   *
输入参数: 数字键输入2~9                                  *
返回参数: 英文大小写 字母                                *
          如数字键输入2对应返回a b c A B C               *
*********************************************************/
void english_letters(uchar c,uchar hanzi_buf[21])
{
        uchar i,m,n,k,t=0;
        k=0;
        if(c>0x39||c<0x32)return;
        if(c=='7'||c=='9')k=1;
        if(c==0x38||c==0x39)t=1;
        m = 0x61+3*(c-0x32)+t;//小写字母
        n = 0x41+3*(c-0x32)+t;//大写字母
        for(i=0;i<(6+k);m++)
        {       
                hanzi_buf[i++]=m;
                hanzi_buf[i++]=' ';
        }
        for(;i<(11+(k*4));n++)
        {
                hanzi_buf[i++]=n;hanzi_buf[i++]=' ';
        }
        for(;i<20;i++)
                hanzi_buf[i]=' ';

}

/*********************************************************
程序功能:取半角或全角标点符号                           *
人口参数:参见下面列表                                   *
*********************************************************/
void biaodian_process(uchar page,uchar hanzi_buf[21],uchar  * bd_bj,uchar *  bd_qj)
{
        uchar i,j,k;
        if(edit_2_state)
        {       edit_4_state=1;
                if(edit_5_state)//全角符号状态
                {
                        if(page>(qj_len/20))
                                page=1;
                        k=(page-1)*20;
                        for(i=0;i<20;i++)
                                hanzi_buf[i]=bd_qj[i+k];
                        return;
                }
                //半角标点符号
                if(page>(bj_len/10))//30个半角标点符号限制
                        page=1;
                k=(page-1)*10;
                for(i=0,j=0;i<20;j++)
                {
                        hanzi_buf[i++]=bd_bj[j+k];
                        hanzi_buf[i++]=' ';
                }
                
        }
}
/*********************************************************
函数功能:查询当前光标在编辑内容的那一页                  *
特别说明:每页18个汉字 32字节                             *
*********************************************************/
uchar which_screen(uchar * save_p,uchar save_buf[50])
{
        uchar screen;
        screen=(save_p-save_buf)/38;
        return  screen;
}
/*********************************************************
函数功能:闪烁光标,定位光标在从(0,0)开始第n个字符之后     *
         在编辑区提示字符的输入位置                      *
*********************************************************/
/*
void show_char_position(uchar n)
{
        uchar i,j;
        i=n%20;
        j=n/20;
        lcd_cursor(i, j);
        lcd_showcursor(1);
}
*/
/*********************************************************
函数功能:显示编辑区某一页的内容                          *
         当光标位于此页时闪烁光标                        *
*********************************************************/
uchar   screen_display(uchar  * save_p,uchar virtual_screen,uchar save_buf[50])
{
        uchar total_screen,virtual_screen2,k,t=0;
        uchar * screen_p;
        if(virtual_screen>2)return 0;
        //**************************************
        //内存有限,这里限制virtual_screen=0;   *
        //save_buf[50]本来该放到xdata里        *
        //暂时防止显示错误                     *
        if(virtual_screen>0)virtual_screen=0;//*
        //**************************************
        //---------------------------------------------------
        //液晶每行显示10个汉字,如果最后剩下1字节的空隙,
        //自动将汉字往下一行显示,指针做为光标有时就差半个汉字
        //搞不定算了
        /*
        screen_p=&save_buf[40*virtual_screen];
        for(total_screen=0;total_screen<20;total_screen++)
                if(*(screen_p++)<0x80)k++;//统计第一行半角字符个数
        screen_p--;
        if(k%2)//字符是奇数个
                if(*screen_p>0x80)//如果大于0x80,那么最后一个字节是某个汉字的前一半
                {
                        k=save_p-&save_buf[virtual_screen*38];
                        if(k>19)
                                t=1;//第二行补偿光标的显示位置
                        else
                                t=0;
                }
        */
        //---------------------------------------------------
        virtual_screen2=which_screen(save_p,save_buf);//当前光标在哪一屏/页
        //---------------------------------------------------
        screen_p=save_buf;
        while(*screen_p!='\0')screen_p++;
        total_screen=which_screen(screen_p,save_buf);//共多少屏字符
        //---------------------------------------------------
        lcd_cursor(0,0);
        lcd_bytes(0,&save_buf[36*virtual_screen],38);//显示编辑区字符
        //---------------------------------------------------        
        //简单提示
        lcd_cursor(0,2);
        lcd_string(0,"第 页");
        lcd_cursor(2,2);
        lcd_byte(0,virtual_screen+0x31);
        //---------------------------------------------------
        //当前页是光标所在那一页,则显示光标
        if(virtual_screen==virtual_screen2)
        {
                //show_char_position(save_p-&save_buf[virtual_screen*38]+t);//显示光标
                k=save_p-&save_buf[virtual_screen*38];
                t=k%20;
                k=k/20;
                lcd_cursor(t, k);
                lcd_showcursor(1);
        }
        //---------------------------------------------------
        return total_screen;
}

/*********************************************************
程序功能:保存第j个被选择的汉字到save_buf[50]            *
          光标不在末尾时插入汉字到save_buf[50]           *
*********************************************************/
uchar * edit_save_send0(uchar j,uchar * save_p,uchar hanzi_buf[21],uchar save_buf[114])
{
        uchar  * save_p1,* save_p2 = save_buf;
        if(save_p>(save_buf+50))return save_p;//存储区已满
        if(!edit_3_state)
        {
                save_p1=save_p;
                goto save_process0;
        }
        if(edit_3_state)//插入字符处理
        {
                while(*save_p2!='\0')
                        save_p2++;//指向'\0'
                save_p1=save_p2;//指向'\0'
                save_p2++;
                if(chinese_input_state)
                        if(hanzi_buf[2*j-2]>0x80)
                                if(hanzi_buf[2*j-1]>0x80)
                                        save_p2++;//插入全角字符时需要空出2个字节位置
                //-----------------------------------------------------------------
                //移动字符串的情况
                //123456789abcdefghijklmn\0     //原来的状况
                //123456789abcde fghijklmn\0    //新状况1
                //123456789abcde  fghijklmn\0   //新状况2
                //移动字符串,save_p所指位置留给新字符使用
                while(save_p1!=save_p)
                {
                        *save_p2=*save_p1;
                        save_p2--;
                        save_p1--;
                }
                *save_p2 = *save_p1;
        }
save_process0:
        *save_p1++=hanzi_buf[2*j-2];//这里保存英文半角字符
        if(hanzi_buf[2*j-2]==0x20)goto save_end_return;
        if(chinese_input_state)
                *save_p1++=hanzi_buf[2*j-1];
        //----------------------------------
save_end_return:
        return save_p1;
}
/**************************************************************
程序功能:把字符串string向前移动1~2个字节(删除光标前的字符)   *
例如:                                                         *
         123456789abcdefghijklmn\0      //原来的状况0         *
         12345678abcdefghijklmn\0       //新状况0             *
         12345678删除abcdefghijklmn\0   //原来的状况1         *
         12345678删abcdefghijklmn\0     //新状况1             *
         12345678abcdefghijklmn删除\0   //原来的状况2         *
         12345678abcdefghijklmn删\0     //新状况2             *
         12345678abcdefghijklmn\0       //原来的状况3         *
         12345678abcdefghijklm\0        //新状况3             *
**************************************************************/
uchar * move_string(uchar n,uchar *string)
{
        uchar *p1,*save_p=string-n;
        p1=save_p;
        if(*string=='\0')goto move_string0;
        while(*string!='\0')
                *p1++=*string++;
move_string0:
        *p1++=*string;
        if(n==2)*p1='\0';
        return save_p;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -