打印
[STM32F0]

按键中断长按问题

[复制链接]
4708|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 | 只看该作者
不建议在终端里面做常安健扫描

使用特权

评论回复
5
shi910229|  楼主 | 2014-7-18 09:14 | 只看该作者
mmuuss586 发表于 2014-7-17 22:34
while的值一直满足,当然是1;程序里读io判断按键有没有松开,长按还是短按 ...

while的值是我按下之后的值啊,短按和长按判断就在这里啊,我如果长按,count值就会计数,当count值大于2时,就跳出,认定会长按,小于则为短按。逻辑是这样,做出来就不行。啥原因哦。。。

使用特权

评论回复
6
cuitjxg| | 2014-7-18 09:30 | 只看该作者
建议用定时器中断进行按键检测

使用特权

评论回复
7
smartdog_1| | 2014-7-18 17:59 | 只看该作者
本帖最后由 smartdog_1 于 2014-7-18 18:01 编辑
while(EXTI_GetITStatus(EXTI_Line0) != RESET)
如果标志位没有手动清除,中断状态寄存器会保持,这样你循环读的时候,结果总是一样的。

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

楼上说的很对,建议用定时器或者Systick判断长按时间。
有按键按下,消抖,记录按下的键值。在主循环中通过Systick或者Timer判断当前逝去的时间,进而判断长按键

使用特权

评论回复
8
shi910229|  楼主 | 2014-7-19 10:38 | 只看该作者
smartdog_1 发表于 2014-7-18 17:59
如果标志位没有手动清除,中断状态寄存器会保持,这样你循环读的时候,结果总是一样的。

现在,跳出循环的 ...

没用定时器搞过,还在摸索,谢谢了。。。

使用特权

评论回复
9
MOn51| | 2014-7-19 10:48 | 只看该作者
按键很慢,根本就不要用中断。在主程序里循环,设立状态机。通过记录主程序执行的次数,来确定时间。以后移植到其他MCU也很简单。我自己设计的健译程序是从8031 开始用到现在的F429.PIC的片子也是这样用。

使用特权

评论回复
10
kamen588| | 2014-7-19 11:12 | 只看该作者
wyde518 发表于 2014-7-18 08:42
不建议在终端里面做常安健扫描

中断长按键检测不是停在中断里面 等待释放 而是检查一下就退出 直到释放 没有任何问题

使用特权

评论回复
11
multisensor| | 2015-1-17 09:25 | 只看该作者
我想的是,直接把按键的计数程序放在定时器里面做,定时器里面会相应的按键计数来消痘,那么还要外部中断做什么呢?

使用特权

评论回复
12
Serge_Ding| | 2015-1-17 10:24 | 只看该作者
kamen588 发表于 2014-7-18 08:02
每隔10-20ms 进入一次定时器中断 检测按键 设置一个常量 当计数累计大于常量时 触发长按键 ...

支持,我也是差不多这样做的

使用特权

评论回复
13
Adu0227| | 2015-1-17 10:30 | 只看该作者
长时间处于中断是不合适的额

使用特权

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

本版积分规则

21

主题

114

帖子

5

粉丝