找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

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

[复制链接]
gz_nick 发表于 2011-12-27 16:58:23 | 显示全部楼层 |阅读模式

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

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

×
在做我的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;                                     //”按下”计数大于设定值为长击

                }
          }
}
caixjie 发表于 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;                                     //”按下”计数大于设定值为长击



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

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:55 , Processed in 0.054360 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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