单个按键程序,实现单击双击长按

2020-01-14 18:57发布

本帖最后由 cumthe 于 2013-9-29 09:44 编辑

闲来无事,写了一个小程序,欢迎讨论和拍砖。
扫描在定时器中应该占不了太多资源。

enum Btn{NoClick = 0,ShortClick,DoubleClick,LongClick};
enum Btn        BtnState = NoClick ;

#define LongClickTime        1000UL
#define DoubleClickTimeDur        200

定时器中:
        static unsigned int count = 0,ShortClickFlag = 0,ShortClickFlagCount = 0;

        if(SW == 0)
        {
                  count++;
        }
        else
        {
                 if(count>=5 && count < LongClickTime)
                {
                         if(ShortClickFlag == 1)
                        {       
                                ShortClickFlag = 0;
                                BtnState = DoubleClick;
                        }
                        else
                        {
                                 ShortClickFlag = 1;
                        }
                }
                else if(count >= LongClickTime)
                {
                         BtnState = LongClick;
                }
                count = 0;
                if(ShortClickFlag == 1)
                {                
                        if(ShortClickFlagCount++ > DoubleClickTimeDur)
                        {
                                 BtnState = ShortClick;
                                ShortClickFlag = 0;
                                ShortClickFlagCount = 0;
                        }       
                }
                else
                {
                         ShortClickFlagCount = 0;
                }               
        }

主函数中:
注意在使用BtnState 后,需将其置位NoClick
                switch(BtnState)
                {
                        case        NoClick:
                                break;
                         case        ShortClick:
                                BtnState = NoClick;
                                break;
                        case        DoubleClick:
                                BtnState = NoClick;
                                break;
                        case        LongClick:
                                BtnState = NoClick;
                                break;
                }       

修改后:
定时器中:
        static unsigned int count = 0,ShortClickFlagCount = 0;        
        //count为按键按下计时变量;ShortClickFlagCount为单击按键后超时判断是否有双击计时变量
        static unsigned char ShortClickFlag = 0,LongClickFlag = 0;       
        //ShortClickFlag为单击按键标志,判断双击时用;LongClickFlag为长按按键标志,防止按键按下不释放

        if(SW == 0)
        {
                if(count < LongClickTime)
                {
                         count++;
                }
                else
                {
                         BtnState = LongClick;
                        LongClickFlag = 1;
                }
        }
        else
        {
                 if(count>=5 && count < LongClickTime)
                {
                         if(ShortClickFlag == 1)
                        {       
                                ShortClickFlag = 0;
                                BtnState = DoubleClick;
                        }
                        else
                        {
                                 ShortClickFlag = 1;
                        }
                }
                else if(count >= LongClickTime && LongClickFlag == 0)
                {
                         BtnState = LongClick;
                }
                LongClickFlag = 0;
                count = 0;
                if(ShortClickFlag == 1)
                {                
                        if(ShortClickFlagCount++ > DoubleClickTimeDur)
                        {
                                 BtnState = ShortClick;
                                ShortClickFlag = 0;
                                ShortClickFlagCount = 0;
                        }       
                }
                else
                {
                         ShortClickFlagCount = 0;
                }               
        }

主函数中:
注意在使用BtnState 后,需将其置位NoClick
                switch(BtnState)
                {
                        case        NoClick:
                                break;
                         case        ShortClick:
                                BtnState = NoClick;
                                break;
                        case        DoubleClick:
                                BtnState = NoClick;
                                break;
                        case        LongClick:
                                BtnState = NoClick;
                                break;
                        default:       
                                break;
                }       
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
29条回答
jz701209李
1楼-- · 2020-01-17 19:40
谢谢再试                 
金牛AKI
2楼-- · 2020-01-18 01:30
 精彩回答 2  元偷偷看……
Jach_cc
3楼-- · 2020-01-18 07:05
好东西,顶。
cxhy
4楼-- · 2020-01-18 10:41
我回家就测试
tangly2017
5楼-- · 2020-01-18 12:02
好东西,谢谢楼主的分享!!!!!!!!!!!!!!!!!!!

一周热门 更多>