📄 py_interface.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 + -