设为首页收藏本站

Discuz! Board

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 6445|回复: 5
打印 上一主题 下一主题

思想决定程序-0

[复制链接]

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
跳转到指定楼层
楼主
MrYan 发表于 2014-4-25 21:32:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        好久木有发一个帖子了,想了想,既然前面有一个思想决定程序。于是就打算写一个这个系列吧。不过不知道能不能坚持,何必在意那些呢。写一个就算一个也是不错的选择。。。。。我的前一个帖子是关于一个系统架构的,经过这段时间的思考和练习,我几乎差不多已经写的更加完善了。很想找个时间把那个帖子在更新一下,但是对于老的东西,总是不想去改动。总结成一个字--就是懒。。。。。。
        在开始这个帖子前,先说说其他的事情。很多东西都需要认真的去学习和思考,才会理解很多。这段时间,公司非常赶项目,好多东西都需要自己重新写一遍。不过写的过程中学到了很多东西,特别是经验。现在越来越体会为啥一个公司要求经验了,因为经验这个东西真的只有自己经历过了才会明白。同时这段时间也开始慢慢的学习stm32位。随着进一步的学习,发现stm32真的很强大,比8位单片机强大太多了,完全不在同一个层次,不过需要学习的东西也越来越多。
        这个帖子主要讲的按键扫描,当然这个思想并不是我自己独创的,是从前一个工程师的代码里面学习来的,毕竟他是一个工作了6年的人,好多东西可以学习。或许很多人说,不就是一个按键扫描么,有啥东西。这个,我只能呵呵了。当然对于高手来说,我这个或许不算什么,但是我只是针对于初学者,因为我也是初学者。我写的东西并不是都是很牛逼的东西。。。。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖
分享才可以产生世界.....
回复

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
沙发
 楼主| MrYan 发表于 2014-4-25 22:30:40 | 只看该作者
       我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计也差不多,不过不保证非常适合。我从接触单片机以来,对于按键都是一个按键扫描,都是单独扫描,换句话说就是一个按键会产生短按,短按释放,长按和长按释放这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,但是几乎可以忽略不计,原因嘛,和为啥有前面那个长按释放的原因一样。同时,这个只用于没有组合键的程序,因为这个按键扫描默认按键有了一个优先级,这样处理有这样的好处,特别是对于消息处理来说。。。至于为啥,自己好好体会。。。。。
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
板凳
 楼主| MrYan 发表于 2014-4-25 22:32:14 | 只看该作者
MrYan 发表于 2014-4-25 22:30
我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计 ...

至于那个消抖的作用在哪里...结合我的架构,请想想,如果每隔5ms扫描一次这个程序,是不是就可以有消抖的作用了
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

243

主题

1706

帖子

6151

积分

管理员

Rank: 9Rank: 9Rank: 9

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

过来学习了
回复 支持 反对

使用道具 举报

4

主题

56

帖子

301

积分

版主

分享的世界

Rank: 7Rank: 7Rank: 7

积分
301
QQ
5#
 楼主| MrYan 发表于 2014-4-27 19:53:03 | 只看该作者

互相学习
分享才可以产生世界.....
回复 支持 反对

使用道具 举报

0

主题

1

帖子

22

积分

新手上路

Rank: 1

积分
22
6#
我们的123 发表于 2014-6-4 11:55:13 | 只看该作者
看来你又进步不少了,
回复 支持 反对

使用道具 举报

Archiver|手机版|小黑屋|Comsenz Inc.   

GMT+8, 2024-11-23 01:49 , Processed in 0.122097 second(s), 29 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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