打印
[应用相关]

按键的问题

[复制链接]
664|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Stannis|  楼主 | 2018-5-27 16:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{

    KeyCurrent=((GPIO_ReadInputData(GPIOB)&0xc0)>>6);


   if(KeyCurrent!=KeyOld)  //如果两次值不等,说明按键情况发生了改变
    {
     KeyNoChangedTime=0;       //按键按下情况为0
     KeyOld=KeyCurrent;        //保存当前按键情况
     //return;  //·μ??
    }
   else
    {
     KeyNoChangedTime++;             //按下时间累计
     if(KeyNoChangedTime>=1)         //如果按下时间足够
      {
       KeyNoChangedTime=1;
       KeyPress=KeyOld;      //保存按键
       KeyDown|=(~KeyLast)&(KeyPress); //求出新按下的键
       KeyUp|=KeyLast&(~KeyPress);     //求出新释放的键
       KeyLast=KeyPress;                     //保存当前按键情况
      }
    }
    Key();
   TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
}


我用STM8S207C8T6写程序,开发环境IAR,用定时器中断检测按键。
可是按键反应很迟钝。请高手帮忙看看,谢谢!
沙发
Brand2| | 2018-5-27 17:11 | 只看该作者
看看这个中断里有没有延时类的动作

使用特权

评论回复
板凳
Soraka| | 2018-5-27 17:32 | 只看该作者
中断里尽量减少处理的内容。把最重要的部分执行了,减少中断函数运行时间。

使用特权

评论回复
地板
Garen2| | 2018-5-27 17:48 | 只看该作者
按键反应迟钝,实际情况如何?怎么就迟钝了,描述具体现象

使用特权

评论回复
5
Ryze| | 2018-5-27 17:59 | 只看该作者
定时读取按键最简单,即可消除抖动,也提高了效率

使用特权

评论回复
6
Varus| | 2018-5-27 18:26 | 只看该作者
处理思路为:
中断函数:读取当前按键状态->识别按键状态(例如需要识别按下、抬起、长短按键等)->迭代按键状态
KEY_InFIFO()是缓存函数,可以解决按键状态丢失的情况。

void Key_Detect(void)
{
        uint8_t i;
        Key_Status[0].key_cur_value=KBI1_IO_DATA;        
        Key_Status[1].key_cur_value=KBI2_IO_DATA;
        Key_Status[2].key_cur_value=KBI3_IO_DATA;
        Key_Status[3].key_cur_value=KBI4_IO_DATA;
        Key_Status[4].key_cur_value=KBI5_IO_DATA;
        Key_Status[5].key_cur_value=KBI6_IO_DATA;
        Key_Status[6].key_cur_value=KBI7_IO_DATA;
        Key_Status[7].key_cur_value=KBI8_IO_DATA;
        Key_Status[8].key_cur_value=KBI9_IO_DATA;
        Key_Status[9].key_cur_value=KBI10_IO_DATA;
        Key_Status[10].key_cur_value=KBI11_IO_DATA;
        Key_Status[11].key_cur_value=KBI12_IO_DATA;
        Key_Status[12].key_cur_value=KBI13_IO_DATA;
        Key_Status[13].key_cur_value=KBI14_IO_DATA;
        Key_Status[14].key_cur_value=KBI15_IO_DATA;        
        
        for(i=0;i<KEYNUM;i++)        
        {
                if((Key_Status[i].key_pre_value==1)&&(Key_Status[i].key_cur_value==0))        //--------高->低 按下
                {               
                        if((i!=12)&&(i!=5))                                                                //fall edge key pressed                KEY12
                        {
                                Key_InFIFO(&KEY_BUFF,(i+1));
                        }        
                        //此处添加代码,用来检测需要达到规定时长的按键
                        Key_Status[i].KEY_status=1;//按下        
                        Key_Status[i].key_pres_time=0;                                
                                                        
                }
                else if((Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==1))        //--------低->高 松开
                {
                        Key_Status[i].KEY_status=0;//松开
//                        if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50))                //fall edge key pressed        
//                        {
//                                Key_InFIFO(&KEY_BUFF,(i+1));
//                        }        
                        if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))//  k7 k8 k9 k10 k11 k12 long pressed        key        
                        {
                                        Key_InFIFO(&KEY_BUFF,(0x10+(i+1)));//识别按键是否抬起        
                        }
                }               
                else if((Key_Status[i].KEY_status!=0)&&(Key_Status[i].key_pre_value==0)&&(Key_Status[i].key_cur_value==0))        //--------低->高 松开
                {
                        if(((i==12)||(i==5))&&(Key_Status[i].key_pres_time>=50))                //fall edge key pressed        
                        {
                                Key_Status[i].KEY_status=0;//表示抬起
                                Key_InFIFO(&KEY_BUFF,(i+1));
                        }        
                }
                //长按功能暂时未使用
                if(Key_Status[i].KEY_status==1)
                {
                        Key_Status[i].key_pres_time++;
                        if((Key_Status[i].key_pres_time>50)&&(Key_Status[i].key_pres_time%10==0))
                        {
                                if((i==6)||(i==7)||(i==8)||(i==9)||(i==10)||(i==11))//  k7 k8 k9 k10 k11 k12 long pressed        key        
                                {
                                        Key_InFIFO(&KEY_BUFF,(LONG+(i+1)));//长按识别按键
                                }        
                        }
                }                        
        }
        
        Key_Status[0].key_pre_value=Key_Status[0].key_cur_value;
        Key_Status[1].key_pre_value=Key_Status[1].key_cur_value;
        Key_Status[2].key_pre_value=Key_Status[2].key_cur_value;
        Key_Status[3].key_pre_value=Key_Status[3].key_cur_value;
        Key_Status[4].key_pre_value=Key_Status[4].key_cur_value;
        Key_Status[5].key_pre_value=Key_Status[5].key_cur_value;
        Key_Status[6].key_pre_value=Key_Status[6].key_cur_value;
        Key_Status[7].key_pre_value=Key_Status[7].key_cur_value;
        Key_Status[8].key_pre_value=Key_Status[8].key_cur_value;
        Key_Status[9].key_pre_value=Key_Status[9].key_cur_value;
        Key_Status[10].key_pre_value=Key_Status[10].key_cur_value;
        Key_Status[11].key_pre_value=Key_Status[11].key_cur_value;
        Key_Status[12].key_pre_value=Key_Status[12].key_cur_value;
        Key_Status[13].key_pre_value=Key_Status[13].key_cur_value;
        Key_Status[14].key_pre_value=Key_Status[14].key_cur_value;        
}

使用特权

评论回复
7
zhangmangui| | 2018-5-29 07:47 | 只看该作者
我觉得最重要是去抖  然后进行长短判断

使用特权

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

本版积分规则

176

主题

721

帖子

1

粉丝