搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 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;
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-8-30 13:53:37 | 显示全部楼层
排版的实在是难看。

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

出0入0汤圆

 楼主| 发表于 2010-8-30 14:10:33 | 显示全部楼层
想实现长按键2秒对DPWM置为1,然后再按2秒变成0,通过计时器的中断的5ms溢出时标INR_5MS完成按键开始的计时,2秒后使标志状态转换,但是最后没起抓哟用

出0入0汤圆

 楼主| 发表于 2010-8-30 15:46:29 | 显示全部楼层
外部中断方式实现的按键,支不支持长按这个功能呢,求指点

出0入0汤圆

发表于 2010-8-30 15:58:28 | 显示全部楼层
回复【3楼】sheva21
-----------------------------------------------------------------------
外部中断对于时实性来讲,响应是越快越好。
要实现你想要的功能可以设flg。

出0入0汤圆

发表于 2010-8-30 16:02:03 | 显示全部楼层
我一般用键龄的,当有按键按下时,每隔一段时间对一个变量加1,判断变量大小就可以知道按键按下的时间

出0入0汤圆

 楼主| 发表于 2010-8-30 16:16:30 | 显示全部楼层
我就是采用和lS一样的想法,判断INT_0=0,然后每5MS,将计数加1,到400,然后使能DPWM=1,但是貌似这部分程序没有实现功能

出0入0汤圆

 楼主| 发表于 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);
     }
    }
   }
  }                                               
}

出0入0汤圆

发表于 2010-9-1 13:13:43 | 显示全部楼层
最近正在玩这个, 按照上面的方法也成功拉. 可是感觉延时太耗CPU资源拉.

出0入0汤圆

发表于 2014-4-15 16:41:16 | 显示全部楼层
定时扫描按键,如10ms检查一次。
检查到按下时,CNT+1,当CNT>300时即可认为是第一次长按。CNT=301。
没有检查到按下时,如果CNT<300且CNT>0,认为是短按。CNT=0;.
如果是CNT>300,认为是长按松开。CNT=0.

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 02:11

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

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