找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6394|回复: 20
收起左侧

一个MCU按键如何实现 长按开机 和 长按关机?

  [复制链接]
ID:602673 发表于 2020-6-20 14:18 | 显示全部楼层 |阅读模式
如何使用单独按键  长按开机  长按关机
长按开机是用外部中断唤醒
如何在按键按下进入外部中断得时候 到2秒才执行唤醒求大佬给一些代码看看,这个卡了一天时间了,

回复

使用道具 举报

ID:785268 发表于 2020-6-20 19:36 | 显示全部楼层
用代码进行条件延迟  延迟3s 即可
回复

使用道具 举报

ID:190832 发表于 2020-6-20 21:53 | 显示全部楼层
试试阻容加比较器,再用外部中断
回复

使用道具 举报

ID:213173 发表于 2020-6-21 09:08 | 显示全部楼层
设置一个标志,初次上电关闭外部中断,其端口作为普通按键输入。当按键按下达到预定时间等待松手,松手后,标志置位,开外部中断下降沿有效,启动睡眠,如按键按下没有达到预定时间无效。当睡眠中按下按键唤醒并立即关闭外部中断,其端口恢复为普通按键输入。当按键按下达到预定时间等待松手,此时根据标志判断执行开机,标志复位。如按键按下没有达到预定时间则恢复开外部中断下降沿有效,启动睡眠。标志位是按键程序走向的核心!

评分

参与人数 1黑币 +5 收起 理由
MOVEORDIE + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:569384 发表于 2020-6-23 11:58 | 显示全部楼层
if(按下)
{    if(按下未松开标志位 == 0)//松开后再进行第二次计数
    {
        计数++;        if(计数 >= 2s)//2s后确认为按下
        {
            计数 = 0;
            按下未松开标志位 = 1;//
            //要执行的代码
            //要执行的代码
            //要执行的代码
            //要执行的代码
        }
    }
}
else//松开或按下未到2s松开
{
    计数 = 0;//松开就清零
    按下未松开标志位 = 1;
}

回复

使用道具 举报

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

使用道具 举报

ID:787643 发表于 2020-6-23 14:41 | 显示全部楼层
获取系统时间,设置全局标志 start_flag ,按键中断配置为双边沿触发,下降沿得时候获取一个系统时间,记录到 pressed_time 变量,当上升沿触发得时候,用当前系统时间减去 pressed_time,大于2s 启动标志设置为 1,执行对应得代码就可以啦
回复

使用道具 举报

ID:783844 发表于 2020-6-23 15:44 | 显示全部楼层
试一下用中断
回复

使用道具 举报

ID:452950 发表于 2020-6-25 13:10 | 显示全部楼层
本帖最后由 xxpp2011 于 2020-6-25 21:33 编辑

while(Key==0)
{
delay(100);
time=time+100;
}
if(time>=2000)执行对应操作;
time=0;
回复

使用道具 举报

ID:790159 发表于 2020-6-26 13:43 | 显示全部楼层
设置一个全局变量,这个值就一个延时量,开机或者关机时不断累加一个变量当这个变量值等于设定的按键值时就执行相应的开机或者关机!
回复

使用道具 举报

ID:311846 发表于 2020-7-18 09:35 | 显示全部楼层
你所说的唤醒是什么?单片机不会关机的,只会进入低功效模式,在此模式下关闭外设等一系列省电,开启外部中断唤醒,一旦接触到外部电平唤醒即按键按下会立刻唤醒单片机处理(硬件是否对按键做延时不考虑的情况下,如果此按键只有长按开关机的话可以考虑用硬件延时,并不推荐),此时如果你的唤醒是外面能看到的工作的话,那么单片机调用计时函数计算按键是否长按来决定是否开启外设,否则继续进入低功效模式
回复

使用道具 举报

ID:228467 发表于 2020-7-18 10:20 | 显示全部楼层
权威人物 发表于 2020-7-18 09:35
你所说的唤醒是什么?单片机不会关机的,只会进入低功效模式,在此模式下关闭外设等一系列省电,开启外部中 ...

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

使用道具 举报

ID:3241 发表于 2020-7-20 09:45 | 显示全部楼层

初学者,学习一下
回复

使用道具 举报

ID:311846 发表于 2020-7-20 15:49 | 显示全部楼层
上善若水001 发表于 2020-7-18 10:20
你好,请问为什么不推荐 硬件延时电路呢?是成本问题还是可靠性问题?

程序能完成的为什么要用硬件增加成本?为了节省单片机运行两秒时间的电吗?
回复

使用道具 举报

ID:801957 发表于 2020-7-20 16:15 | 显示全部楼层
用外部中断,按键设为双边沿触发
回复

使用道具 举报

ID:947437 发表于 2021-7-13 14:20 | 显示全部楼层
Y_G_G 发表于 2020-6-23 13:49
我有汇编的,你要不?
原理是差不多的:
1:先设定关闭外部中断唤醒

可以看一下你的汇编程序吗
回复

使用道具 举报

ID:57657 发表于 2021-7-13 15:24 | 显示全部楼层
外部中断触发后打开定时器中断(注意中断优先级),累加按键按住的时间,松开清零,满2秒开机。
回复

使用道具 举报

ID:954312 发表于 2021-7-19 18:48 | 显示全部楼层
    这里有两种方案
    1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进入休眠模式
    2、硬件实现,外部加个比较大的电容,到2s,才产生对应的高电平

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:954170 发表于 2021-7-19 23:45 来自手机 | 显示全部楼层
这里有两种方案  1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进入休眠模式  2、硬件实现,外部加个比较大的电容,到2s,才产生对应的高电平
回复

使用道具 举报

ID:928589 发表于 2021-7-20 08:52 | 显示全部楼层
790116460 发表于 2021-7-19 18:48
这里有两种方案
    1、软件实现,通过外部IO触发中断唤醒,然后MCU进行计时,不到2s就不响应,继续进 ...

用电容延时要考虑 高低温情况下 电容容量的变化导致 延时时间的误差;同时电容自身也存在容量误差;
回复

使用道具 举报

ID:824490 发表于 2021-7-20 09:19 | 显示全部楼层
不给代码,给你说一下按键操作的4个状态,1、持续释放,2、按下瞬间,3、持续按下,4、释放瞬间。这4个状态你都能检测到,长短按对你来说都不是事了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表