QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

发新帖

84

主题

16

听众

2935

积分

超级版主

Rank: 8Rank: 8Rank: 8Rank: 8

该用户从未签到

最后登录
2015-5-31
威望
0
金钱
2423
贡献
0
注册时间
2012-5-1
积分
2935
帖子
492
主题
84
精华
4
UID
2
发表于 2013-4-24 23:36:05 |显示全部楼层
更多
本帖最后由 reille 于 2013-4-24 23:36 编辑

简  介:

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

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


源程序说明:

程序可作为一个单独的功能模块,与其它应用程序模块一起组成一个综合应用程序。因此,设计上,该程序由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、高级宏等知识。因此,如果有什么疑问的话,可以在这里发贴子,我将及时回复。

下载地址:
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员 新浪微博账号登陆

回复

使用道具 举报

0

主题

0

听众

22

积分

实习生

Rank: 1

该用户从未签到

最后登录
2013-5-2
威望
0
金钱
16
贡献
0
注册时间
2013-3-18
积分
22
帖子
6
主题
0
精华
0
UID
216
发表于 2013-4-25 10:42:36 |显示全部楼层
群里看到了,下载学习一下
回复

使用道具 举报

0

主题

0

听众

59

积分

初级工程师

Rank: 2Rank: 2

  • TA的每日心情
    开心
    2013-5-25 09:39
  • 签到天数: 2 天

    [LV.1]初来乍到

    最后登录
    2014-9-30
    威望
    0
    金钱
    52
    贡献
    0
    注册时间
    2012-12-6
    积分
    59
    帖子
    7
    主题
    0
    精华
    0
    UID
    121
    发表于 2013-4-27 17:23:58 |显示全部楼层
    学习一下, 。。。。。
    回复

    使用道具 举报

    1

    主题

    0

    听众

    18

    积分

    实习生

    Rank: 1

  • TA的每日心情
    开心
    2013-5-1 13:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    最后登录
    2013-5-1
    威望
    0
    金钱
    11
    贡献
    0
    注册时间
    2013-5-1
    积分
    18
    帖子
    7
    主题
    1
    精华
    0
    UID
    281
    发表于 2013-5-1 13:20:12 |显示全部楼层
    good thinks good thinks
    回复

    使用道具 举报

    23

    主题

    2

    听众

    898

    积分

    高级工程师

    Rank: 4Rank: 4

  • TA的每日心情
    难过
    2013-9-3 21:37
  • 签到天数: 31 天

    [LV.5]常住居民I

    最后登录
    2014-7-16
    威望
    0
    金钱
    821
    贡献
    0
    注册时间
    2013-5-8
    积分
    898
    帖子
    77
    主题
    23
    精华
    0
    UID
    295
    发表于 2013-5-9 14:44:09 |显示全部楼层
    你好 能不能共享一下你的工程
    回复

    使用道具 举报

    0

    主题

    0

    听众

    25

    积分

    实习生

    Rank: 1

    该用户从未签到

    最后登录
    2014-1-13
    威望
    0
    金钱
    20
    贡献
    0
    注册时间
    2013-7-8
    积分
    25
    帖子
    5
    主题
    0
    精华
    0
    UID
    366
    发表于 2013-7-9 13:51:08 |显示全部楼层
    好东西,感谢感谢
    回复

    使用道具 举报

    5

    主题

    0

    听众

    270

    积分

    中级工程师

    Rank: 3

    该用户从未签到

    最后登录
    2015-6-22
    威望
    0
    金钱
    211
    贡献
    0
    注册时间
    2013-7-17
    积分
    270
    帖子
    59
    主题
    5
    精华
    0
    UID
    382
    发表于 2013-7-23 19:25:29 |显示全部楼层
    这个我得看一下。。。
    回复

    使用道具 举报

    0

    主题

    0

    听众

    137

    积分

    初级工程师

    Rank: 2Rank: 2

    该用户从未签到

    最后登录
    2017-9-28
    威望
    0
    金钱
    119
    贡献
    0
    注册时间
    2013-6-18
    积分
    137
    帖子
    18
    主题
    0
    精华
    0
    UID
    334
    发表于 2013-8-2 08:32:04 |显示全部楼层
    DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
    回复

    使用道具 举报

    2

    主题

    0

    听众

    54

    积分

    初级工程师

    Rank: 2Rank: 2

    该用户从未签到

    最后登录
    2013-10-15
    威望
    0
    金钱
    42
    贡献
    0
    注册时间
    2013-8-3
    积分
    54
    帖子
    12
    主题
    2
    精华
    0
    UID
    410
    发表于 2013-9-8 22:46:34 |显示全部楼层
    谢谢楼主分享,期望能有GPIO的相关配置
    回复

    使用道具 举报

    0

    主题

    0

    听众

    18

    积分

    实习生

    Rank: 1

    该用户从未签到

    最后登录
    2014-4-24
    威望
    0
    金钱
    14
    贡献
    0
    注册时间
    2013-9-14
    积分
    18
    帖子
    4
    主题
    0
    精华
    0
    UID
    460
    发表于 2013-9-14 19:05:55 |显示全部楼层
    kkkk。。。。。。。。。。。。。。。。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员 新浪微博账号登陆

    无觅相关文章插件

    申请友链|手机版|关于本站|站点帮助|eCos技术网 ( 粤ICP备12094833号-1  

    GMT+8, 2018-2-22 08:53 , Processed in 0.135502 second(s), 33 queries .

    Powered by Discuz!2.5 X2.5

    © 2001-2012 Comsenz Inc.

    回顶部