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

📄 py_interface.c

📁 GPRS模组资料包含DEMO
💻 C
字号:
//==========================================================================//
//	文件名称:	PY_Interface.c 												//
//	功能描述:	T9拼音输入法模块 											//
//	维护记录:	2007年12月18日    V1.0										//
//==========================================================================//
#include ".\Tel\Screen.h"
#include ".\China_PY\PY_IME.h"

#define	PY_MAX_CHAR	6
#define HZ_PER_PAGE 16
void delay(int a);
static short x,y; //触摸坐标
extern WIN_HANDLE Msg;

//========================================================================
//	语法格式:	unsigned char PY_GetSymbol(void)
//	实现功能:	通过按键获取符号,0~8以及#键分别对应:
//					0 1 2 3 4 5 6 7 8 #
//					. , ? @ # * _ - ' 1
//				按'n'或'*'键直接退出
//	参数:		无
//	返回值:	获取的符号
//========================================================================
static const char Symbol_List[] = " . , ? @ # * _ - ' !";

unsigned short PY_GetSymbol(void)
{
	int KeyCode;

	TFT_SetTextPos(Msg, 0, 188);
	TFT_Print(Msg, " 0 1 2 3 4 5 6 7 8 #\n");
	TFT_Print(Msg, Symbol_List);
	delay(10000);
	while(1)
	{
		if(Touch_Get(&x,&y) == -1)
			continue;

		KeyCode = Touch_Trans(x, y);
		if(KeyCode >= 0 && KeyCode <= 8)
		{
			return (unsigned short)Symbol_List[(KeyCode << 1) + 1];
		}
		else if(KeyCode == C_JING || KeyCode == C_ENTER)
		{
			return '!';
		}
		else if(KeyCode == C_CANCEL || KeyCode == C_STAR)
			return '\0';
		delay(10000);
	}
}

//========================================================================
//	语法格式:	unsigned short PY_GetHZ(const T9PY_IDX *PY_Idx)
//	实现功能:	根据输入的拼音显示匹配的汉字列表,并由键盘选取汉字。
//				被PY_GetCh()函数调用
//	参数:		拼音索引地址
//	返回值:	获取的汉字编码
//========================================================================
unsigned short PY_GetHZ(const T9PY_IDX *PY_Idx)
{
	unsigned int HZ_Remain = 0;
	unsigned int CurPageIdx;
	unsigned int i = 0, KeyCode, KeyEvent;
	char HZ_Buf[2 * HZ_PER_PAGE + 1];
	char hz_str[3];

	CurPageIdx = 0;
	KeyEvent = 1;
	while(1)
	{
		if(KeyEvent == 1)
		{
			HZ_Remain = T9PY_Ime(PY_Idx, CurPageIdx, HZ_PER_PAGE, HZ_Buf);
			if(HZ_Remain == 0xffff)
				return '\0';
			i = 0;
			TFT_SetTextPos(Msg, 0, 188);
			TFT_Print(Msg, "                    ");
			TFT_SetTextPos(Msg, 0, 204);
			TFT_Print(Msg, "                    ");
			while(HZ_Buf[i] != '\0')
			{
				TFT_SetTextPos(Msg, (i<<3),188);
				if((i % 2) == 0)
					TFT_PutChar(Msg, '1' + i / 2);
				TFT_SetTextPos(Msg, (i << 3), 204);
				hz_str[0] = HZ_Buf[i++];
				if(HZ_Buf[i] == '\0')
					continue;
				hz_str[1] = HZ_Buf[i++];
				hz_str[2] = '\0';
				TFT_Print(Msg, hz_str);
			}
			TFT_SetTextPos(Msg, HZ_PER_PAGE * 8, 204);
			if(CurPageIdx >= HZ_PER_PAGE)
				TFT_Print(Msg, "←");
			else
				TFT_Print(Msg, "  ");
			if(HZ_Remain > 0)
				TFT_Print(Msg, "→");
			else
				TFT_Print(Msg, "  ");
			KeyEvent = 0;
		}

		if(Touch_Get(&x,&y) == -1)
			continue;
		KeyCode = Touch_Trans(x, y);
		delay(10000);
		switch(KeyCode)
		{
			case 1: case 2: case 3: case 4:
			case 5: case 6: case 7: case 8:
				if(KeyCode - 1 < i)
				{
					return *((unsigned short *)&HZ_Buf[2 * KeyCode - 2]);
				}
				break;
			case C_UP:
				if(CurPageIdx >= HZ_PER_PAGE)
				{
					CurPageIdx -= HZ_PER_PAGE;
					KeyEvent = 1;
				}
				break;
			case C_DOWN:
				if(HZ_Remain > 0)
				{
					CurPageIdx += HZ_PER_PAGE;
					KeyEvent = 1;
				}
				break;
			case C_CANCEL: case '*':
				return '\0';
		}
		delay(10000);
	}
}

//========================================================================
//	语法格式:	unsigned int PY_GetCh(void)
//	实现功能:	通过键盘获取一个汉字或字符
//	参数:		无
//	返回值:	获取的汉字或字符编码
//========================================================================
unsigned int PY_GetCh(void)
{
	char Input_Buf[PY_MAX_CHAR + 1] = "";
	T9PY_IDX *PY_List[10];
	unsigned int i, j, KeyCode, PY_Count;
	unsigned int KeyEvent;
	unsigned int PY_CurIdx = 0;

	i = 0;
	KeyEvent = 1;
	PY_Count = 0;

	delay(10000);
	TFT_SetTextPos(Msg, 0,188);
	TFT_Print(Msg, "                    ");
	TFT_SetTextPos(Msg, 0,204);
	TFT_Print(Msg, "                    ");
	while(1)
	{
		if(Touch_Get(&x, &y) == -1)
			continue;
		KeyCode = Touch_Trans(x, y);
		switch(KeyCode)
		{
			case 2: case 3: case 4: case 5:			// 2~9键输入拼音
			case 6: case 7: case 8: case 9:
				if(i < PY_MAX_CHAR)
				{
					Input_Buf[i++] = KeyCode + 48;  //转化为AICII码
					KeyEvent = 1;
				}
				break;
			case 1:										// 1键输入符号
				if(i == 0)
					return PY_GetSymbol();
				else
					break;
			case C_CANCEL:										// C键退格
				if(i > 0)
				{
					Input_Buf[--i] = '\0';
					KeyEvent = 1;
				}
				else
				{
					return '\b';
				}
				break;
			case C_JING:										// #键输入数字
				if(i == 1)
					return Input_Buf[0];
				else
					break;
			case 0:										// 0键输入字母
				if(i == 0)
				{
					Input_Buf[i++] = '0';
					KeyEvent = 1;
					break;
				}
				else if(i == 1)
					return PY_List[PY_CurIdx]->PY[0];
				else
					break;
			case C_UP:										// 选择前一项
				KeyEvent = 2;
				if(PY_CurIdx > 0)
					PY_CurIdx--;
				else
					PY_CurIdx = PY_Count - 1;
				break;
			case C_DOWN:										// 选择后一项
				KeyEvent = 2;
				if(PY_CurIdx < PY_Count - 1)
					PY_CurIdx++;
				else
					PY_CurIdx = 0;
				break;
			case C_ENTER:										// 确定,显示汉字列表
				if(PY_Count > 0)
					return PY_GetHZ(PY_List[PY_CurIdx]);
				else
					return '\n';
			case C_HANG:										// 取消
				if(i > 0)
				{
					i = 0;
					Input_Buf[i] = '\0';
					KeyEvent = 1;
				}
				else
				{
					return '\b';
				}
				break;
			default:
				break;
		}
		//// 在LCD上显示输入法提示
		if(KeyEvent)
		{
			Input_Buf[i] = '\0';
			PY_Count = T9PY_GetPY(Input_Buf, PY_List);
			if(KeyEvent == 1)
				PY_CurIdx = 0;

			TFT_SetTextPos(Msg, 0,204);
			TFT_Print(Msg, "                    ");
			TFT_SetTextPos(Msg, 0,204);
			if(*Input_Buf == '\0')
				TFT_Print(Msg, "拼");
			else
				TFT_Print(Msg, Input_Buf);
			TFT_Print(Msg, ":");
			for(j = 0; j < PY_Count; j++)
			{
				if(j == PY_CurIdx)
					TFT_PutChar(Msg, '-');
				else
					TFT_PutChar(Msg, ' ');
				TFT_Print(Msg, PY_List[j]->PY);
				if(j == PY_CurIdx)
					TFT_PutChar(Msg, '-');
				else
					TFT_PutChar(Msg, ' ');
			}
			KeyEvent = 0;
		}
		delay(10000);
	}
}

//========================================================================
//	语法格式:	unsigned char *PY_GetString(unsigned char *StrBuf, unsigned char StrLen)
//	实现功能:	通过键盘获取一个字符串
//	参数:		StrBuf:		字符串起始地址
//				StrLen:		字符串的最大显示宽度(每个汉字宽度为2,字符的宽度为1)
//	返回值:	字符串的首地址
//========================================================================
char *PY_GetString(char *StrBuf, unsigned char StrLen)
{
	short DispX, DispY;
	unsigned int RemainStr, CharSize;
	char *p_StrBuf;
	unsigned short HZ_Code;    //hu

	TFT_GetTextPos(Msg, &DispX, &DispY);
	p_StrBuf = StrBuf;
	RemainStr = StrLen;
	while(1)
	{
		HZ_Code = PY_GetCh();
		CharSize = HZ_Code>0x00ff ? 2:1;
		switch(HZ_Code)
		{
			case '\b':
				if(p_StrBuf > StrBuf)
				{
					p_StrBuf--;
					if(*(unsigned char *)p_StrBuf >= 0x80)
						p_StrBuf--;
					RemainStr += CharSize;
				}
				else
				{
					*p_StrBuf='\0';
					return StrBuf;
				}
				break;
			case '\n':
				*p_StrBuf='\0';
				return StrBuf;
			case '\0':
				break;
			default:
				if(RemainStr >= CharSize)
				{
					*p_StrBuf =  HZ_Code&0xff;
					p_StrBuf++;
					if( (HZ_Code&0xff00)!=0 )
					{
						*p_StrBuf = (HZ_Code&0xff00)>>8;
						p_StrBuf++;
					}

					RemainStr -= CharSize;
				}
				break;
		}
		*p_StrBuf = '\0';
		TFT_SetTextPos(Msg, DispX, DispY);
		TFT_Print(Msg, StrBuf);
		if(HZ_Code=='\b')TFT_Print(Msg, "  ");
	}
}

⌨️ 快捷键说明

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