📄 t9pinyin.c
字号:
/******************************************************************
** Copyright (c) 2004-
** 文件名: t9pinyin.c
** CPU Type: S3C44B0 Compiler: arm-elf-tools-20040427
** 创建人: YZM 版 本: V1.00 日 期: 2006-11-24
** 描 述: T9拼音输入法
** 修改人:
** 描 述:
*******************************************************************/
#include "global.h"
#define T9ADDR 0X32000 //拼音字库的地址
#define HZOFFSET 0x1000 //内码的偏移量
extern void Uart_test(u8 *buf, u8 len);
extern void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size);
//字母转成数字表
EXTERN u8 const t9_table2[26] = { 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 5, 6, 6, 6,
7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
EXTERN u16 const t9_table3[11] = { 0x0000, 0x0000,
0x0000, 0x01b8,
0x02d0, 0x0400, 0x05d0,
0x0748, 0x09c8, 0x0a60,
0x0cb8};
/*******************************************************************
函数名称: readflashfile
函数功能: 读取查表数据
相关调用:
入口参数: 偏移抵制,内存指针,长度
返 回 值:
备 注:
创建信息: YZM 2006-11-24
修改信息:
********************************************************************/
void read_t9_flashfile(u16 addr, u8 *buf, u8 len)
{
u16 i;
u32 flashaddr;
flashaddr = T9ADDR+addr;
if(flashaddr&0x01){
flashaddr &= 0xfffffffe;
FlashRead(flashaddr, (u16*)buf, len+1); //从前面一位开始读出
for(i = 0; i < len; i ++){
buf[i] = buf[i+1];
}
}
else{
FlashRead(flashaddr, (u16*)buf, len);
}
}
/*******************************************************************
函数名称: t9main_disp
函数功能: t9输入法里把上面的拼音组合刷新
相关调用:
入口参数: 无
返 回 值: 无
备 注:
创建信息: YZM 2006-11-26
修改信息:
********************************************************************/
void t9main_disp(_T9PYATT *t9pyatt)
{
u8 i, width;
u16 len, tail, curpageaddr;
char dispbuf[32];
LcdClearRowRam(LINE4);
LcdClearRowRam(LINE5);
//显示第四行
width = strlen((char*)t9pyatt->pinxie); //宽度
if(width != 0){
len = LCDMAXDISP/(width+1); //得出每页能容纳的数目
tail = t9pyatt->startpy+len;
//现在能显示几条
if(tail > t9pyatt->pynum){
tail = t9pyatt->pynum;
}
//左右移动带来的开头的改变
if(t9pyatt->curpy < t9pyatt->startpy){
t9pyatt->startpy = t9pyatt->curpy;
}
if(t9pyatt->curpy >= tail){
t9pyatt->startpy = t9pyatt->curpy-len+1;
}
dispbuf[0] = 0;
for(i = 0; i < tail-t9pyatt->startpy; i ++){
strcat(dispbuf, t9pyatt->pinyin[i+t9pyatt->startpy]);
strcat(dispbuf, " "); //加空格
}
//
LcdFillRowRam(LINE4, 0, dispbuf, FDISP);
len = (t9pyatt->curpy-t9pyatt->startpy)*(width+1); //开始位置
strcpy(dispbuf, t9pyatt->pinyin[t9pyatt->curpy]);
len *= 6;
LcdFillRowRam(LINE4, len, dispbuf, NOFDISP); //反显选定的拼音
//下面开始显示汉字,前面要空出3个位置
width = t9pyatt->curhz/10;
curpageaddr = t9pyatt->pyaddr[t9pyatt->curpy].head+(width*20);
len = t9pyatt->pyaddr[t9pyatt->curpy].tail - curpageaddr;
if(len > 20){
len = 20;
}
curpageaddr += HZOFFSET;
read_t9_flashfile(curpageaddr, (u8*)t9pyatt->dispbuf, len); //读汉字库
t9pyatt->dispbuf[len] = 0;
//
LcdFillRowRam(LINE5, 0, t9pyatt->dispbuf, FDISP);
if(t9pyatt->status != 0){
len = (t9pyatt->curhz%10)*2; //距离开头的字符距离
memcpy(dispbuf, &t9pyatt->dispbuf[len], 2);
dispbuf[2] = 0;
LcdFillRowRam(LINE5, len*6, dispbuf, NOFDISP);//反显选定的汉字
}
}
else{
strcpy(dispbuf, "t9:");
LcdFillRowRam(LINE4, 0, dispbuf, FDISP);
}
LcdBrushScreen();
}
/*******************************************************************
函数名称: t9main_input_seek
函数功能: t9输入法里增加字母
相关调用:
入口参数: 增加的键值
返 回 值: 找到的数量
备 注:
创建信息: YZM 2006-11-26
修改信息:
********************************************************************/
u8 t9main_input_seek(_T9PYATT *t9pyatt)
{
u8 j, k, word, num, len0, len1;
char cmpbuf[10], pinyinbuf[10], wordbuf[6];
u16 i, nowaddr;
num = t9pyatt->pinxie[0];
if(t9_table3[num+1] == 0){
return 1; //没用的输入
}
//
k = 0;
len0 = strlen((char*)t9pyatt->pinxie);
if(len0 == 1){ //单字母的拼音
word = 0; //用来判断相同的头的
for(i = t9_table3[num]; i < t9_table3[num+1]; i += 8){
read_t9_flashfile(i, (u8*)pinyinbuf, 8);
if(word != pinyinbuf[0]){
word = pinyinbuf[0];
t9pyatt->pinyin[k][0] = word;
t9pyatt->pinyin[k][1] = 0;
//
t9pyatt->pyaddr[k].head = *(u16*)&pinyinbuf[6];
if(t9pyatt->pyaddr[k].head == 0){
t9pyatt->pyaddr[k].head = 6; //第一个偏移特殊
}
read_t9_flashfile(i+8, (u8*)pinyinbuf, 8);
t9pyatt->pyaddr[k].tail = *(u16*)&pinyinbuf[6]-8; //有8个字节不是汉字
t9pyatt->hznum[k] = (t9pyatt->pyaddr[k].tail-t9pyatt->pyaddr[k].head)/2;
k ++;
}
}
}
else{ //多字母的拼音
memset(wordbuf, 0, 6); //用来判断相同的头的
for(i = t9_table3[num]; i < t9_table3[num+1]; i += 8){
read_t9_flashfile(i, (u8*)pinyinbuf, 8);
nowaddr = *(u16*)&pinyinbuf[6];
pinyinbuf[6] = 0; //保证前面可以为字符串
len1 = strlen(pinyinbuf);
if(len1 < len0){
continue; //长度不符越过
}
for(j = 0; j < len1; j ++){
cmpbuf[j] = t9_table2[pinyinbuf[j]-'a']; //从字母转成数字转换
}
if(memcmp((char*)t9pyatt->pinxie, cmpbuf, len0) == 0){ //前面部分相同的串
if(memcmp(wordbuf, pinyinbuf, len0) != 0){
strcpy(wordbuf, pinyinbuf);
//
memcpy(t9pyatt->pinyin[k], pinyinbuf, len0);
t9pyatt->pinyin[k][len0] = 0;
//
t9pyatt->pyaddr[k].head = nowaddr;
if(t9pyatt->pyaddr[k].head == 0){
t9pyatt->pyaddr[k].head = 6; //第一个偏移特殊
}
read_t9_flashfile(i+8, (u8*)pinyinbuf, 8);
t9pyatt->pyaddr[k].tail = *(u16*)&pinyinbuf[6]-8; //有8个字节不是汉字
t9pyatt->hznum[k] = (t9pyatt->pyaddr[k].tail-t9pyatt->pyaddr[k].head)/2;
k ++;
}
}
}
}
//
if(k != 0){ //开始位置
t9pyatt->pynum = k;
t9pyatt->startpy = 0;
t9pyatt->curpy = 0;
t9pyatt->curhz = 0;
}
return k;
}
/*******************************************************************
函数名称: t9main_input
函数功能: t9输入法里增加字母
相关调用:
入口参数: 增加的键值
返 回 值: 如果有变动,就返回1,如果没有操作就返回0;
备 注:
创建信息: YZM 2006-11-26
修改信息:
********************************************************************/
void t9main_input(u8 num, _T9PYATT *t9pyatt)
{
u8 len, back;
len = strlen((char*)t9pyatt->pinxie);
t9pyatt->pinxie[len] = num;
t9pyatt->pinxie[len+1] = 0;
//
back = t9main_input_seek(t9pyatt);
if(back == 0){
t9pyatt->pinxie[len] = 0;
}
else{
t9main_disp(t9pyatt);
}
}
/*******************************************************************
函数名称: t9main
函数功能: t9输入法主程序
相关调用:
入口参数: 键值;输入的结果,如果是0就是没有输入;输入法全局参数;
返 回 值: 经过处理的键值,0内部已经处理;其他键值需要输入主函数处理;
备 注:
创建信息: YZM 2006-11-24
修改信息:
********************************************************************/
u8 t9main(u8 key, char *outtemp, _T9PYATT *t9pyatt)
{
u8 num, pinyinlen;
pinyinlen = strlen((char*)t9pyatt->pinxie);
if(t9pyatt->status == 0){ //拼音状态
num = 0;
switch(key){
case DIGITAL9:
num ++;
case DIGITAL8:
num ++;
case DIGITAL7:
num ++;
case DIGITAL6:
num ++;
case DIGITAL5:
num ++;
case DIGITAL4:
num ++;
case DIGITAL3:
num ++;
case DIGITAL2:
num ++;
case DIGITAL1:
num ++;
case DIGITAL0:
t9main_input(num, t9pyatt);
break;
case ENTER:
if(pinyinlen){
t9pyatt->status = 1;
t9main_disp(t9pyatt);
}
else{
return ENTER;
}
break;
case CLEAR:
if(pinyinlen){
t9pyatt->pinxie[pinyinlen-1] = 0;
t9main_input_seek(t9pyatt);
t9main_disp(t9pyatt);
}
else{
return key;
}
break;
case LEFT:
if(pinyinlen == 0){
return key;
}
if(t9pyatt->curpy){
t9pyatt->curpy --;
t9main_disp(t9pyatt);
}
break;
case RIGHT:
if(pinyinlen == 0){
return key;
}
if((t9pyatt->curpy+1) < t9pyatt->pynum){
t9pyatt->curpy ++;
t9main_disp(t9pyatt);
}
break;
default:
return key;
break;
}
}
else{ //选汉字状态
switch(key){
case LEFT:
if(t9pyatt->curhz){
t9pyatt->curhz --;
}
t9main_disp(t9pyatt);
break;
case RIGHT:
if((t9pyatt->curhz+1) < t9pyatt->hznum[t9pyatt->curpy]){
t9pyatt->curhz ++;
}
t9main_disp(t9pyatt);
break;
case UP:
if(t9pyatt->curhz >= 10){
t9pyatt->curhz -= 10;
}
t9main_disp(t9pyatt);
break;
case DOWN:
if((t9pyatt->curhz+10) < t9pyatt->hznum[t9pyatt->curpy]){
t9pyatt->curhz += 10;
}
t9main_disp(t9pyatt);
break;
case ENTER:
num = (t9pyatt->curhz%10)*2; //距离开头的字符距离
memcpy(outtemp, &t9pyatt->dispbuf[num], 2);
//
memset(t9pyatt, 0, sizeof(_T9PYATT)); //初始状态
t9main_disp(t9pyatt);
return 0;
break;
case ESC:
t9pyatt->status = 0;
t9main_disp(t9pyatt);
break;
case CLEAR:
t9pyatt->status = 0;
if(pinyinlen){
t9pyatt->pinxie[pinyinlen-1] = 0;
t9main_input_seek(t9pyatt);
}
else{
return key;
}
break;
default:
return key;
break;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -