标题: 一个MCU按键如何实现 长按开机 和 长按关机? [打印本页]

作者: 598651219898321    时间: 2020-6-20 14:18
标题: 一个MCU按键如何实现 长按开机 和 长按关机?
如何使用单独按键  长按开机  长按关机
长按开机是用外部中断唤醒
如何在按键按下进入外部中断得时候 到2秒才执行唤醒求大佬给一些代码看看,这个卡了一天时间了,


作者: 3116084089    时间: 2020-6-20 19:36
用代码进行条件延迟  延迟3s 即可
作者: hange_v    时间: 2020-6-20 21:53
试试阻容加比较器,再用外部中断
作者: wulin    时间: 2020-6-21 09:08
设置一个标志,初次上电关闭外部中断,其端口作为普通按键输入。当按键按下达到预定时间等待松手,松手后,标志置位,开外部中断下降沿有效,启动睡眠,如按键按下没有达到预定时间无效。当睡眠中按下按键唤醒并立即关闭外部中断,其端口恢复为普通按键输入。当按键按下达到预定时间等待松手,此时根据标志判断执行开机,标志复位。如按键按下没有达到预定时间则恢复开外部中断下降沿有效,启动睡眠。标志位是按键程序走向的核心!
作者: haokey    时间: 2020-6-23 11:58
if(按下)
{    if(按下未松开标志位 == 0)//松开后再进行第二次计数
    {
        计数++;        if(计数 >= 2s)//2s后确认为按下
        {
            计数 = 0;
            按下未松开标志位 = 1;//
            //要执行的代码
            //要执行的代码
            //要执行的代码
            //要执行的代码
        }
    }
}
else//松开或按下未到2s松开
{
    计数 = 0;//松开就清零
    按下未松开标志位 = 1;
}


作者: Y_G_G    时间: 2020-6-23 13:49
我有汇编的,你要不?
原理是差不多的:
1:先设定关闭外部中断唤醒
2:在开机状态下按下按键就开始查询时间,时间到了还没有松开就关机,时间没有到就松开,就什么也不做
3:关机之前开启外部中断唤醒,然后再进入掉电模式
4:按键按下就进入中断并唤醒,查询时间,时间到了还没有松开就开机,时间没有到就松开的,退出中断之后再次进入掉电模式

作者: yyzzww    时间: 2020-6-23 14:41
获取系统时间,设置全局标志 start_flag ,按键中断配置为双边沿触发,下降沿得时候获取一个系统时间,记录到 pressed_time 变量,当上升沿触发得时候,用当前系统时间减去 pressed_time,大于2s 启动标志设置为 1,执行对应得代码就可以啦
作者: Chellson    时间: 2020-6-23 15:44
试一下用中断
作者: xxpp2011    时间: 2020-6-25 13:10
本帖最后由 xxpp2011 于 2020-6-25 21:33 编辑

while(Key==0)
{
delay(100);
time=time+100;
}
if(time>=2000)执行对应操作;
time=0;
作者: cdlongbo    时间: 2020-6-26 13:43
设置一个全局变量,这个值就一个延时量,开机或者关机时不断累加一个变量当这个变量值等于设定的按键值时就执行相应的开机或者关机!
作者: 权威人物    时间: 2020-7-18 09:35
你所说的唤醒是什么?单片机不会关机的,只会进入低功效模式,在此模式下关闭外设等一系列省电,开启外部中断唤醒,一旦接触到外部电平唤醒即按键按下会立刻唤醒单片机处理(硬件是否对按键做延时不考虑的情况下,如果此按键只有长按开关机的话可以考虑用硬件延时,并不推荐),此时如果你的唤醒是外面能看到的工作的话,那么单片机调用计时函数计算按键是否长按来决定是否开启外设,否则继续进入低功效模式
作者: 上善若水001    时间: 2020-7-18 10:20
权威人物 发表于 2020-7-18 09:35
你所说的唤醒是什么?单片机不会关机的,只会进入低功效模式,在此模式下关闭外设等一系列省电,开启外部中 ...

你好,请问为什么不推荐 硬件延时电路呢?是成本问题还是可靠性问题?

作者: daiwenping    时间: 2020-7-20 09:45
Chellson 发表于 2020-6-23 15:44
试一下用中断

初学者,学习一下
作者: 权威人物    时间: 2020-7-20 15:49
上善若水001 发表于 2020-7-18 10:20
你好,请问为什么不推荐 硬件延时电路呢?是成本问题还是可靠性问题?

程序能完成的为什么要用硬件增加成本?为了节省单片机运行两秒时间的电吗?
作者: 556cv    时间: 2020-7-20 16:15
用外部中断,按键设为双边沿触发
作者: 414    时间: 2021-7-13 14:20
Y_G_G 发表于 2020-6-23 13:49
我有汇编的,你要不?
原理是差不多的:
1:先设定关闭外部中断唤醒

可以看一下你的汇编程序吗
作者: npn    时间: 2021-7-13 15:24
外部中断触发后打开定时器中断(注意中断优先级),累加按键按住的时间,松开清零,满2秒开机。
作者: 790116460    时间: 2021-7-19 18:48
    这里有两种方案
    1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进入休眠模式
    2、硬件实现,外部加个比较大的电容,到2s,才产生对应的高电平

作者: 轩辕顶托    时间: 2021-7-19 23:45
这里有两种方案  1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进入休眠模式  2、硬件实现,外部加个比较大的电容,到2s,才产生对应的高电平
作者: huadong1357    时间: 2021-7-20 08:52
790116460 发表于 2021-7-19 18:48
这里有两种方案
    1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进 ...

用电容延时要考虑 高低温情况下 电容容量的变化导致 延时时间的误差;同时电容自身也存在容量误差;
作者: 名字不是重点    时间: 2021-7-20 09:19
不给代码,给你说一下按键操作的4个状态,1、持续释放,2、按下瞬间,3、持续按下,4、释放瞬间。这4个状态你都能检测到,长短按对你来说都不是事了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1