打印
[菜农助学交流]

【第三期】按键操作,长按短按..可快速移植添加按键

[复制链接]
3963|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2011-12-14 08:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kyzb001 于 2011-12-14 08:42 编辑

一楼线写一个普通的按键检测方式  直接上代码,大家肯定能看明白
 
void Scanf_Key()
{
  //printf("In time call back");
if(JUDGE_KEY==0)         //有按键按下 并且按键状态为1(长按键松手)
{
  if(KeyOverTime < KEYTIME)       // 去抖
  {
   KeyOverTime++;
  }
  else
  {
   if(KEY_ONE_INPUT==0)     //判断按键1是否按下
   {
    KeyNemu=1;
    KeyPutDown=1;
    KeyPutLongTime++;
   }
   else if(KEY_TWO_INPUT==0)     //判断按键1是否按下
   {     
    KeyNemu=2;
    KeyPutDown=1;
    KeyPutLongTime++;
   }
  }
}
else if(JUDGE_KEY&&KeyPutDown)        //松手检测
{
  KeyPutDown=0;        //松手后清楚长按键状态。
  
  if(KeyNemu==1)
  {
   if(KeyPutLongTime>KEYLONGTIME)
    KeyVolat=0x02;
   else
    KeyVolat=0x01;
   KeyPutLongTime=0;
  }
  else if(KeyNemu==2)
  {
   if(KeyPutLongTime>KEYLONGTIME)
    KeyVolat=0x03;
   else
    KeyVolat=0x03;
   KeyPutLongTime=0;
   KeyOverTime=0;
  }
}

这个按键的优点是简单方便,缺点是不容易移植,如果添加按键,那么就要重新修改添加代码。很麻烦!!!所以草想到能不能弄一个移植非常方便,只要初始化就行的按键检测. 不知道写的怎么样,欢迎大家拍砖

相关帖子

沙发
kyzb001|  楼主 | 2011-12-14 08:55 | 只看该作者
本帖最后由 kyzb001 于 2011-12-14 08:57 编辑

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

代码如下
uint8_t Search_Key() //查找按键
{
switch(KeyBoard_Key)
{
switch(KeyBoard_Key)
{
  case 0:
  {
   if(Key_Board(&KEY_ONE))
    return 1;
   else
    break;    //检测按键1
  }
  case 1:
  {
   if(Key_Board(&KEY_TWO))
    return 1;
   else
    break;  //检测按键2
  }
}
}

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

KEY_TWO.isKeyDownFunc=Key_Two; //同上
KEY_TWO.KeyShort=KEY_DOWN;
KEY_TWO.KeyLong=KEY_ESC;
}
 
static uint8_t Key_Board(key_t *CurrenKey)
{
if(CurrenKey->isKeyDownFunc()==0)         //有按键按下 并且按键状态为1(长按键松手)
{
  if(KeyOverTime < KEYTIME)       // 去抖
  {
   KeyOverTime++;
  }
  else
  {
   if(CurrenKey->isKeyDownFunc()==0)
   {
    KeyPutDown=1;
    KeyPutLongTime++;
   }
  }
}
else if(((CurrenKey->isKeyDownFunc()==1)&&KeyPutDown))        //松手检测
{
         
  if(KeyPutLongTime>KEYLONGTIME)
   KeyVolat=CurrenKey->KeyLong;
  else
   KeyVolat=CurrenKey->KeyShort;
  
  CleatVolat();      //松手后清楚长按键状态和其他值。
  KeyBoard_Key++;      //密钥+1,表示当前任务已经使用完毕,释放改函数,选择下一个
}
else
{
  KeyVolat=KEY_NONE;
  KeyBoard_Key++;
}
if(KeyBoard_Key>1)
  KeyBoard_Key=0;
return  KeyVolat;                       
}
[code]void CleatVolat()
{
KeyOverTime=0;
KeyPutLongTime=0;
KeyPutDown=0;
}
[/code]
 
int32_t Key_Two(void) { return DrvGPIO_GetBit(E_GPB,15);}
int32_t Key_One(void) { return DrvGPIO_GetBit(E_GPB,14);}

uint8_t  KeyVolat=0;
uint8_t  KeyOverTime=0;
uint32_t KeyPutLongTime=0;
uint8_t  KeyPutDown=0;
uint8_t  KeyBoard_Key=0;
uint8_t  KeyNemu;
key_t KEY_ONE,KEY_TWO;
 
extern uint8_t  KeyVolat;

typedef struct
{
int32_t (*isKeyDownFunc)(void); // 函数指针,该函数用来检测按键是否按下
uint8_t  KeyBit;
uint8_t  KeyResult;
uint8_t  KeyShort;
uint8_t  KeyLong;  
}key_t;
enum {
KEY_NONE,
KEY_UP,
KEY_DOWN,
KEY_MENU,
KEY_ESC
};

使用特权

评论回复
板凳
kyzb001|  楼主 | 2011-12-14 09:01 | 只看该作者
本帖最后由 kyzb001 于 2011-12-14 09:04 编辑

DrvHal.c.rar (5.1 KB) DrvHal.h.rar (938 Bytes)
整个工程的代码,还有些地方没写好~就不发了。发上Key的文件

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

使用特权

评论回复
地板
kyzb001|  楼主 | 2011-12-14 09:17 | 只看该作者
还是放个压缩包上来。
功能是  短按点亮,长按熄灭、  一个按键对应一个LED
SDCard.rar (3.07 MB)

使用特权

评论回复
5
weshiluwei6| | 2011-12-18 14:15 | 只看该作者
牛牛牛 曲项向天歌

使用特权

评论回复
6
weshiluwei6| | 2011-12-18 14:16 | 只看该作者
:victory::victory:

使用特权

评论回复
7
kyzb001|  楼主 | 2011-12-18 20:40 | 只看该作者
:)

使用特权

评论回复
8
ichuangj| | 2011-12-21 12:27 | 只看该作者
:lol:)

使用特权

评论回复
9
莱农电工| | 2011-12-25 23:18 | 只看该作者
下决心

使用特权

评论回复
10
kyzb001|  楼主 | 2011-12-26 12:01 | 只看该作者
:lol

使用特权

评论回复
11
菜鸟+新手| | 2012-9-3 16:59 | 只看该作者
:hug::victory:

使用特权

评论回复
12
hanyz123| | 2012-12-31 09:26 | 只看该作者
顶一个, 还在学习这方面的内容。 加油

使用特权

评论回复
13
leijiayou| | 2012-12-31 10:37 | 只看该作者
顶!!!

使用特权

评论回复
14
haphard| | 2012-12-31 16:35 | 只看该作者
还不错啊,挺用心的

使用特权

评论回复
15
p262664916| | 2014-8-18 22:19 | 只看该作者
不错 给力

使用特权

评论回复
16
wdliming| | 2014-8-22 20:19 | 只看该作者
值得鼓励啊!

使用特权

评论回复
17
zdc0124| | 2014-9-16 15:59 | 只看该作者

使用特权

评论回复
18
仙人球W| | 2014-9-29 17:28 | 只看该作者
值得鼓励!

使用特权

评论回复
19
HORSE7812| | 2014-11-19 13:12 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

粉丝