打印
[STM32F1]

按键的问题

[复制链接]
569|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2021-12-7 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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| | 2021-12-7 23:01 | 只看该作者
看看这个中断里有没有延时类的动作

使用特权

评论回复
板凳
zyf部长|  楼主 | 2021-12-7 23:02 | 只看该作者
中断里尽量减少处理的内容。把最重要的部分执行了,减少中断函数运行时间。

使用特权

评论回复
地板
gongche| | 2021-12-7 23:06 | 只看该作者
按键反应迟钝,实际情况如何?怎么就迟钝了,描述具体现象

使用特权

评论回复
5
supernan| | 2021-12-7 23:10 | 只看该作者
定时读取按键最简单,即可消除抖动,也提高了效率

使用特权

评论回复
6
yufe| | 2021-12-7 23:12 | 只看该作者
处理思路为:
中断函数:读取当前按键状态->识别按键状态(例如需要识别按下、抬起、长短按键等)->迭代按键状态
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
stly| | 2021-12-7 23:14 | 只看该作者
我觉得最重要是去抖  然后进行长短判断

使用特权

评论回复
8
pengf| | 2021-12-7 23:16 | 只看该作者
看起来真复杂。

使用特权

评论回复
9
jiahy| | 2021-12-7 23:18 | 只看该作者
你软件上是不是有延时函数啊

使用特权

评论回复
10
shimx| | 2021-12-7 23:20 | 只看该作者
软件进行了延时

使用特权

评论回复
11
jiajs| | 2021-12-7 23:22 | 只看该作者
楼主是在仿真的情况下得到的结论?

使用特权

评论回复
12
zyf部长|  楼主 | 2021-12-7 23:24 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
13
sadicy| | 2021-12-8 15:28 | 只看该作者
中断处理的话,应该比较快的

使用特权

评论回复
14
xiaoqizi| | 2022-1-7 13:07 | 只看该作者
使用的是哪种按键啊

使用特权

评论回复
15
wakayi| | 2022-1-7 13:11 | 只看该作者
是不是按键接触不好呢

使用特权

评论回复
16
tpgf| | 2022-1-7 13:12 | 只看该作者
有没有其他进程干扰啊

使用特权

评论回复
17
wowu| | 2022-1-7 13:14 | 只看该作者
使用的轮询还是中断啊

使用特权

评论回复
18
木木guainv| | 2022-1-7 13:17 | 只看该作者
现在还不涉及到抖动的问题

使用特权

评论回复
19
guanjiaer| | 2022-1-7 13:19 | 只看该作者
想要实时性好还是中断比较可靠

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝