| 本帖最后由 正点原子运营 于 2024-5-24 18:12 编辑 
 
 1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板 
 2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版 
 
 
 
 6)正点原子STM32技术交流QQ群:725095144 
 
 
  本章将介绍正点原子提供的T9拼音输入法库的使用,用其实现一个简单的T9拼音输入法应用。通过本章的学习,读者将学习到正点原子T9拼音输入法库的使用。 本章分为如下几个小节: 53.1 硬件设计 53.2 程序设计 53.3 下载验证 
     53.1 硬件设计 53.1.1 例程功能 1. 输入拼音后,LCD和串口显示匹配结果 2. 按下WKUP按键可清除输入 3. 按下KEY0按键可换页匹配结果 4. LED0闪烁,提示程序正在运行 
 53.1.2 硬件资源 1. LED        LED0 - PB5 2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块 3. USART1        USART1_TX - PA9        USART1_RX - PA10 4. NOR Flash        SPI2_SCK - PB13        SPI2_MISO - PB14        SPI2_MOSI - PB15        SPI2_CS - PB12 5. SD        SDIO_D0 - PC8        SDIO_D1 - PC9        SDIO_D2 - PC10        SDIO_D3 - PC11        SDIO_SCK - PC12        SDIO_CMD - PD2 6. 24C02        IIC_SCL - PB10        IIC_SDA - PB11 
 53.1.3原理图 本章实验使用的T9拼音输入法库为软件库,因此没有对应的连接原理图。 
 53.2 程序设计 53.2.1 T9拼音输入法库的使用 正点原子提供的T9拼音输入法库包含三个文件,分别为:pyinput.c、pyinput.h和pymb .h,本章实验配套的实验例程中已经提供了这三个文件,并且针对正点原子M144Z-M3最小系统板STM32F103版进行了移植适配,在使用时,仅需将这三个文件添加到自己的工程即可,如下图所示:                                  T9拼音输入法库提供了匹配码表的函数,使用非常方便。 匹配码表函数的使用示例,如下所示: 复制代码#include "./T9INPUT/pyinput.h"
void example_fun(void)
{
    uint8_t inputstr[5];
    uint8_t res;
    uint8_t index;
   
    /* 拼音输入 */
    // inputstr[0] = 9; // wxyz
    // inputstr[1] = 4; // ghi
    // inputstr[2] = 3; // def
    // inputstr[3] = 6; // mno
    // inputstr[4] = 4; // ghi
   
    /* 匹配码表 */
    res= t9.getpymb(inputstr);
    /* 有匹配结果 */
    if (res != 0)
    {
         /* 展示所有匹配结果 */
         for (index=0; index<(res&0x7F); index++)
         {
             // printf("拼音: %s\r\n", t9.pymb[index]->py);
             // printf("结果: %s\r\n", t9.pymb[index]->pymb);
         }
    }
    /* 无匹配结果 */
    else
    {
         /* Dosomething */
    }
}
53.2.2 实验应用代码 本章实验的应用代码,如下所示: 复制代码int main(void)
{
    /* 仅保留关键代码,其余代码省略 */
   
RESTART:
    while (1)
    {
         /* 获取触摸点对应的键值 */
         pykey = py_get_keynum(30, 195);
         /* 有有效键值 */
         if (pykey != 0)
         {
             /* 退格键 */
             if (pykey == 1)
             {
                 if (inputlen != 0)
                 {
                     inputlen--;
                 }
                 inputstr[inputlen] = '\0';
             }
             /* 其他有效键值 */
             else
             {
                 inputstr[inputlen] = pykey + '0';
                 if (inputlen < 7)
                 {
                     inputlen++;
                 }
             }
            
             /* 有输入 */
             if (inputstr[0] != '\0')
             {
                 /* 匹配码表 */
                 pykey = t9.getpymb(inputstr);
                 /* 有匹配结果 */
                 if (pykey != 0)
                 {
                     result_num = pykey & 0x7F;
                     cur_index = 1;
                 }
                 /* 无匹配结果 */
                 else
                 {
                     inputlen--;
                     inputstr[inputlen] = '\0';
                 }
             }
             /* 无输入 */
             else
             {
                 cur_index = 0;
                 result_num = 0;
             }
            
             /* 显示输入和匹配结果 */
             lcd_fill(30 + 40, 105, 30 + 40 + 48, 110 + 16, WHITE);
             lcd_show_num(30 + 144, 105, result_num, 1, 16, BLUE);
             text_show_string(30 + 40, 105, 200, 16, (char *)inputstr,16,0,BLUE);
             py_show_result(cur_index);
         }
         
         /* 有匹配结果 */
         if (result_num != 0)
         {
             key = key_scan(0);
             switch (key)
             {
                 /* 匹配翻页 */
                 case KEY0_PRES:
                 {
                     if (cur_index < result_num)
                     {
                         cur_index++;
                     }
                     else
                     {
                         cur_index = 1;
                     }
                     py_show_result(cur_index);
                     break;
                 }
                 /* 清除 */
                 case WKUP_PRES:
                 {
                     lcd_fill(30 + 40, 145, lcddev.width - 1, 145 + 48, WHITE);
                     goto RESTART;
                 }
             }
         }
    }
}
由于本实验的应用代码过于冗长,因此上面代码仅保留了部分关键代码,完成代码请读者自行查看本实验的配套实验例程。从上面的代码中可以看出,本实验实验的应用中,通过触摸屏获取拼音的键值,然后调用函数t9. getpymb()进行码表匹配,有匹配结果时,则在LCD上显示匹配结果,若有多个匹配结果,则可通过KEY0按键进行翻页,通过也可通过WKUP按键清除输入。 
 53.3 下载验证 在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,通过也显示了T9拼音的输入键盘,此时便可通过键盘输入拼音,随即便可在LCD上看到输入拼音对应的汉字匹配结果,若有多个匹配结果,例如输入“64”,则会匹配到拼音“mi”和“ni”,此时按下KEY0按键,可对多个匹配结果进行翻页,若按下WKUP按键则会清除所有输入。 |