[菜农助学交流] 【第三期】按键操作,长按短按..可快速移植添加按键

[复制链接]
 楼主| kyzb001 发表于 2011-12-14 08:40 | 显示全部楼层 |阅读模式
本帖最后由 kyzb001 于 2011-12-14 08:42 编辑

一楼线写一个普通的按键检测方式  直接上代码,大家肯定能看明白

  1. void Scanf_Key()
  2. {
  3.   //printf("In time call back");
  4. if(JUDGE_KEY==0)         //有按键按下 并且按键状态为1(长按键松手)
  5. {
  6.   if(KeyOverTime < KEYTIME)       // 去抖
  7.   {
  8.    KeyOverTime++;
  9.   }
  10.   else
  11.   {
  12.    if(KEY_ONE_INPUT==0)     //判断按键1是否按下
  13.    {
  14.     KeyNemu=1;
  15.     KeyPutDown=1;
  16.     KeyPutLongTime++;
  17.    }
  18.    else if(KEY_TWO_INPUT==0)     //判断按键1是否按下
  19.    {     
  20.     KeyNemu=2;
  21.     KeyPutDown=1;
  22.     KeyPutLongTime++;
  23.    }
  24.   }
  25. }
  26. else if(JUDGE_KEY&&KeyPutDown)        //松手检测
  27. {
  28.   KeyPutDown=0;        //松手后清楚长按键状态。
  29.   
  30.   if(KeyNemu==1)
  31.   {
  32.    if(KeyPutLongTime>KEYLONGTIME)
  33.     KeyVolat=0x02;
  34.    else
  35.     KeyVolat=0x01;
  36.    KeyPutLongTime=0;
  37.   }
  38.   else if(KeyNemu==2)
  39.   {
  40.    if(KeyPutLongTime>KEYLONGTIME)
  41.     KeyVolat=0x03;
  42.    else
  43.     KeyVolat=0x03;
  44.    KeyPutLongTime=0;
  45.    KeyOverTime=0;
  46.   }
  47. }

这个按键的优点是简单方便,缺点是不容易移植,如果添加按键,那么就要重新修改添加代码。很麻烦!!!所以草想到能不能弄一个移植非常方便,只要初始化就行的按键检测. 不知道写的怎么样,欢迎大家拍砖
 楼主| kyzb001 发表于 2011-12-14 08:55 | 显示全部楼层
本帖最后由 kyzb001 于 2011-12-14 08:57 编辑

二楼,用结构体定义了按键的对应IO  和键值
检测IO键值的程序为不可重入函数,所以引人了 基本的 “秘钥”KeyBoard_Key这个变量,

代码如下
  1. uint8_t Search_Key() //查找按键
  2. {
  3. switch(KeyBoard_Key)
  4. {
  5. switch(KeyBoard_Key)
  6. {
  7.   case 0:
  8.   {
  9.    if(Key_Board(&KEY_ONE))
  10.     return 1;
  11.    else
  12.     break;    //检测按键1
  13.   }
  14.   case 1:
  15.   {
  16.    if(Key_Board(&KEY_TWO))
  17.     return 1;
  18.    else
  19.     break;  //检测按键2
  20.   }
  21. }
  22. }

  1. void Key_Struct_Init() //初始化按键
  2. {
  3. KEY_ONE.isKeyDownFunc=Key_One;
  4. KEY_ONE.KeyShort=KEY_UP; //短按键键值
  5. KEY_ONE.KeyLong=KEY_MENU; //长按键键值

  6. KEY_TWO.isKeyDownFunc=Key_Two; //同上
  7. KEY_TWO.KeyShort=KEY_DOWN;
  8. KEY_TWO.KeyLong=KEY_ESC;
  9. }

  1. static uint8_t Key_Board(key_t *CurrenKey)
  2. {
  3. if(CurrenKey->isKeyDownFunc()==0)         //有按键按下 并且按键状态为1(长按键松手)
  4. {
  5.   if(KeyOverTime < KEYTIME)       // 去抖
  6.   {
  7.    KeyOverTime++;
  8.   }
  9.   else
  10.   {
  11.    if(CurrenKey->isKeyDownFunc()==0)
  12.    {
  13.     KeyPutDown=1;
  14.     KeyPutLongTime++;
  15.    }
  16.   }
  17. }
  18. else if(((CurrenKey->isKeyDownFunc()==1)&&KeyPutDown))        //松手检测
  19. {
  20.          
  21.   if(KeyPutLongTime>KEYLONGTIME)
  22.    KeyVolat=CurrenKey->KeyLong;
  23.   else
  24.    KeyVolat=CurrenKey->KeyShort;
  25.   
  26.   CleatVolat();      //松手后清楚长按键状态和其他值。
  27.   KeyBoard_Key++;      //密钥+1,表示当前任务已经使用完毕,释放改函数,选择下一个
  28. }
  29. else
  30. {
  31.   KeyVolat=KEY_NONE;
  32.   KeyBoard_Key++;
  33. }
  34. if(KeyBoard_Key>1)
  35.   KeyBoard_Key=0;
  36. return  KeyVolat;                       
  37. }
  38. [code]void CleatVolat()
  39. {
  40. KeyOverTime=0;
  41. KeyPutLongTime=0;
  42. KeyPutDown=0;
  43. }
[/code]

  1. int32_t Key_Two(void) { return DrvGPIO_GetBit(E_GPB,15);}
  2. int32_t Key_One(void) { return DrvGPIO_GetBit(E_GPB,14);}

  3. uint8_t  KeyVolat=0;
  4. uint8_t  KeyOverTime=0;
  5. uint32_t KeyPutLongTime=0;
  6. uint8_t  KeyPutDown=0;
  7. uint8_t  KeyBoard_Key=0;
  8. uint8_t  KeyNemu;
  9. key_t KEY_ONE,KEY_TWO;

  1. extern uint8_t  KeyVolat;

  2. typedef struct
  3. {
  4. int32_t (*isKeyDownFunc)(void); // 函数指针,该函数用来检测按键是否按下
  5. uint8_t  KeyBit;
  6. uint8_t  KeyResult;
  7. uint8_t  KeyShort;
  8. uint8_t  KeyLong;  
  9. }key_t;
  10. enum {
  11. KEY_NONE,
  12. KEY_UP,
  13. KEY_DOWN,
  14. KEY_MENU,
  15. KEY_ESC
  16. };

 楼主| kyzb001 发表于 2011-12-14 09:01 | 显示全部楼层
本帖最后由 kyzb001 于 2011-12-14 09:04 编辑


整个工程的代码,还有些地方没写好~就不发了。发上Key的文件

添加按键的画,只需要添加宏定义,初始化结构体,和switch那里复制一下即可!!!
入口函数放到定时器的回调函数中去!!!

本帖子中包含更多资源

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

×
 楼主| kyzb001 发表于 2011-12-14 09:17 | 显示全部楼层
还是放个压缩包上来。
功能是  短按点亮,长按熄灭、  一个按键对应一个LED

本帖子中包含更多资源

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

×
weshiluwei6 发表于 2011-12-18 14:15 | 显示全部楼层
牛牛牛 曲项向天歌
weshiluwei6 发表于 2011-12-18 14:16 | 显示全部楼层
:victory::victory:
 楼主| kyzb001 发表于 2011-12-18 20:40 | 显示全部楼层
ichuangj 发表于 2011-12-21 12:27 | 显示全部楼层
:lol:)
莱农电工 发表于 2011-12-25 23:18 | 显示全部楼层
下决心
 楼主| kyzb001 发表于 2011-12-26 12:01 | 显示全部楼层
菜鸟+新手 发表于 2012-9-3 16:59 | 显示全部楼层
:hug::victory:
hanyz123 发表于 2012-12-31 09:26 | 显示全部楼层
顶一个, 还在学习这方面的内容。 加油
leijiayou 发表于 2012-12-31 10:37 | 显示全部楼层
顶!!!
haphard 发表于 2012-12-31 16:35 | 显示全部楼层
还不错啊,挺用心的
p262664916 发表于 2014-8-18 22:19 | 显示全部楼层
不错 给力
wdliming 发表于 2014-8-22 20:19 | 显示全部楼层
值得鼓励啊!
zdc0124 发表于 2014-9-16 15:59 | 显示全部楼层
仙人球W 发表于 2014-9-29 17:28 | 显示全部楼层
值得鼓励!
HORSE7812 发表于 2014-11-19 13:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

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