打印
[51单片机]

怎么在定时中断中实现按键长短按???

[复制链接]
2217|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vicrobin|  楼主 | 2014-2-20 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,高手帮我改一下这个中断呗,让K_SET有长短按功能
void Time0() interrupt 1
{
        char d,e;
        TR0=0;       
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        TR0=1;       
        d=P3;
        //if((d&0xe0)|0xe0); //只对P1的高三位进行处理)
        //        KeyState=0;
        if(K_SET==0)
                {
                        KeyState=1;
                        e=0;
                        e++;
                        if(e==1000)
                        {
                                KeyState=2;
                                return;
                        }
                }
        if(K_INC==0)
                KeyState=3;
        if(K_DEC==0)
                KeyState=4;
}

麻烦帮我弄一下,让K_SET健短按一下KeyState=1,长按=2.谢谢!

相关帖子

沙发
ningling_21| | 2014-2-20 15:41 | 只看该作者
if(K_SET==0 && KeyState==0)
    {
       KeyState=1;
}
else if(K_SET==0 && KeyState==1)
{
     Press_cnt++;
     KeyState =2;      //短按,未释放
    if(Press_cnt>500)
    {
       KeyState=3;//长按
       Press_cnt=0;
    }
}

使用特权

评论回复
板凳
coody| | 2014-2-20 15:43 | 只看该作者
查询,计时

使用特权

评论回复
地板
liudanwei| | 2014-2-20 19:07 | 只看该作者
学习学习。

使用特权

评论回复
5
vicrobin|  楼主 | 2014-2-21 10:40 | 只看该作者
ningling_21 发表于 2014-2-20 15:41
if(K_SET==0 && KeyState==0)
    {
       KeyState=1;

我还是没调试出来!

使用特权

评论回复
6
vicrobin|  楼主 | 2014-2-21 10:41 | 只看该作者
coody 发表于 2014-2-20 15:43
查询,计时

感谢,我再看看资料!

使用特权

评论回复
7
ningling_21| | 2014-2-21 10:41 | 只看该作者
vicrobin 发表于 2014-2-21 10:40
我还是没调试出来!

程序贴出来...

使用特权

评论回复
8
vicrobin|  楼主 | 2014-2-21 10:41 | 只看该作者
liudanwei 发表于 2014-2-20 19:07
学习学习。

恩恩,大家互相学习。

使用特权

评论回复
9
vicrobin|  楼主 | 2014-2-21 10:45 | 只看该作者
ningling_21 发表于 2014-2-21 10:41
程序贴出来...

/***************************************************************
                            按键部分
****************************************************************/
void Time0() interrupt 1
{
        int d,Press_cnt;
        TR0=0;       
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        TR0=1;       
        d=P3;
        if(K_SET==0 && KeyState==0)
                {
                   KeyState=1;
                }
                else if(K_SET==0 && KeyState==1)
                {
                         Press_cnt++;
                        if(Press_cnt>500)
                        {
                           KeyState=2;//长按
                           Press_cnt=0;
                        }
                }
        if(K_INC==0)
                KeyState=3;
        if(K_DEC==0)
                KeyState=4;
}

void main()
{
        Init();//程序初始化
        while(1)
        {       
                switch(KeyState)
                        {
                                case 1: NormalMode();break;
                                case 2:        SettingMode();break;
                                case 3:        AccdientMode();break;
                                case 4:        tewsn++;break;
                                //case 4:        tewsn--;break;
                        }
        }
}

我想很简单就是,中断中返回一个KeyState值,主函数中进行对应操作。

使用特权

评论回复
10
ningling_21| | 2014-2-21 10:58 | 只看该作者
int d,Press_cnt;

这怎么能在中断中定义呢,肯定是全局变量嘛...

使用特权

评论回复
11
computer00| | 2014-2-21 11:03 | 只看该作者
将Press_cnt的定义改成static int Press_cnt;
另外,当按键抬起后,要将Press_cnt清0。
如果你要实现多个按键的长按功能,还得对每个按键定义一个Press_cnt_XXX。

使用特权

评论回复
12
gdutxzy| | 2014-2-21 14:30 | 只看该作者
计数中断次数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

0

粉丝