全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

简单有效的“单键复用”C51程序

[复制链接]
3501 2

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
在做我的MINI POV时,考虑到空间有限,必须简化结构,尽量减少按键数量,最后设计只用两个按键作模式转换和时间调整,这样,需将其中的一键“单键复用”,采用最常见的是“短击”、“长击”和“双击”三种模式。这样一来编程就成了问题。
然而,真不明白一个简单的“单键复用”的问题居然在网上还找不到合适的现成的程序,找到的也是一些高深莫测的(还用上什么状态机之类的)东西。没办法,还是自己动手吧!
    nn=0;                                                               //“按下”时长计数器清零
    mm=0;                                                             //“释放”时长计数器清零
    if(set0==0){                                                     //如按键set0按下
          DelayMs(30);                                            //延时(消抖)
          if(set0==0){                                               //如按键set0按下
                do {                                                     //“按下”计数器开始计数
                    nn++;
                    DelayMs(10);
                }while(set0==0);           
                if(nn<50)                                             //如“按下”计数小于设定值(短击的最大限制值)
                {
                    DelayMs(30);                                   //延时(消抖)
                     do {                                                 //“释放”计数器开始计数
                         mm++;
                         DelayMs(10);
                     }while((mm<40)&&(set0==1));          //当超出设定值或再次有“按下”事件发生,结束计数
                     DelayMs(25);                                   //延时(消抖)
                     do {                                                  //待到第二次的“按下”事件结束
                      }while(set0==0);
                     if(mm<40) Key_Num=3; else Key_Num=1;   //在释放期间提前结束的为双击,否则为短击
                }
               else
                {
                   Key_Num=2;                                     //”按下”计数大于设定值为长击

                }
          }
}

举报

回复

2 个评论

cai***  新手上路  发表于 2012-1-10 23:53:27  | 显示全部楼层
现在看到 单片机中 死延时 delay()就觉得烦,建议不要做这种死延时的函数,应该要有实时系统的概念,延时不能在这里死等。
追***  新手上路  发表于 2012-7-27 22:24:34  | 显示全部楼层
   简单有效的“单键复用”C51程序 [复制链接]  
  

gz_nick 当前离线
积分11精华0阅读权限10注册时间2011-12-27在线时间0 小时最后登录2011-12-27分享0主题5记录0好友0日志0相册0帖子5UID3575
5

主题 0

好友  11

积分

新手上路



新手上路, 积分 11, 距离下一级还需 39 积分贡献0 金币0 M币41 威望0 最后登录2011-12-27注册时间2011-12-27发消息  电梯直达   楼主
gz_nick 发表于 2011-12-27 16:58:23 |只看该作者 |倒序浏览
你知道吗,回帖只能获取1M币,发布主题帖是回帖的10倍,精华帖还可以额外获取金币奖励,如没有资源,可以去其他电子网站复制。
在做我的MINI POV时,考虑到空间有限,必须简化结构,尽量减少按键数量,最后设计只用两个按键作模式转换和时间调整,这样,需将其中的一键“单键复用”,采用最常见的是“短击”、“长击”和“双击”三种模式。这样一来编程就成了问题。
然而,真不明白一个简单的“单键复用”的问题居然在网上还找不到合适的现成的程序,找到的也是一些高深莫测的(还用上什么状态机之类的)东西。没办法,还是自己动手吧!
    nn=0;                                                               //“按下”时长计数器清零
    mm=0;                                                             //“释放”时长计数器清零
    if(set0==0){                                                     //如按键set0按下
          DelayMs(30);                                            //延时(消抖)
          if(set0==0){                                               //如按键set0按下
                do {                                                     //“按下”计数器开始计数
                    nn++;
                    DelayMs(10);
                }while(set0==0);           
                if(nn<50)                                             //如“按下”计数小于设定值(短击的最大限制值)
                {
                    DelayMs(30);                                   //延时(消抖)
                     do {                                                 //“释放”计数器开始计数
                         mm++;
                         DelayMs(10);
                     }while((mm<40)&&(set0==1));          //当超出设定值或再次有“按下”事件发生,结束计数
                     DelayMs(25);                                   //延时(消抖)
                     do {                                                  //待到第二次的“按下”事件结束
                      }while(set0==0);
                     if(mm<40) Key_Num=3; else Key_Num=1;   //在释放期间提前结束的为双击,否则为短击
                }
               else
                {
                   Key_Num=2;                                     //”按下”计数大于设定值为长击



*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表