[应用相关] 按键的问题

[复制链接]
924|10
 楼主| zyf部长 发表于 2019-12-13 23:55 | 显示全部楼层 |阅读模式

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,用定时器中断检测按键。
可是按键反应很迟钝。请高手帮忙看看,谢谢!
tian111 发表于 2019-12-13 23:57 | 显示全部楼层

看看这个中断里有没有延时类的动作
lium 发表于 2019-12-15 13:25 | 显示全部楼层
中断里尽量减少处理的内容。把最重要的部分执行了,减少中断函数运行时间。
guoyt 发表于 2019-12-15 13:27 | 显示全部楼层
按键反应迟钝,实际情况如何?怎么就迟钝了,描述具体现象
hanwe 发表于 2019-12-15 13:29 | 显示全部楼层
定时读取按键最简单,即可消除抖动,也提高了效率
yufe 发表于 2019-12-15 13:32 | 显示全部楼层
处理思路为:
中断函数:读取当前按键状态->识别按键状态(例如需要识别按下、抬起、长短按键等)->迭代按键状态
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;        
}
llia 发表于 2019-12-15 13:34 | 显示全部楼层
我觉得最重要是去抖  然后进行长短判断
antusheng 发表于 2019-12-15 13:49 | 显示全部楼层
看起来真复杂。
wowu 发表于 2020-1-8 16:47 | 显示全部楼层
你软件上是不是有延时函数啊
xiaoqizi 发表于 2020-1-8 16:53 | 显示全部楼层
软件进行了延时
木木guainv 发表于 2020-1-8 16:56 | 显示全部楼层
楼主是在仿真的情况下得到的结论?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

694

主题

7102

帖子

8

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