sheva21 发表于 2010-8-30 13:30:08

关于长按键的识别,如何实现功能,请求指教

程序如下,想通过识别出按键长按2S,来控制DPM这个标志,用的INT0按键中断方式
/*time*/
void TimeC(void)                                                   //计数初始化,产生5ms程序
{
counter=0;
TR1=0;
TMOD|=0x10;
TH1=0xF8;
TL1=0x30;
EA=1;
ET1=1;
TR1=1;
}

void sec_t0(void) interrupt 3                        //中断产生1s程序
{
   TH1=0xF8;
   TL1=0x30;
   INR_5MS=1;
   counter++;
   if(counter==200)
   {
       time_counter--;
       counter=0;
        //L1=!L1;
    }
}

void PWM_set(void)                                  //PWM模式激活设定*
{
   
    if(INT_0==0)
    {
        if(INR_5MS)
      {
          pwm_counter++;
       if(pwm_counter==400)               
       {
           pwm_counter=0;
           DPWM=1;
          L2=1;                                                               
          }
       }
        while(INT_0==0);
        //flag=0;
        //INR_5MS=0;       
   }
}

void PWM_close(void)                        //调光PWM模式返回
{

if(DPWM==1)
{
if(INT_0==0)
   {
    if(INR_5MS)
    {
   pwm_counter++;
   if(pwm_counter==400)
   {
       pwm_counter=0;
        DPWM=0;
        L2=0;
      }
   }
   flag=0;
   }
   while(INT_0==0);
   //INR_5MS=0;
}                                               
}

void key_init (void)                                                        //按键中断初始化
{
key_code=0;
IT0=0;
EA=1;
EX0=1;
}

void INT0_SCANkey() interrupt 0                            //中断实现按键值增加
{
   EX0=0;
   flag=1;
   while(INT_0==0);
   EX0=1;
}

loopzhong 发表于 2010-8-30 13:53:37

排版的实在是难看。

我尝试看一下,不过看不明白,也不知道lz表达的意思。

sheva21 发表于 2010-8-30 14:10:33

想实现长按键2秒对DPWM置为1,然后再按2秒变成0,通过计时器的中断的5ms溢出时标INR_5MS完成按键开始的计时,2秒后使标志状态转换,但是最后没起抓哟用

sheva21 发表于 2010-8-30 15:46:29

外部中断方式实现的按键,支不支持长按这个功能呢,求指点

KunShan_a_dai 发表于 2010-8-30 15:58:28

回复【3楼】sheva21
-----------------------------------------------------------------------
外部中断对于时实性来讲,响应是越快越好。
要实现你想要的功能可以设flg。

Clinging 发表于 2010-8-30 16:02:03

我一般用键龄的,当有按键按下时,每隔一段时间对一个变量加1,判断变量大小就可以知道按键按下的时间

sheva21 发表于 2010-8-30 16:16:30

我就是采用和lS一样的想法,判断INT_0=0,然后每5MS,将计数加1,到400,然后使能DPWM=1,但是貌似这部分程序没有实现功能

sheva21 发表于 2010-8-30 16:36:34

受到上面几位兄弟的指点,修改了一下,这个地方改了下,可以实现功能了
void PWM_set(void)                                  //PWM模式激活设定*
{
   if(DPWM==0)
   {
    if(flag)
    {
       if(INR_5MS)
   {
   INR_5MS=0;
   pwm_counter++;
       if(pwm_counter==400)               
       {
          pwm_counter=0;
          if(flag)
          {
           flag=0;
           DPWM=1;
           L2=0;       
           //while(INT_0==0);
           }                                                       
          }
       }
        }       
   }
}

void PWM_close(void)                        //调光PWM模式返回
{
if(DPWM==1)
{
if(flag)
   {
    if(INR_5MS)
    {
    INR_5MS=0;
   pwm_counter++;
   if(pwm_counter==400)
   {
      pwm_counter=0;
          if(flag)
          {
          flag=0;
          DPWM=0;
          L2=1;
          }
          //while(INT_0==0);
   }
    }
   }
}                                               
}

yanxinboy 发表于 2010-9-1 13:13:43

最近正在玩这个, 按照上面的方法也成功拉. 可是感觉延时太耗CPU资源拉.

songshanxiaozi 发表于 2014-4-15 16:41:16

定时扫描按键,如10ms检查一次。
检查到按下时,CNT+1,当CNT>300时即可认为是第一次长按。CNT=301。
没有检查到按下时,如果CNT<300且CNT>0,认为是短按。CNT=0;.
如果是CNT>300,认为是长按松开。CNT=0.

zjk 发表于 2014-4-17 08:59:40

LZ就不能把程序全贴出来么?看的好别扭
页: [1]
查看完整版本: 关于长按键的识别,如何实现功能,请求指教