搜索
bottom↓
回复: 10

<交流一下> 偷师傻孩子,自己用的简单测试模板-测试按键

[复制链接]

出0入0汤圆

发表于 2014-11-27 16:16:44 | 显示全部楼层 |阅读模式
本帖最后由 slzm40 于 2014-11-28 10:21 编辑

             在傻孩子这个专栏偷师了许久,觉得有必要发出来交流下,顺便听听大家的批评声,以促进自己更大的进步。
        因为是测试小模板,用于测试一些小功能的,所有有些要求并不高,比如串口调试 用的不是循环队列的中断方式,而是用等待方式。
       
        /********测试小模板说明 - 2014-11-27*********/
        模板功能: 有串口回显功能, 时间触发式小系统,延时模块调用,对象方法的使用,宏方法使用
        模板来源:至少80%偷师于傻孩子,因为是自己重编过,所以没有在注释里留下来源,但变量用名等大部份保留原来的格式,有一些修改也只是适用在自己的风格。
        /********测试小模板说明*********/
        *另外由于PIC不支持掩码结构体,所以在对对象方法的简单使用中,做了修改,本次没有使用,但宏有放在H文件中,简单的其实是结构体。*/  

        /*本次主要测试功能,按键功能。*/   

        上次对通用按键模块做了分析和学习, 在通用模块中开了两个队列, 占有了不少的空间,所以我自己修改了下按键模块,去除队列,加入消息传输,以适用于自己的平台。
        按键模块大部份变量和思想 基于傻孩子专栏的 通用按键模块。 也是状态机!
       
        简单说下自己这个按键模块的使用,由于本人属于水平有限。有BUG的地方提出来,以便修正和提高。
        和通用按键模块基本一样的顺序列:

        1、编写按键获取键值函数

        需要编写自己的按键键值获取函数。放在keyqueue.c中(我够懒的,里面不是队列方式)
       
        对了,我是高电平获得按键,平时低电平。
  1. /*这个是需要更改的*/
  2. static uint8_t bsp_key_scan_value()
  3. {
  4.     if( IO_KEY_K1 )
  5.     {
  6.         return KEY_PRESS_K1;
  7.     }
  8.     if( IO_KEY_K2)
  9.     {
  10.         return KEY_PRESS_K2;
  11.     }
  12.     return KEY_NULL;
  13. }
复制代码

        在keyqueue.h中可以拓展按键,可以修改滤波,长击,连击时间,可以拓展按键。
        然后,我的按键只有三种状态,短按,长按,连击,其它的没有做。
  1. //时基为10ms
  2. //用于定义按键滤波,长击,连击时间
  3. #define KEY_FILTER_TIME                2
  4. #define KEY_LONG_TIME                  10
  5. #define KEY_REPEAT_TIME                3

  6. /*用于拓展按键,需要修改*/
  7. typedef enum
  8. {
  9.         KEY_NULL = 0,                /* 0 表示按键事件 */       
  10.         KEY_PRESS_K1,                /* k1按键 */
  11.         KEY_PRESS_K2,                /* k2按键*/
  12.         //KEY_PRESS_K3,                /* k3按键 */
  13.         //KEY_PRESS_K4                /* k3按键 */
  14. }key_value_t;
复制代码


在初始化于配置IO口
  1. void bsp_Key_init(void)
  2. {
  3.         /*按键硬件配置*/
  4.         KEY_K1_INPUT();//按键输入
  5.         KEY_K2_INPUT();//按键输入

  6.         /*消息创建*/
  7.         KeyMsgCreate(&s_tKeyEventMsg,&s_tKeyDetectorMsg);//创建获得键消息
  8. }
复制代码

       
        2、接口使用说明
        经过以上的修改,keyqueue.h: 三个函数就可以使用了。

  1.         void bsp_decetor_Key_Task(void);
  2.         void bsp_Key_init(void);
  3.         bool bsp_GetKey(key_event_t *ptkey);
复制代码

      
       bsp_Key_init();初始化调用
       bsp_decetor_Key_Task(); 在超级循环里调用,我是设成10ms调用一次,配合触发式小系统
       bsp_GetKey()可以获得键值,有键值时返回true,
       
        超级循环:
  1. void main(void)
  2. {
  3.     …
  4.     init_key_task();
  5.     …
  6.     while(1) {     
  7.     …
  8.     //需要在超级循环或者定时器中断处理程序中被周期性的调用  
  9.      if(10ms到)
  10. {   
  11.     bsp_decetor_Key_Task();
  12. }
  13.         Keydeal_loop();   

  14.     }
  15. }
复制代码

       
        按键使用:
  1. void Keydeal_loop(void)
  2. {
  3.            key_event_t keycode = {KEY_NULL,KEY_NONE_PRESSED};
  4.         if(bsp_GetKey(&keycode))
  5.                 {
  6.                 if(KEY_PRESSED == keycode.tEvent)//短按
  7.                         {
  8.                         if(KEY_PRESS_K1 == keycode.chKeyValue)
  9.                                 {
  10.                                 sprint("key1 short press!\n");
  11.                                 }

  12.                         if(KEY_PRESS_K2 == keycode.chKeyValue)
  13.                                 {
  14.                                 sprint("key2 short press!\n");
  15.                                 }
  16.                         }
  17.                 if(KEY_LONG_PRESSED == keycode.tEvent)//长按
  18.                         {
  19.                         if(KEY_PRESS_K1 == keycode.chKeyValue)
  20.                                 {
  21.                                 sprint("key1 long press!\n");
  22.                                 }
  23.                         if(KEY_PRESS_K2 == keycode.chKeyValue)
  24.                                 {
  25.                                 sprint("key2 long press!\n");
  26.                                 }
  27.                         }
  28.                 if(KEY_REPEAT_PRESSED == keycode.tEvent)//连击
  29.                         {
  30.                         if(KEY_PRESS_K1 == keycode.chKeyValue)
  31.                                 {
  32.                                 sprint("key1 repeat press!\n");
  33.                                 }
  34.                         if(KEY_PRESS_K2 == keycode.chKeyValue)
  35.                                 {
  36.                                 sprint("key2 repeat press!\n");
  37.                                 }                       
  38.                         }
  39.         }
  40. }
复制代码


       
        我用的是proteus仿真,Virtual serial port做串口测试;



        结果:
       

        还是传文件吧,欢迎批评。 以求编程水平提高。


/****修改kqueue里 KEY_MSG和key_event_t 多定义的问题****/
/****修改kqueue里有无消息事件 改成枚举,未修正问题。 ****/


       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-11-27 16:18:26 | 显示全部楼层
本帖最后由 slzm40 于 2014-11-28 10:20 编辑

****************************************
说明一下,大部份源码来源于本专栏。


传不上附件。。。

出0入0汤圆

 楼主| 发表于 2014-11-27 16:24:02 | 显示全部楼层
slzm40 发表于 2014-11-27 16:18
****************************************
说明一下,大部份源码来源于本专栏。

在增加按键使用时,只需修改.h文件中的
  1. /*用于拓展按键,需要修改*/
  2. typedef enum
  3. {
  4.         KEY_NULL = 0,                /* 0 表示按键事件 */       
  5.         KEY_PRESS_K1,                /* k1按键 */
  6.         KEY_PRESS_K2,                /* k2按键*/
  7.         //KEY_PRESS_K3,                /* k3按键 */
  8.         //KEY_PRESS_K4                /* k3按键 */
  9. }key_value_t;
复制代码

  1. /*这个是需要更改的*/
  2. static uint8_t bsp_key_scan_value()
  3. {
  4.     if( IO_KEY_K1 )
  5.     {
  6.         return KEY_PRESS_K1;
  7.     }
  8.     if( IO_KEY_K2)
  9.     {
  10.         return KEY_PRESS_K2;
  11.     }
  12.     return KEY_NULL;
  13. }
复制代码


两个地方和配置硬件IO放入初始化,就可以调用了。。bsp_decetor_Key_Task()放入10ms的时基里,bsp_GetKey()就可以使用了。 修改地方为四处。

出0入0汤圆

发表于 2014-11-27 16:32:40 | 显示全部楼层
状态机

出0入296汤圆

发表于 2014-11-28 09:51:32 来自手机 | 显示全部楼层
赞!还没来得及看你的代码,但希望你学习到信息分级处理的思想,这也是模式识别的基本方法。比如手势识别就是用信息分级

出0入0汤圆

 楼主| 发表于 2014-11-28 10:01:57 | 显示全部楼层
本帖最后由 slzm40 于 2014-11-28 10:19 编辑

static KEY_MSG s_tKeyEventMsg;
static key_event_t s_tKeyDetectorMsg;//定义消息内存

在kqueue.c中多定义的了一次,有看代码的,可以把里面删掉一份。

我重新传一份

/****修改kqueue里 KEY_MSG和key_event_t 多定义的问题****/
/****修改kqueue里有无消息事件 改成枚举,未修正问题。 ****/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-11-28 10:04:42 | 显示全部楼层
本帖最后由 slzm40 于 2014-11-28 10:12 编辑
Gorgon_Meducer 发表于 2014-11-28 09:51
赞!还没来得及看你的代码,但希望你学习到信息分级处理的思想,这也是模式识别的基本方法。比如手势识别就 ...


正在学习中,简单点说,从专栏里学到无阻塞状态机方法,面向对象,分层。  
至于信息分级处理思想还有多多思考写代码中慢慢继续领悟。

等你新书啊!

出0入0汤圆

发表于 2015-12-25 15:43:16 | 显示全部楼层
bsp_decetor_Key_Task();这个函数怎么没有贴出来                        

出0入0汤圆

发表于 2015-12-26 15:24:30 | 显示全部楼层
收藏看看,谢谢分享。弱弱的问一句,楼主用的是什么串口调试软件,能放上来共享么

出0入0汤圆

发表于 2015-12-26 15:55:10 | 显示全部楼层
赞一个!

出0入0汤圆

发表于 2015-12-27 15:48:01 | 显示全部楼层
下载下来学习一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 01:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表