求教:怎么实现单个按键的长按短按功能?

[复制链接]
8923|10
 楼主| jormen-zhu 发表于 2010-3-17 10:26 | 显示全部楼层 |阅读模式
各位大侠们:
小弟在此求教单个按键的长按短按功能实现的思路,最好能够贴上程序,C的,汇编小弟还没学。
感谢感谢~~!
maychang 发表于 2010-3-17 10:30 | 显示全部楼层
既然是用单片机,那么可以计算按键按下的持续时间,达到某值仍未释放即为长按,未达到某值即释放为短按。
显然,单片机执行按键程序只能是在按键释放之后再执行。
zhangjunye 发表于 2010-3-17 10:42 | 显示全部楼层
程序里检测按键时长。
 楼主| jormen-zhu 发表于 2010-3-17 10:56 | 显示全部楼层
谢谢楼上的大侠,我用个定时器计算按键按下的时间,基本实现了按键的短按 长按功能,就是有些问题而已,我自己摸索摸索。。不懂再来请教。
liao_fangxing 发表于 2010-3-17 11:46 | 显示全部楼层
支持自己摸索,这样印象更深,收获更大
  PS:提醒下LZ 若采用LS2位大哥的思路,最好注意下一些特殊的情况处理,比如长按不放…………:lol
 楼主| jormen-zhu 发表于 2010-3-17 11:52 | 显示全部楼层
长按已经能实现了,也不会出现太大问题,现在遇到一个问题是短按释放的判断。比如按键按下去为低电平,释放由低电平变为高电平,在这期间是怎么判断的?
void key()
{
        if(key1==0)
        {
                EA=1;
                if(count>=20)
                {
                        flag=1;
                        if(count>=40)
                        flag=0;
                        if(count>=60)
                        flag=1;

                }         
                while(key1==1)          
                {
                        if(count<10)
                        flag=0;
                }

        }
}

以上是我自己瞎写的代码,长按功能判断是没问题的,在开发板上可以看到事件的实现,按键短按释放那里是有问题的(红色字体),我不知道怎么判断,请教~~
mohanwei 发表于 2010-3-17 11:59 | 显示全部楼层
定时器+状态机。先画状态迁移图,再实现代码。具体搜一下本版就有很多实例
 楼主| jormen-zhu 发表于 2010-3-17 17:34 | 显示全部楼层
void key()
{
        if(key1==0)
        {
                EA=1;
                if(count>=20)
                {
                        flag=1;
                        count=0;
                }
        }

        while(key1==1)
        {
                if(count<=5)
                {
                        count=0;
                        flag=0;
                }
        }

       
}

这样写可以实现长按和短按功能,但是在松手那里,把while改成if就实现不了,为什么呢?
opal11 发表于 2013-8-17 15:59 | 显示全部楼层
支持自己摸索,这样印象更深,收获更大
xtzjkj 发表于 2013-8-20 09:07 | 显示全部楼层
目前也是要做这个,表示支持!
koeyb 发表于 2013-8-20 17:04 | 显示全部楼层
很抽象。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:在你立足处深挖下去,                                        就会有泉水涌出!

0

主题

20

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部