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

📄 t9pinyin.c

📁 带五种输入方式的编辑框
💻 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 + -