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

📄 chnpyime.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 2 页
字号:
/*===================================================
编写年月: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 + -