百度空间 | 百度首页 
 
查看文章
 
简单有效的“单键复用”C51程序
2009-08-25 00:27

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

                }
          }
}

         嘿嘿,其实就这么简单。
        有的人喜欢将简单问题复杂化,而本人更喜欢将复杂问题简单化。


类别:c51编程 | 添加到搜藏 | 浏览() | 评论 (9)
 
最近读者:
 
网友评论:
1
2009-08-25 11:15 | 回复
这种方法岂不是只能用外中断口!
 
2
2009-08-25 12:55 | 回复
程序并没有用中断方式。
 
3
2009-08-25 17:11 | 回复
我之前写过一个1键6能的应用程序,希望和老师交流一下。http://hi.baidu.com/doyoungnet/blog/item/d023bd38fb113d2db8998f3c.html
 
4
2009-08-25 17:23 | 回复
   if(nn<50)//如“按下”计数小于设定值(单击的最大限制值)
   {
    DelayMs(30); //延时(消抖)
    do
    {    //“释放”计数器开始计数
     mm++;
     DelayMs(10);
    }while((mm<40)&&(set0==1)); //当超出设定值或在设定值的时间内又有按下事件发生,结束计数
    DelayMs(25); //延时(消抖)
    do
    {   !!这里怎么没有语句?!!          //待到第二次的按下事件结束
    }while(set0==0);
  
 
5
2009-08-25 17:52 | 回复
DelayMs(25);//延时(消抖)
do { //待到第二次的按下事件结束
}while(set0==0);
这条语句能不能不要?语句上边的dowhile开始计无按下的时间。如果在这400ms之内有按下,那直接进入
if(mm<40) Key_Num=3; else Key_Num=1;   //在释放期间提前结束的为双击,否则为短击
可以判断出是双击,如果这400ms之内没有按下,最后一次加使得mm成为40,所以在
if(mm<40) Key_Num=3; else Key_Num=1;   //在释放期间提前结束的为双击,否则为短击中仍然被判定为短击。
所以没有必要要那句了吧?不知老师这句还有什么我没有想到的用处?请老师赐教。
 
6
2009-08-25 19:08 | 回复
回复止痒:如没有这句的话,程序会在识别“双击”退了后,再次检测到按键为低电平,就会再一次识别成“短击”
 
8
2009-08-25 19:18 | 回复
回复doyoungnet:看了感觉不错,用它做个单键密码锁如何?
 
9
2009-08-25 21:45 | 回复
回复艺新工作室:哦,原来如此。又忽略了小处啊!谢谢老师!
 
10
2009-08-29 17:54 | 回复
要是MCU有AD功能的IO口还可以一线扩展键盘
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu