[源代码] 【eCos应用程序】一个按键扫描应用程序模块

[复制链接]
3491|5
 楼主| reille 发表于 2013-4-25 09:06 | 显示全部楼层 |阅读模式
本帖最后由 reille 于 2013-4-25 09:14 编辑

简  介:

这个按键扫描程序,是我自己写的,在安富莱开发板上已验证OK。功能实现上有参照了安富莱开发板上的按键示例。但具体实现上有自己的特点,也是eCos应用程序一个典型应用程序。

为读取按键值,程序开了一个线程轮询扫描按键状态(频率间隔默认10ms),使用软件滤波方式去除按键抖动,实现了按键按下、按键弹起、按键长按、按键连发等按键状态的读取,并支持组合按键。读取到的按键值将保存在一个缓冲区即所谓的FIFO中,供其它模块读取(在这里是直接打印在串口上)。运行效果如下图所示。

232058saar88u0mhk0jjxk.png

源程序说明:

程序可作为一个单独的功能模块,与其它应用程序模块一起组成一个综合应用程序。因此,设计上,该程序由3个源文件组成,分别是:button.c、button.h、button_api.h。其中,button.c是功能实现;button.h是私有头文件;button_api.h是供其它应用程序模块包含的头文件。提供了3个对外的API函数:
  1. /****************************************************************************/
  2. /*  API functions                                                           */
  3. /****************************************************************************/

  4. /* Module initialization */
  5. void button_init(void * data);

  6. key_t read_key(void);
  7. key_t read_key_by_id(const key_id_t id);
初始化:
  1. /* Module initialization */
  2. void button_init(void * data)
  3. {
  4.     button_global_t * btn = &BUTTON_global;

  5.     BUTTON_MUTEX_init();

  6.     bzero(btn->key_buff, sizeof(btn->key_buff));
  7.     btn->key_buff_read_idx = btn->key_buff_write_idx = 0;

  8.     INIT_BUTTON_USER((&btn->button[KID_USER]));
  9.     INIT_BUTTON_TAMPER((&btn->button[KID_TAMPER]));
  10.     INIT_BUTTON_WAKEUP((&btn->button[KID_WAKEUP]));
  11.     INIT_BUTTON_JOY_UP((&btn->button[KID_JOY_UP]));
  12.     INIT_BUTTON_JOY_DOWN((&btn->button[KID_JOY_DOWN]));
  13.     INIT_BUTTON_JOY_LEFT((&btn->button[KID_JOY_LEFT]));
  14.     INIT_BUTTON_JOY_RIGHT((&btn->button[KID_JOY_RIGHT]));
  15.     INIT_BUTTON_JOY_OK((&btn->button[KID_JOY_OK]));
  16.     INIT_BUTTON_USER_TAMPER((&btn->button[KID_USER_TAMPER]));

  17.     /* Create button thread */
  18.     cyg_thread_create(6,    /* Priority */
  19.                       button_thread,
  20.                       0,
  21.                       "Button thread",
  22.                       BUTTON_thread_stack,
  23.                       sizeof(BUTTON_thread_stack),
  24.                       &BUTTON_thread_handle,
  25.                       &BUTTON_thread_block);
  26.     cyg_thread_resume(BUTTON_thread_handle);/* Starting thread */
  27. }

  28. /* Application entry */
  29. void cyg_user_start(void)
  30. {
  31.     button_init(NULL);
  32.     cyg_scheduler_start();/* Scheduler start */
  33.     return;
  34. }
按键扫描线程函数:
  1. static void button_thread(cyg_addrword_t data)
  2. {
  3.     button_global_t * btn = &BUTTON_global;
  4.     key_id_t id;

  5.         /* Informations */
  6.         diag_printf("******************************************************************************\n");
  7.         diag_printf("**                            A KEY TEST ROUTINE                            **\n");
  8.         diag_printf("**                                                                          **\n");
  9.         diag_printf("** Copyright (C) 2013 eCos Tech Nets(www.52ecos.net). All Rights Reserved.  **\n");
  10.         diag_printf("**                                                                          **\n");
  11.         diag_printf("** Author: reille                                                           **\n");
  12.         diag_printf("** Date  : 2013.04                                                          **\n");        
  13.         diag_printf("** Ver   : Ver0.1                                                           **\n");
  14.         diag_printf("**                                                                          **\n");
  15.         diag_printf("******************************************************************************\n");
  16.         
  17.         diag_printf("\nPlease press a key...\n\n");
  18.         
  19.     while(1) {
  20.         for (id = KID_START; id < KEY_COUNTS; id++) {
  21.             button_detect(&btn->button[id]);
  22.         }

  23. #if (BUTTON_PRINT_KEY_INFO)
  24.         key_t key = read_key();
  25.         if (key != KEY_NONE) {
  26.             diag_printf("key = %d, ", key);
  27.             switch (key) {
  28.                                 case KEY_DOWN_USER:                        /* User键按下 */
  29.                                         diag_printf("'USER' Key Down\n");  break;
  30.                                 case KEY_UP_USER:                        /* User键弹起 */
  31.                                         diag_printf("'USER' Key Up\n");  break;
  32.                                 case KEY_LONG_USER:                        /* User键长按 */
  33.                                         diag_printf("'USER' Key Long Press\n");  break;
  34.                                 case KEY_DOWN_WAKEUP:                /* WakeUp键按下 */
  35.                                         diag_printf("'WAKEUP' Key Down\n");break;
  36.                                 case KEY_UP_WAKEUP:                        /* WakeUp键弹起 */
  37.                                         diag_printf("'WAKEUP' Key Up\n");break;
  38.                                 case KEY_DOWN_TAMPER:                /* Tamper键按下 */
  39.                                         diag_printf("'TAMPER' Key Down\n");break;
  40.                                 case KEY_UP_TAMPER:                        /* Tamper键弹起 */
  41.                                         diag_printf("'TAMPER' Key Up\n");break;
  42.                                 case KEY_DOWN_JOY_UP:                /* 摇杆UP键按下 */
  43.                                         diag_printf("'JOY UP' Key Down\n");break;
  44.                                 case KEY_DOWN_JOY_DOWN:                /* 摇杆DOWN键按下 */
  45.                                         diag_printf("'JOY DOWN' Key Down\n");break;
  46.                                 case KEY_DOWN_JOY_LEFT:                /* 摇杆LEFT键按下 */
  47.                                         diag_printf("'JOY LEFT' Key Down\n");break;
  48.                                 case KEY_DOWN_JOY_RIGHT:        /* 摇杆RIGHT键按下 */
  49.                                         diag_printf("'JOY RIGHT' Key Down\n");break;
  50.                                 case KEY_DOWN_JOY_OK:                /* 摇杆OK键按下 */
  51.                                         diag_printf("'JOY OK' Key Down\n");break;
  52.                                 case KEY_UP_JOY_OK:                        /* 摇杆OK键弹起 */
  53.                                         diag_printf("'JOY OK' Key Up\n");break;
  54.                 case KEY_DOWN_USER_TAMPER:
  55.                     diag_printf("'USER & TAMPER' Combination Key Down\n");break;
  56.                                 default:
  57.                                         diag_printf("Unknown Key\n");break;
  58.                         }
  59.         }
  60. #endif
  61.         APPL_OS_MSLEEP(BUTTON_SCAN_PERIOD_MS);
  62.     }
  63. }
更多的实现,看代码吧。

注  意:

本程序是一个小型的综合性的eCos应用程序,集合了线程、GPIO应用、软件滤波、FIFO、高级宏等知识。因此,如果有什么疑问的话,可以在这里发贴子,我将及时回复。

下载地址:
button (from www.52ecos.net).zip (272.33 KB, 下载次数: 31)
outstanding 发表于 2013-7-20 15:11 | 显示全部楼层
没有玩过 ecos
 楼主| reille 发表于 2013-7-22 09:37 | 显示全部楼层
outstanding 发表于 2013-7-20 15:11
没有玩过 ecos

有兴趣,可以了解!:lol
outstanding 发表于 2013-7-22 10:32 | 显示全部楼层
reille 发表于 2013-7-22 09:37
有兴趣,可以了解!

恩,好的
aaaxmaaa007 发表于 2014-1-3 16:04 | 显示全部楼层
谢谢楼主的共享!对RTT比较熟悉,不知道ecos相比如何?
 楼主| reille 发表于 2014-1-3 19:22 | 显示全部楼层
aaaxmaaa007 发表于 2014-1-3 16:04
谢谢楼主的共享!对RTT比较熟悉,不知道ecos相比如何?

呵,对RTT不熟悉,所以暂时没有答案~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎加入eCos群:144940146 欢迎访问我的个人博客: http://velep.com 喜欢eCos,就像当初喜欢linux一样,如果你也有兴趣访问:http://52ecos.net

17

主题

587

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部