[STM32F0] 按键中断长按问题

[复制链接]
5056|12
 楼主| shi910229 发表于 2014-7-17 21:25 | 显示全部楼层 |阅读模式
TI, ST, se, LED, ge
我直接在中断里面写长按和短按,我通过进入中断按下计数时间,得出长按和短按的标志位,但是我用STLINK仿真,按键按下long_time标志位总被置为1,是什么原因?

长按可以这么写吗?还是可以用其他办法?

void EXTI0_1_IRQHandler(void)
{
   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
   {               
                 delay500ms();

                  STM_LEDToggle(LED3);
                         count=0;
                         while(EXTI_GetITStatus(EXTI_Line0) != RESET)
                         {
                                 delay500ms();
                                 count++;
                                 if(count>=2)break;
                         }                         
                         if(count>=2)
                         long_time=1;
                                 else
                                short_time=1;

     EXTI_ClearITPendingBit(EXTI_Line0);
   }
}

mmuuss586 发表于 2014-7-17 22:34 来自手机 | 显示全部楼层
while的值一直满足,当然是1;程序里读io判断按键有没有松开,长按还是短按
kamen588 发表于 2014-7-18 08:02 | 显示全部楼层
每隔10-20ms 进入一次定时器中断 检测按键 设置一个常量 当计数累计大于常量时 触发长按键
wyde518 发表于 2014-7-18 08:42 | 显示全部楼层
不建议在终端里面做常安健扫描
 楼主| shi910229 发表于 2014-7-18 09:14 | 显示全部楼层
mmuuss586 发表于 2014-7-17 22:34
while的值一直满足,当然是1;程序里读io判断按键有没有松开,长按还是短按 ...

while的值是我按下之后的值啊,短按和长按判断就在这里啊,我如果长按,count值就会计数,当count值大于2时,就跳出,认定会长按,小于则为短按。逻辑是这样,做出来就不行。啥原因哦。。。
cuitjxg 发表于 2014-7-18 09:30 | 显示全部楼层
建议用定时器中断进行按键检测
smartdog_1 发表于 2014-7-18 17:59 | 显示全部楼层
本帖最后由 smartdog_1 于 2014-7-18 18:01 编辑
  1. while(EXTI_GetITStatus(EXTI_Line0) != RESET)
如果标志位没有手动清除,中断状态寄存器会保持,这样你循环读的时候,结果总是一样的。

现在,跳出循环的唯一条件是
  1. if(count>=2)
  2.    break
所以跳出循环之后,
  1. if(count>=2)
  2.   long_time=1;
肯定会执行的

楼上说的很对,建议用定时器或者Systick判断长按时间。
有按键按下,消抖,记录按下的键值。在主循环中通过Systick或者Timer判断当前逝去的时间,进而判断长按键
 楼主| shi910229 发表于 2014-7-19 10:38 | 显示全部楼层
smartdog_1 发表于 2014-7-18 17:59
如果标志位没有手动清除,中断状态寄存器会保持,这样你循环读的时候,结果总是一样的。

现在,跳出循环的 ...

没用定时器搞过,还在摸索,谢谢了。。。
MOn51 发表于 2014-7-19 10:48 | 显示全部楼层
按键很慢,根本就不要用中断。在主程序里循环,设立状态机。通过记录主程序执行的次数,来确定时间。以后移植到其他MCU也很简单。我自己设计的健译程序是从8031 开始用到现在的F429.PIC的片子也是这样用。
kamen588 发表于 2014-7-19 11:12 | 显示全部楼层
wyde518 发表于 2014-7-18 08:42
不建议在终端里面做常安健扫描

中断长按键检测不是停在中断里面 等待释放 而是检查一下就退出 直到释放 没有任何问题
multisensor 发表于 2015-1-17 09:25 | 显示全部楼层
我想的是,直接把按键的计数程序放在定时器里面做,定时器里面会相应的按键计数来消痘,那么还要外部中断做什么呢?
Serge_Ding 发表于 2015-1-17 10:24 | 显示全部楼层
kamen588 发表于 2014-7-18 08:02
每隔10-20ms 进入一次定时器中断 检测按键 设置一个常量 当计数累计大于常量时 触发长按键 ...

支持,我也是差不多这样做的
Adu0227 发表于 2015-1-17 10:30 | 显示全部楼层
长时间处于中断是不合适的额
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

114

帖子

5

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