找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1108|回复: 9
打印 上一主题 下一主题
收起左侧

长按短按 休眠唤醒代码

  [复制链接]
跳转到指定楼层
楼主
void key_process(void)
{
        if(keyOut>0)
        {
                keyOut--;
        }
        if(key_keyIsActive==1)
        {
                if(++keyCnt>5)
                {
                        if(P3_7==1)
                        {
                                keyCnt=0;
                                key_keyIsActive=0;
                                keyOut =20;
                        }
                }
                if(keyCnt>100)
                {
                        if(P3_7==0)
                        {
                                keyCnt=0;
                                key_keyIsActive=0;
                                                       
                                if(wakeUp)
                                {
                                        wakeUp=0;
                                        PINMOD &= ~(1<<7);
                                }
                                else
                                {
                                        wakeUp=1;
                                        PINMOD |= (1<<7);
//                                        AUX2 = (AUX2&~AUX2_PWRSAV_MASK)|1<<AUX2_PWRSAV_POS;//降低功耗
//                                        STPSCK = 1;                                        //设为 1,停止慢钟在停止模式。
//                                        PCON = (PCON&~PCON_PD_MASK)|1<<PCON_PD_POS;        //停止位,如果 1 进入停止模式。
//                                        STPSCK = 0;                                 
//                                        AUX2 = (AUX2&~AUX2_PWRSAV_MASK)|0<<AUX2_PWRSAV_POS;//可降低空闲,停止喝暂停模式下芯片的功耗 5
                                }
                               
                        }
                }
                if(keyCnt>130)
                {
                        keyCnt=0;
                        keyOut =20;
                        key_keyIsActive=0;
                }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1153575 发表于 2025-9-6 13:36 | 只看该作者
学习到了,谢谢
回复

使用道具 举报

板凳
ID:154665 发表于 2025-10-14 19:41 | 只看该作者
void key_process(void)
{
    // 按键释放后延时计数器处理
    if(keyOut>0)
    {
        keyOut--;  // 递减释放延时计数器
    }

    // 当按键处于激活状态时进行处理
    if(key_keyIsActive==1)
    {
        // 按键消抖检测(等待5个计数周期)
        if(++keyCnt>5)
        {
            // 检测按键是否已释放(P3_7为高电平)
            if(P3_7==1)
            {
                keyCnt=0;            // 重置按键计时器
                key_keyIsActive=0;   // 清除按键激活标志
                keyOut =20;          // 设置按键释放延时(防止误触发)
            }
        }

        // 长按检测(超过100个计数周期)
        if(keyCnt>100)
        {
            // 确认按键仍处于按下状态(P3_7为低电平)
            if(P3_7==0)
            {
                keyCnt=0;            // 重置按键计时器
                key_keyIsActive=0;   // 清除按键激活标志
               
                // 切换唤醒状态
                if(wakeUp)
                {
                    wakeUp=0;  // 清除唤醒标志
                    PINMOD &= ~(1<<7);  // 清除PINMOD寄存器的第7位(配置为普通模式)
                }
                else
                {
                    wakeUp=1;  // 设置唤醒标志
                    PINMOD |= (1<<7);  // 设置PINMOD寄存器的第7位(配置为唤醒功能)
                    
                    // 被注释的低功耗模式设置代码(备用)
                    // AUX2 = (AUX2&~AUX2_PWRSAV_MASK)|1<<AUX2_PWRSAV_POS;
                    // STPSCK = 1;
                    // PCON = (PCON&~PCON_PD_MASK)|1<<PCON_PD_POS;
                    // STPSCK = 0;
                    // AUX2 = (AUX2&~AUX2_PWRSAV_MASK)|0<<AUX2_PWRSAV_POS;
                }
            }
        }

        // 按键超时保护(超过130个计数周期)
        if(keyCnt>130)
        {
            keyCnt=0;            // 强制重置按键计时器
            keyOut =20;          // 设置按键释放延时
            key_keyIsActive=0;   // 强制清除按键激活标志
        }
    }
}

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:154665 发表于 2025-10-14 19:45 | 只看该作者
下面是上述代码编写的思维导图

长短按键流程.png (166.74 KB, 下载次数: 0)

长短按键流程.png
回复

使用道具 举报

5#
ID:187303 发表于 2025-10-14 23:11 | 只看该作者
注释太给力了,51有你更精彩!
回复

使用道具 举报

6#
ID:1064915 发表于 2025-10-15 08:23 | 只看该作者
keyCnt>5?如何到keyCnt>100 keyCnt>130状态,不理解
回复

使用道具 举报

7#
ID:1144680 发表于 2025-10-15 10:23 | 只看该作者
不错,学习了。
回复

使用道具 举报

8#
ID:1059989 发表于 2025-10-15 20:00 | 只看该作者
joyb 发表于 2025-10-15 08:23
keyCnt>5?如何到keyCnt>100 keyCnt>130状态,不理解

嗯,这个思维导图逻辑上有点问题。keyCnt > 5  和 keyCnt > 100 和 keyCnt > 130 应该是并列关系。
回复

使用道具 举报

9#
ID:119977 发表于 2025-10-25 15:21 | 只看该作者
发表于 2025-10-14 19:45
下面是上述代码编写的思维导图

确实有问题
回复

使用道具 举报

10#
ID:119977 发表于 2025-10-25 15:42 | 只看该作者
楼主能说一下调用的吗  怎么调用的   长按键判断按下了短按键没管 吗  按键释放延时干啥用的     瞅了半天没瞅明白  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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