OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4686|回复: 1

看到一个写的比较好的按键程序,支持长按,短按,连按,组合,可是移植修改出错,求指点

[复制链接]

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2015-5-15 10:14:14 | 显示全部楼层 |阅读模式
5金钱

代码如下


/*********************按键1~14***********************/

#define KEY1  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)
#define KEY2  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)<<1
#define KEY3  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)<<2
#define KEY4  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)<<3
#define KEY5  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)<<4
#define KEY6  ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)<<5
#define KEY7  ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)<<6
#define KEY8  ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)<<7
#define KEY9  ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)<<8
#define KEY10 ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)<<9
#define KEY11  ~GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)<<10
#define KEY12  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)<<11
#define KEY13  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)<<12
#define KEY14  ~GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)<<13


#define OneKeyTime        300      //单键长按连续功能时长
#define MuxKeyTime        500      //组合键或长按功能时长
#define RepeatTime        5       //单键连续重复间隔


#define key_state_0        0      //初始态
#define key_state_1        1      //确认态
#define key_state_2        2      //组合键,长按确认态
#define key_state_3        3      //长按连发
#define key_state_4        4      //等待释放

#define Key_Mask (KEY1|KEY2|KEY3|KEY4|KEY5|KEY6|KEY7|KEY8|KEY9|KEY10|KEY11|KEY12|KEY13|KEY14)


typedef enum {
 NO_KEY,

 KEY_UP,
 KEY_DOWN,

 MODE,
 UNIT,
 
 KEY_START,
 KEY_STOP,
 
 MARK1,
 MARK2,
 MARK3,
 MARK4,
 MARK5,
 MARK6,
 MARK7,
 MARK8,

 memory1,
 memory2,
 memory3,
 memory4,
 memory5,
 memory6,
 memory7,
 memory8,
} eKEY;



//按键初始化
void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}


//按键处理

//返回值,枚举类型,键值

eKEY KEY_Scan(void)
{
 static u16 key_time = 0;
 static u8 key_state = 0;
 static u16 key_press_old = 0;
 static eKEY key_value_old = NO_KEY; 
 eKEY key_return = NO_KEY;
 u16 key_press;
 key_press = Key_Mask;
 switch (key_state)
 {
   case key_state_0:    //初始态
       if (key_press)
        {
         key_state = key_state_1;
         key_press_old = key_press;
        }
        break;
   case key_state_1:    //按键确认态
        if (key_press == key_press_old)
        {
         key_time = 0;
         switch(key_press)
            {
             case 1:
                 key_state  = key_state_2;
                 key_return = KEY_UP;
                 break;
             case 1<<1:
                 key_state  = key_state_2;
                 key_return = KEY_DOWN;
                 break;
             case 1<<2:
                 key_state  = key_state_4;
                 key_return = MODE;
                 break;
             case 1<<3:
                 key_state  = key_state_4;
                 key_return = UNIT;
                 break;       
             case 1<<4:
                 key_state  = key_state_4;
                 key_return = KEY_START;
                 break;
             case 1<<5:
                 key_state  = key_state_4;
  key_return = KEY_STOP;
                 break;
           case 1<<6:
                 key_state  = key_state_2;
                 break;
             case 1<<7:
                 key_state  = key_state_2;
  break;
   case 1<<8:
                 key_state  = key_state_2;
                 break;
             case 1<<9:
                 key_state  = key_state_2;
        
                 break;
      case 1<<10:
                 key_state  = key_state_2;
                 break;
             case 1<<11:
                 key_state  = key_state_2;
        
                 break;
      case 1<<12:
                 key_state  = key_state_2;
                 break;
             case 1<<13:
                 key_state  = key_state_2;      
                 break;
             default:
                 key_state  = key_state_4;
                 break;
            }
        }
       else if (!key_press)
            key_state = key_state_0;
       else
            key_state = key_state_4;
                               
            key_value_old = key_return;
            break;
    case key_state_2:
       if (key_press == key_press_old)
         {
            ++key_time;
             if (key_press >= 1<<6)  //记忆按键长短按不同键值
               {
                 if(key_time >= MuxKeyTime)
                    {
                     key_state = key_state_4;
           switch (key_press)
           {
            case 1<<6:key_return = memory1;break;
            case 1<<7:key_return = memory2;break;
            case 1<<8:key_return = memory3;break;
            case 1<<9:key_return = memory4;break;
            case 1<<10:key_return = memory5;break;
            case 1<<11:key_return = memory6;break;
            case 1<<12:key_return = memory7;break;
            case 1<<13:key_return = memory8;break;
            default :break;
           }
                    }
        else
                    {
                     key_state = key_state_4;
           switch (key_press)
           {
            case 1<<6:key_return = MARK1;break;
            case 1<<7:key_return = MARK2;break;
            case 1<<8:key_return = MARK3;break;
            case 1<<9:key_return = MARK4;break;
            case 1<<10:key_return = MARK5;break;
            case 1<<11:key_return = MARK6;break;
            case 1<<12:key_return = MARK7;break;
            case 1<<13:key_return = MARK8;break;
            default :break;
           }
                    }
                }
             else
               {
                if(key_time >= OneKeyTime)     //+-单按键长按
                  {
         key_state = key_state_3;     //长按返回相同键值,连按
         key_time = 0;
         key_return = key_value_old;
                  }
              }
         }
        else
            key_state = key_state_4;
            break;
    case key_state_3:      //单键连按    +-
        if (key_press == key_press_old)
          {
            if (++key_time >= RepeatTime)
               {
                key_time = 0;
                key_return = key_value_old;
               }
          }
    else
     key_state = key_state_4;
          break;
    case key_state_4:
        //if (!key_press) 
        if (key_press != key_press_old)
        key_state = key_state_0;
        break;                       
    }
   return key_return; 
}




就是没效果,求指点

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-15 23:17:42 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 10:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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