野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17437|回复: 11

哪个例程有按键短按和长按实现不同功能的?谢谢

[复制链接]
发表于 2016-9-18 09:22:08 | 显示全部楼层 |阅读模式
现在两个按键key1和2 按下key1切换到一个功能 在功能下边设置key1是对四位数值的位的切换 key2是数字的加  然后长按key1确认(保存数值)
回复

使用道具 举报

发表于 2016-9-18 09:27:33 | 显示全部楼层
没有这样的例程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-18 09:34:38 | 显示全部楼层
flyleaf 发表于 2016-9-18 09:27
没有这样的例程

奥  那怎么判断和实现长按和短按?
回复 支持 反对

使用道具 举报

发表于 2016-9-18 09:50:30 | 显示全部楼层
lyz864512 发表于 2016-9-18 09:34
奥  那怎么判断和实现长按和短按?

检测到按键按下时,测量时间(可以用定时器,也可以用简单的变量读一次电平加1),超出时间就认为是长按
回复 支持 反对

使用道具 举报

发表于 2016-9-18 10:08:04 | 显示全部楼层
这个需要自己写一下的,上一楼说的方法,可行。按一下,让定时器计数开始,松开手让定时器计数结束,然后就按照自己的阈值判断这个时间差开确定长按和短按了
回复 支持 反对

使用道具 举报

发表于 2016-9-18 10:17:57 | 显示全部楼层
/*******************************************************************************
* Function Name  : Get_Key
* Description    : Read the KEY state
* Input          : None
* Output         : None
* Return         : uint8_t KEY state
* Attention                 : None
*******************************************************************************/
uint8_t Get_Key(void)
{
        uint8_t ReadKey;
       
        if(!GPIO_ReadInputDataBit(GPIO_KEY1_PORT,GPIO_KEY1_PIN))
        {
                        ReadKey |= PRESS_KEY1;
        }       
        if(!GPIO_ReadInputDataBit(GPIO_KEY2_PORT,GPIO_KEY2_PIN))
        {
                        ReadKey |= PRESS_KEY2;
        }
        if(!GPIO_ReadInputDataBit(GPIO_KEY3_PORT,GPIO_KEY3_PIN))
        {
                        ReadKey |= PRESS_KEY3;
        }
  
                return ReadKey;
}


/*******************************************************************************
* Function Name  : ReadKeyValue
* Description    : Read the KEY value
* Input          : None
* Output         : None
* Return         : uint8_t KEY value
* Attention                 : None
*******************************************************************************/
uint8_t ReadKeyValue(void)
{
        static uint8_t Key_Check;
        static uint8_t Key_State;
        static uint16_t Key_LongCheck;
        static uint8_t Key_Prev    = 0;     //上一次按键   
       
        uint8_t Key_press;
        uint8_t Key_return = 0;
       
        //KeyCountTime 1MS+1  按键消抖10MS
        if(KeyCountTime >= 10)
        {
                        KeyCountTime = 0;
                        Key_Check = 1;
        }
        //按键消抖10MS后开始处理
        if(Key_Check == 1)
        {       
                Key_Check = 0;
                Key_press = Get_Key();//再次读取按键值
                switch (Key_State)
                {
                        case 0:
                                if(Key_press != 0)//有按键值
                                {
                                        Key_Prev = Key_press;//将值赋予缓存区(上一次按键)
                                        Key_State = 1;
                                }
                                       
                                break;
                        case 1:
                                if(Key_press == Key_Prev)
                                {
                                        Key_State = 2;
                                        Key_return= Key_Prev | KEY_DOWN;
                                }
                          else                                         //按键抬起,是抖动,不响应按键
                                {
                                        Key_State = 0;
                                }
                                break;
                        case 2:

                                if(Key_press != Key_Prev)
                                {                                       
                                        Key_State = 0;
                                        Key_LongCheck = 0;
                                        Key_return = Key_Prev | KEY_UP;
                                        return Key_return;                               
                                }

                                if(Key_press == Key_Prev)
                                {
                                        Key_LongCheck++;
                                        if(Key_LongCheck >= 100)    //长按2S
                                        {                       
                                                Key_LongCheck = 0;
                                                Key_State = 3;
                                                Key_return= Key_press |  KEY_LONG;
                                                return Key_return;       
                                        }                               
                                }
                                break;
                               
                                case 3:
                                if(Key_press != Key_Prev)
                                {
                                        Key_State = 0;
                                }
                                break;       
                }
        }
       
        return  NO_KEY;
}
/*******************************************************************************
* Function Name  : KEY_Handle
* Description    : Key processing function
* Input          : None
* Output         : None
* Return         : None
* Attention                          : None
*******************************************************************************/
void KEY_Handle(void)
{
        uint8_t Key_return =0;
       
        Key_return = ReadKeyValue();
       
        if(Key_return & KEY_UP)
        {
                if(Key_return & PRESS_KEY1)
                {
                        printf("KEY1 PRESS\r\n");
                        LED_RGB_Control(0,0,10);
                        Motor_status(0);
                        keys(1);
                }
                if(Key_return & PRESS_KEY2)
                {
                        printf("KEY2 PRESS\r\n");
                        LED_RGB_Control(0,10,0);
                        Motor_status(10);
                }
                if(Key_return & PRESS_KEY3)
                {
                        printf("KEY3 PRESS\r\n");
                        LED_RGB_Control(10,0,00);
                        DHT11_Read_Data(&Device_ReadStruct.Temperature, &Device_ReadStruct.Humidity);
                        printf("Temperature =%d;Humidity = %d " ,Device_ReadStruct.Temperature,Device_ReadStruct.Humidity);

                        Motor_status(5);
                       
                }                                       
        }

        if(Key_return & KEY_LONG)
        {
                if(Key_return & PRESS_KEY1)
                {
                        KEY_LongHandle(PRESS_KEY1);
                        printf("KEY1 Long PRESS\r\n");
                        printf("M2W RESET WIFI\r\n");
                }
                if(Key_return & PRESS_KEY2)
                {
                        KEY_LongHandle(PRESS_KEY2);
                        printf("KEY2 Long PRESS\r\n");
                        printf("M2W  Config WIFI\r\n");
                }
                if(Key_return & PRESS_KEY3)
                {
                        printf("KEY3 Long PRESS\r\n");
                }                                       
        }
}               
回复 支持 反对

使用道具 举报

发表于 2016-9-18 10:18:33 | 显示全部楼层
这个是机智云的程序,长按和短按的区别,自己可以慢慢看
回复 支持 反对

使用道具 举报

发表于 2016-9-18 10:21:15 | 显示全部楼层
sxr520x 发表于 2016-9-18 10:17
/*******************************************************************************
* Function Name  : ...

用状态机的方法,真的最适合做这些
回复 支持 反对

使用道具 举报

发表于 2016-9-18 11:18:43 | 显示全部楼层
这个做法比较成熟,很多产品都是这么处理按键,延时是通过定时器来实现的,不是简单的NOP一下,因为那样会影响其他程序运行,用定时器比较好。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-18 14:49:01 | 显示全部楼层
sxr520x 发表于 2016-9-18 10:18
这个是机智云的程序,长按和短按的区别,自己可以慢慢看

感谢 受用很大
回复 支持 反对

使用道具 举报

发表于 2016-9-19 16:59:14 | 显示全部楼层
sxr520x 发表于 2016-9-18 11:18
这个做法比较成熟,很多产品都是这么处理按键,延时是通过定时器来实现的,不是简单的NOP一下,因为那样会 ...

使用状态机,按键效果最好,定时器定时扫描
回复 支持 反对

使用道具 举报

发表于 2016-9-29 13:17:32 | 显示全部楼层
状态机确实很强大,结合定时器能够实现复杂的按键检测
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 02:22 , Processed in 0.031412 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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