📄 chnpyime.c
字号:
/*===================================================
编写年月:2003年4月
功能:拼音输入法
===================================================*/
#include "include.h"
#define PY_SEQUENCE_error 1000
#define HZ_DISP_NUM 24
#define PY_ENTER 11
#define PY_SUBTOTAL 27
#define PY_VOID 33
#define PY_CLEAR 44
#define MAXINPUIDEAL 5 //输入法的种类
//====================================================================
//====================================================================
void displayinputideal(uchar inputideal)
{
uchar disp_buf[50];
switch(inputideal)
{
case 0:
sprintf(disp_buf,"拼音输入按[合计]切换输入");
break;
case 1:
sprintf(disp_buf,"区位输入按[合计]切换输入");
break;
case 2:
sprintf(disp_buf,"大写字母按[合计]切换输入");
break;
case 3:
sprintf(disp_buf,"小写字母按[合计]切换输入");
break;
case 4:
sprintf(disp_buf,"数字输入按[合计]切换输入");
break;
default:
break;
}
clear_lcd(3,1);
lcd_disp(3,0,disp_buf);
}
//==============================================================
/*
信息交换用汉字编码字符集是由我国国家标准总局1980年发布
1981年5月1日开始实施的一套国家标准,标准号是GB 2312—1980
。它是计算机可以识别的编码,适用于汉字处理
、汉字通信等系统之间的信息交换。基本集共收入汉字6 763个和非汉字图形字符682个
。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符
,因此可用所在的区和位来对汉字进行编码,称为区位码
。这个码是唯一的,不会有重码字。
把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H
,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)
。GBK与GB 2312—1980国家标准所对应的内码标准兼容
,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部
中、日、韩(CJK)汉字,共计20 902字
。信息交换用汉字编码字符集和汉字输入编码之间的关系是
,根据不同的汉字输入方法,通过必要的设备向计算机输入汉字的编码
,计算机接收之后,先转换成信息交换用汉字编码字符
,这时计算机就可以识别并进行处理;汉字输出是先把机内码转成汉字编码
,再发送到输出设备。
*/
//区位码转成计算机机内码
uchar getquweiHZ(char *input_string,uchar *output_string)
{
output_string[0]=(input_string[0]&0x0f)*10+(input_string[1]&0x0f)+0xa0;//区位码(bcd码)+0xa0转成计算机机内码
output_string[1]=(input_string[2]&0x0f)*10+(input_string[3]&0x0f)+0xa0;
output_string[2]=0;
if((output_string[0]>0xaf)&&(output_string[0]<0xf8)&&(output_string[1]>0xa0))return 0;//只找汉字区
else return 1;
}
//=============================================================
//=============================================================
uchar get_input_letter(uchar inputideal,uchar pin_over)
{
uchar key_val;
while(!(key_val = get_key()))
{
openbacklight();
if(low_pwr) return POWER_OFF;// 如果断电了,则exit;
}
switch(key_val)
{
#ifdef C6_VER
case '1':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
key_val = 'n';
break;
case '2':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
{
if(!pin_over) key_val = 'm';
else key_val = DOWN_ARROW;
}
break;
case '4':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
{
if(!pin_over) key_val = 'j';
else key_val = LEFT_ARROW;
}
break;
case '5':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
key_val = 'k';
break;
case '6':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
{
if(!pin_over) key_val = 'l';
else key_val = RIGHT_ARROW;
}
break;
case '7':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
key_val = 'i';
break;
case '8':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
{
if(!pin_over) key_val = 'o';
else key_val = UP_ARROW;
}
break;
case '9':
if((inputideal==0)||(inputideal==2)||(inputideal==3))
key_val = 'p';
break;
#endif
#ifdef C8_VER
case '0':key_val = 'm';break;
case '1':key_val = 'v';break;
case '2':
if(!pin_over) key_val = 'b';
else key_val = DOWN_ARROW;
break;
case '3':key_val = 'n';break;
case '4':
if(!pin_over) key_val = 'f';
else key_val = LEFT_ARROW;
break;
case '5':key_val = 'g';break;
case '6':
if(!pin_over) key_val = 'l';
else key_val = RIGHT_ARROW;
break;
case '7':key_val = 'q';break;
case '8':
if(!pin_over) key_val = 'p';
else key_val = UP_ARROW;
break;
case '9':key_val = 'h';break;
#endif
case SUBTOTAL:
key_val=TOTAL;//PY_SUBTOTAL;
break;//拼音确认('小计'键)
case VOID:
key_val=PY_VOID;
break;//取消
case CLEAR:
key_val=PY_CLEAR;
break;//清除
case ENTER:
key_val=PY_ENTER;//确认
break;
default:
if((key_val>='A' && key_val<='Z')&&((inputideal==0)||(inputideal==2)||(inputideal==3)))
{
key_val=key_val+32;//转换成小写字母
return(key_val);
}
break;
}
return (key_val);
}
//==============================================================================
uchar Get_HzString(uchar Max_length, uchar *chinese_string)
{
//2005.12.20
uchar hz_str_len,i, hz_num, hz_void[2],hz[3],disp_num;//
uchar xdata j, chi_str_tmp[211];char input_string[7];
uchar xdata output[16][HZ_DISP_NUM+1],ChStrLen,ChLnNum,k;
uchar page, key_buf, input_complete, no;
uint sequence;
uchar disp_buf[50];
uchar inputideal; //输入法代号 按合计键切换
uchar firstkey;
uchar clear_err;
uchar input_maxlen;
input_maxlen=Max_length*2;
clear_err=0;
inputideal=0; //默认为拼音输入
clear_lcd(3,1);
sprintf(disp_buf,"要输名称[确定][取消]退出");
lcd_disp(3,0,disp_buf);
while(1)
{
if(low_pwr) return(POWER_OFF);
key_buf=get_key();
if((key_buf==ENTER)&&(!low_pwr))break;
else if(key_buf==VOID)
{
chinese_string[0]=0;
return CANCEL;
}
}
clear_lcd(2,2);
sprintf(disp_buf,"拼音输入名称按[取消]退出\r按[合计]键切换输入法");
lcd_disp(2,0,disp_buf);
firstkey=0;
hz_num = 0;
hz_void[0] = 0;
hz_void[1] = 0;
for(i=0;i<input_maxlen+1;i++)//清空汉字的缓冲
chinese_string[i] = 0;
for(hz_str_len=0;hz_str_len<Max_length+1;hz_str_len++)
{
if(firstkey)clear_lcd(1,1);
if(!clear_err){for(i=0;i<7;i++) input_string[i] = 0;}
input_complete=0;
page = 0;
while(1)
{
key_buf=0;
key_buf=get_input_letter(inputideal,input_complete); //接受拼音和功能键
if(low_pwr) return(POWER_OFF);
if((key_buf)&&(!firstkey))
{
firstkey=1;
clear_lcd(2,2);
}
if(key_buf==TOTAL)//PY_SUBTOTAL)
{
inputideal++;
if(inputideal==MAXINPUIDEAL)inputideal=0;
displayinputideal(inputideal);
for(i=0;i<7;i++) input_string[i] = 0;
chi_str_tmp[0]=0;
continue;
}
else if(key_buf==PY_VOID) //若取消,则退出操作
{
chinese_string[0]=0;
return CANCEL;
}
else if(key_buf==PY_CLEAR) //若删除
{
if(input_string[0]) //若当前正输入拼音,则删除拼音
{
for(i=0;i<7;i++) input_string[i] = 0;
if(clear_err)
{
clear_lcd(3,1);
clear_err=0;
if(strlen(chinese_string))
{
sprintf(disp_buf,"名称:");
strcpy(disp_buf+5,chinese_string);
lcd_disp(2,0,disp_buf);
}
}
}
else if(chi_str_tmp[0]) //若当前调出汉字
{
chi_str_tmp[0]=0;
}
else if(chinese_string[0]) //若当前未输入拼音调出汉字,且已有汉字,则删除当前汉字
{
if(hz_num==0) continue; //如果更改后汉字数为0,则继续等待按键
if(chinese_string[hz_num-1]>0xa0)hz_num-=2;
else hz_num-=1;
memcpy(&chinese_string[hz_num],hz_void,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -