Discuz! Board

标题: 思想决定程序-0 [打印本页]

作者: MrYan    时间: 2014-4-25 21:32
标题: 思想决定程序-0
        好久木有发一个帖子了,想了想,既然前面有一个思想决定程序。于是就打算写一个这个系列吧。不过不知道能不能坚持,何必在意那些呢。写一个就算一个也是不错的选择。。。。。我的前一个帖子是关于一个系统架构的,经过这段时间的思考和练习,我几乎差不多已经写的更加完善了。很想找个时间把那个帖子在更新一下,但是对于老的东西,总是不想去改动。总结成一个字--就是懒。。。。。。
        在开始这个帖子前,先说说其他的事情。很多东西都需要认真的去学习和思考,才会理解很多。这段时间,公司非常赶项目,好多东西都需要自己重新写一遍。不过写的过程中学到了很多东西,特别是经验。现在越来越体会为啥一个公司要求经验了,因为经验这个东西真的只有自己经历过了才会明白。同时这段时间也开始慢慢的学习stm32位。随着进一步的学习,发现stm32真的很强大,比8位单片机强大太多了,完全不在同一个层次,不过需要学习的东西也越来越多。
        这个帖子主要讲的按键扫描,当然这个思想并不是我自己独创的,是从前一个工程师的代码里面学习来的,毕竟他是一个工作了6年的人,好多东西可以学习。或许很多人说,不就是一个按键扫描么,有啥东西。这个,我只能呵呵了。当然对于高手来说,我这个或许不算什么,但是我只是针对于初学者,因为我也是初学者。我写的东西并不是都是很牛逼的东西。。。。。。
作者: MrYan    时间: 2014-4-25 22:30
       我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计也差不多,不过不保证非常适合。我从接触单片机以来,对于按键都是一个按键扫描,都是单独扫描,换句话说就是一个按键会产生短按,短按释放,长按和长按释放这4个消息。那么对于很多按键的时候,就会每个按键都会有消抖,然后产生消息。虽然这在使用中并没啥错误,但是对于代码量来说,随着按键个数的增加,代码量也会增加。只从看过前一个工程师的程序后思考。发现对于木有按键组合的程序来说,这种思想似乎更加合适。注意是对于没有按键组合的程序。
       既然每个按键都扫描,消抖,然后产生消息。那么,每个按键都会有两个相同的操作--消抖和产生消息。这样一想,那可不可以先识别是哪个按键触发了。然后处理消抖和产生消息呢。这样就会发现代码量立刻变少了很多。现在想想,这个思想也就这么几句话,关键是如何用代码去实现这个过程。代码如下:
uchar KeyCnt;                                                                                //是按键消抖计数,区分长按和短按
uchar ErrorCnt;                                                                                //误差计数
uchar KeySlake;                                                                         //防止产生过多的长按消息
uchar KeyValue,SaveKeyValue;                                                      //保存触发消息时的按键,用来长按释放时使用
void KeyScan(void)
{
       if(GPIO1==1)                        //按键1
        {
                KeyValue=1;
        }
        else if(GPIO2==1)                //按键2
        {
                KeyValue=2;
        }
        else if(GPIO3==1)                //按键3
        {
                KeyValue=3;
        }
        else
        {
                KeyValue=4;                        //没有按键产生
        }
         if((KeySlake)&&(SaveKeyValue!=KeyValue)&&(KeyValue!=4))    //为啥有这个处理程序,请好好思考一下,给个提示,比如我先按的2号键,并且是长按,那么突然有1键来了,是不是要产生一个2号键的释放消息(虽然是没有释放)
           {
                   ++ErrorCnt;
                   if(ErrorCnt>=2)
                   {
                           //SaveKeyValue+长按识别常量  产生长按释放消息
                           ErrorCnt=0;
                           KeyCnt=0;
                           KeySlake=0;
                   }
           }
          
           if((!KeySlake)&&(KeyValue!=4))
           {
                   ++KeyCnt;
                   SaveKeyValue=KeyValue;
                   if(KeyCnt>=LONG_PRESS_TIME)
                   {
                           KeySlake=1;
                        //SaveKeyValue+长按识别常量 产生长按消息
                   }
           }
           else if(KeyValue==4)
           {
                   if((KeyCnt>=SHORT_PRESS_TIME)&&(KeyCnt<LONG_PRESS_TIME))    //短按消息和释放是一起的
                   {
                           //SaveKeyValue+短按识别常量 产生短按消息
                           //SaveKeyValue+短按识别常量 产生短按释放消息
                   }
                   else if(KeyCnt>=LONG_PRESS_TIME)
                   {
                           //SaveKeyValue+长按识别常量 长生长按释放消息
                   }
                   KeySlake=0;
                   KeyCnt=0;
                   ErrorCnt=0;
           }
}

   最后,这里面会有一个短按时的BUG,但是几乎可以忽略不计,原因嘛,和为啥有前面那个长按释放的原因一样。同时,这个只用于没有组合键的程序,因为这个按键扫描默认按键有了一个优先级,这样处理有这样的好处,特别是对于消息处理来说。。。至于为啥,自己好好体会。。。。。
作者: MrYan    时间: 2014-4-25 22:32
MrYan 发表于 2014-4-25 22:30
我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计 ...

至于那个消抖的作用在哪里...结合我的架构,请想想,如果每隔5ms扫描一次这个程序,是不是就可以有消抖的作用了
作者: admin    时间: 2014-4-26 19:29
MrYan 发表于 2014-4-25 22:32
至于那个消抖的作用在哪里...结合我的架构,请想想,如果每隔5ms扫描一次这个程序,是不是就可以有消抖的 ...

过来学习了
作者: MrYan    时间: 2014-4-27 19:53
admin 发表于 2014-4-26 19:29
过来学习了

互相学习
作者: 我们的123    时间: 2014-6-4 11:55
看来你又进步不少了,




欢迎光临 Discuz! Board (http://www.qfv8.com/) Powered by Discuz! X3