搜索
bottom↓
回复: 29

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

[复制链接]

出0入0汤圆

发表于 2013-9-28 12:03:06 | 显示全部楼层 |阅读模式
本帖最后由 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;
                }       

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-9-28 12:03:25 | 显示全部楼层
自己顶一个

出0入0汤圆

 楼主| 发表于 2013-9-28 13:49:24 | 显示全部楼层
顶顶更健康啊,兄弟们

出0入0汤圆

发表于 2013-9-28 14:04:36 | 显示全部楼层
不错啊。谢谢啦

出0入0汤圆

 楼主| 发表于 2013-9-28 14:06:55 | 显示全部楼层
我试过了,暂时没碰到问题

出0入54汤圆

发表于 2013-9-28 14:08:43 | 显示全部楼层
switch没有default

出0入0汤圆

发表于 2013-9-28 15:14:25 | 显示全部楼层
不错,值得学习。

出0入0汤圆

发表于 2013-9-28 17:01:29 | 显示全部楼层
先顶了 有问题找你,你要售后

出0入0汤圆

发表于 2013-9-28 17:26:39 | 显示全部楼层
顶顶

出0入0汤圆

 楼主| 发表于 2013-9-28 19:05:49 | 显示全部楼层
lusson 发表于 2013-9-28 14:08
switch没有default

嗯。最好加上default。

出0入0汤圆

 楼主| 发表于 2013-9-28 19:06:58 | 显示全部楼层
金牛AKI 发表于 2013-9-28 17:01
先顶了 有问题找你,你要售后

哈哈。免费售后

出0入54汤圆

发表于 2013-9-28 19:19:47 | 显示全部楼层
cumthe 发表于 2013-9-28 19:05
嗯。最好加上default。

不是最好加上,而是一定要加上。

出0入96汤圆

发表于 2013-9-28 19:25:10 | 显示全部楼层
如果长按那里是不是做个超时判断啊?否则一直按住不放~~会不会造成假象?

出0入0汤圆

 楼主| 发表于 2013-9-28 19:36:39 | 显示全部楼层
gallle 发表于 2013-9-28 19:25
如果长按那里是不是做个超时判断啊?否则一直按住不放~~会不会造成假象? ...

对。加个超时,如果大于某个值后等待按键释放,count停止增加。

出0入0汤圆

发表于 2013-9-28 20:28:50 | 显示全部楼层
绑定,做个记号

出0入0汤圆

发表于 2013-9-28 21:45:39 来自手机 | 显示全部楼层
mark,顺便帮顶一下

出0入0汤圆

发表于 2013-9-28 22:27:23 | 显示全部楼层
好像有个问题,,长按情况下,一般是只执行一次。。而你是执行1000后,清0,如果我还继续再按住没放,继续1000 你又会出现一个长按

第二个问题,你看过哪个长按是带松手操作的么? 


当同一个按键有长按,短按时,短按做松手检测,长按是不做松手检测的,长按时间到了,就进去了长按处理程序,而且只进入一次,哪怕你按住一天,它也只进入一次!(当然数据连发,中间再加判断)

出0入0汤圆

发表于 2013-9-28 23:06:31 | 显示全部楼层
老问题,得重新好好学

出0入0汤圆

 楼主| 发表于 2013-9-29 09:45:05 | 显示全部楼层
lusson 发表于 2013-9-28 19:19
不是最好加上,而是一定要加上。

已修改,欢迎指正

出0入0汤圆

 楼主| 发表于 2013-9-29 09:45:32 | 显示全部楼层
zuu0 发表于 2013-9-28 22:27
好像有个问题,,长按情况下,一般是只执行一次。。而你是执行1000后,清0,如果我还继续再按住没放,继续1 ...

已修改,欢迎指正

出0入54汤圆

发表于 2013-9-29 10:00:36 | 显示全部楼层
cumthe 发表于 2013-9-29 09:45
已修改,欢迎指正

最好default也加上:BtnState = NoClick;

因为default相当于异常处理,异常的时候需要让状态恢复到正常状态,否则就不能继续往下跑了。

出0入0汤圆

发表于 2013-9-29 10:34:21 | 显示全部楼层
记录次数和记录时间

出0入0汤圆

发表于 2013-10-1 17:07:09 | 显示全部楼层
感觉还不错,留个记号回去试用

出0入0汤圆

发表于 2013-10-1 17:21:58 | 显示全部楼层
帮顶        

出0入0汤圆

发表于 2013-10-2 09:00:37 来自手机 | 显示全部楼层
谢谢再试                 

出0入0汤圆

发表于 2013-10-2 22:44:32 | 显示全部楼层
不错不错啊

出0入0汤圆

发表于 2013-10-4 02:35:12 | 显示全部楼层
好东西,顶。

出0入0汤圆

发表于 2013-10-4 08:56:29 | 显示全部楼层
我回家就测试

出0入0汤圆

发表于 2018-1-6 15:05:10 | 显示全部楼层
好东西,谢谢楼主的分享!!!!!!!!!!!!!!!!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 19:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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