📄 t9py.h
字号:
/******************************************************************************
// 按键是根据通用手机键盘设置的,全部在PC的小键盘操作): //
// NumLock /:上一拼音? *:下一拼音 //
// 7:pqrs 8:tuv 9:wxyz -:前翻页 //
// 4:ghi 5:jkl 6:mno +:后翻页 //
// 1:? 2:abc 3:def 回车键:输入状态和选字状态切换 //
// 0:? '.'和空格及回车键:输入状态和选字状态切换 //
// 串口依次输入: 9466*.1 486*.3 64*.6 426***.5 试试:-) //
// 程序在IAR中用软件模拟调试可以执行 //
******************************************************************************/
#ifndef __T9PY_H__
#define __T9PY_H__
#include <msp430x14x.h>
#include <string.h>
#include <stdio.h>
#include "t9py_indexa.h"
#include "ocmj12232c-1(并口).h"
extern char x1,y1,x2,y2;//定位lcd显示位置
void clr_cpt9PY_Mb(void);
unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,const struct t9PY_index ** List_match_PY_Mb);
void t9PY_Test(void);
void lcd_test(unsigned char * input_string);
#define CNTLQ 0x11
#define CNTLS 0x13
#define DEL 0x7F
#define BACKSPACE 0x08
#define CR 0x0D
#define LF 0x0A
#define T9PYPTRMAX 16
unsigned char cpt9PY_Mblen;//保存调用函数 T9PY_Get_Match_PY_MB()的返回值,获取到完全匹配拼音数量
const struct t9PY_index * cpt9PY_Mb[T9PYPTRMAX];//主要用于存放匹配的拼音码表地址,
//只有cpt9PY_Mb[0]存放的是一个不匹配的拼音码表地址.
//匹配并不是指相比较的字符长短一样,不是完全匹配.例如:34跟346是匹配的,
//34跟34是完全匹配(在这里我们不需要使用完全匹配)
//====================================================================================
//语法格式:unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,\
// struct t9PY_index code ** List_match_PY_Mb)
//实现功能:获取与输入相匹配的T9拼音列表
//参数: p_PadInput: 输入的按键序列,由'0'~'9'组成的字符串
// List_match_PY_Mb: 存储"获取到的拼音索引地址"的数组
//返回值: 获取到完全匹配拼音数量
//移植注意:List_match_PY_Mb 所指向的存储结构,即用于存放匹配的拼音码表地址的存储结构.
// 第一个元素存放的是一个不匹配的拼音码表地址.其他为匹配的拼音码表地址
//=====================================================================================
unsigned char T9PY_Get_Match_PY_MB(char *p_PadInput,const struct t9PY_index ** List_match_PY_Mb)
{
const struct t9PY_index *p_PY_CurrentIndex;
const struct t9PY_index *p_PY_LastIndex;
struct t9PY_index PY_TempIndex;
unsigned char T9PY_Match_NUM=0; //完全匹配拼音数量
char temp_t9PY_T9[8],*str;//保存输入的数字 字符串
int kk;
if(*p_PadInput == '\0')
return(0); //如果输入空字符返回0//
clr_cpt9PY_Mb();
p_PY_CurrentIndex = (&t9PY_index2[1]); //首索引地址赋值,p_PY_CurrenIndex为当前拼音索引地址
kk = sizeof(t9PY_index2)/sizeof(struct t9PY_index);
p_PY_LastIndex = t9PY_index2 + kk;
//最后索引地址之后的地址(作下一语句比较用)
//程序注释:sizeof(t9PY_index2[num]); //6(字节) = 3(个指针)*2(字节/指针)
// sizeof(t9PY_index2); //2400(字节)= 400(项)*6(字节)
//所以: p_PY_LastIndex = &t9PY_index2[0] + 400;
//str=p_PadInput;
while(p_PY_CurrentIndex < p_PY_LastIndex) //遍历字母索引表.或者使用语句: while((p_PY_CurrenIndex->t9PY_T9[0])!='\n')
{
memcpy((void *)&PY_TempIndex,(const void *)p_PY_CurrentIndex,sizeof(struct t9PY_index));
strcpy(temp_t9PY_T9,(PY_TempIndex).t9PY_T9);//复制输入的数字串
str=strstr(temp_t9PY_T9,p_PadInput);//查找输入的数字串是否在 *t9PY_index2[]中
if( (str == temp_t9PY_T9) && (T9PY_Match_NUM < T9PYPTRMAX))//指针比较
{
List_match_PY_Mb[T9PY_Match_NUM]=p_PY_CurrentIndex;//
T9PY_Match_NUM++;//完全匹配数增加
}
p_PY_CurrentIndex ++;
}
return (T9PY_Match_NUM); //输出完全匹配组数,0为无果而终//
}
//==========================================================================================
//测试程序
//==========================================================================================
void t9PY_Test(void)
{
//PYEnter:输入拼音状态和选字状态(功能选择状态)切换 标志位
//0x00:输入拼音状态 0xff:选字状态
unsigned char PYEnter=0;
//HZok :汉字是否选定标志位
//0x00:汉字没有选定 0xff:汉字选定
unsigned char HZok=0;
int temp,i=0;
int out_temp;
unsigned char t9PYn=0;
unsigned char * tempMB;//指向汉字的指针
char oneline[8]={0x00} ;//输入的拼音码
char pyma[8];//拼音码临时变量
unsigned char chinese_word[3]=" ";//保存选中的汉字
char tempchar;
signed char Add=0;
struct t9PY_index cpTemp = t9PY_index2[0];//存放字库里面数据的临时变量
puts("按键 /:上一拼音 *:下一拼音 .:输入状态和选字状态切换");
puts("请按键:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz ");
while(!HZok)//HZok 初始值为 0。汉字没有ok
{ //汉字选定,则退出程序
tempchar=getchar();//接收串口发送来的数据
switch (tempchar)
{ //拼音输入只对 2~9 处理
//case '0':拼音输入状态对'0','1'屏蔽
//case '1':.
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (!PYEnter)//PYEnter = 0x00:输入拼音状态
{
oneline[i]=tempchar;
i++;
t9PYn=0;
Add=0;//Add:汉字定位位置
cpt9PY_Mblen=T9PY_Get_Match_PY_MB(oneline,cpt9PY_Mb);//获取与输入相匹配的T9拼音列表(该函数比较完整了)
}
break;
case '/'://上一拼音
if (t9PYn > 0) t9PYn --;//上下拼音指示标志位
break;
case '*'://下一拼音
t9PYn ++;//上下拼音指示标志位
if (t9PYn >= cpt9PY_Mblen) //cpt9PY_Mblen :匹配的拼音数目
t9PYn = 0;//循环
break;
//汉字显示在这里溢出 ===== 在这里进行处理
case '-'://上一页 汉字 定位
if (Add >= 18)
Add -= 18;//Add:汉字定位位置
break;
case '+'://下一页 汉字
if(strlen((const char *)(cpTemp.PY_mb)) < 18)
break;
else if ((Add < strlen((const char *)(cpTemp.PY_mb)) - 18))
Add += 18;
break;
case BACKSPACE://????删除一个拼音字母
if (i>0) i--;
oneline[i]=0x00;
Add=0;
//获取与输入相匹配的T9拼音列表,存入 *cpt9PY_Mb[16]中
cpt9PY_Mblen=T9PY_Get_Match_PY_MB(oneline,cpt9PY_Mb);
break;
case '.': //输入状态和选字状态切换
case '\n':
Add = 0;
PYEnter ^= 0xff;//PYEnter = 0xff:选字状态
break;
case ' '://扩充为汉字拼音,英文字母输入法切换 --- 未加入
break;
case '=':
break;
default :
break;
}
if (PYEnter)
{//PYEnter = 0xff:选字状态
memcpy(&cpTemp,cpt9PY_Mb[t9PYn],sizeof(struct t9PY_index));
if((tempchar >= '1') && (tempchar <= '9'))//选择汉字
{
HZok=1;
t9PYn=0;
//printf (" \n");
printf ("Target of Chinese word you had selected : ");
tempMB = (unsigned char *)cpTemp.PY_mb;
tempMB += (Add + (tempchar - '1')*2);
memcpy((void *)chinese_word,(const void *)tempMB,2);
puts ((const char *)chinese_word);//显示最后选择的一个汉字
printf ("\n");
}
else
{
printf ("The spell of your Selection : ");
strcpy (pyma,cpTemp.PY);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -