思想决定程序-0
好久木有发一个帖子了,想了想,既然前面有一个思想决定程序。于是就打算写一个这个系列吧。不过不知道能不能坚持,何必在意那些呢。写一个就算一个也是不错的选择。。。。。我的前一个帖子是关于一个系统架构的,经过这段时间的思考和练习,我几乎差不多已经写的更加完善了。很想找个时间把那个帖子在更新一下,但是对于老的东西,总是不想去改动。总结成一个字--就是懒。。。。。。在开始这个帖子前,先说说其他的事情。很多东西都需要认真的去学习和思考,才会理解很多。这段时间,公司非常赶项目,好多东西都需要自己重新写一遍。不过写的过程中学到了很多东西,特别是经验。现在越来越体会为啥一个公司要求经验了,因为经验这个东西真的只有自己经历过了才会明白。同时这段时间也开始慢慢的学习stm32位。随着进一步的学习,发现stm32真的很强大,比8位单片机强大太多了,完全不在同一个层次,不过需要学习的东西也越来越多。
这个帖子主要讲的按键扫描,当然这个思想并不是我自己独创的,是从前一个工程师的代码里面学习来的,毕竟他是一个工作了6年的人,好多东西可以学习。或许很多人说,不就是一个按键扫描么,有啥东西。这个,我只能呵呵了。当然对于高手来说,我这个或许不算什么,但是我只是针对于初学者,因为我也是初学者。我写的东西并不是都是很牛逼的东西。。。。。。 我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计也差不多,不过不保证非常适合。我从接触单片机以来,对于按键都是一个按键扫描,都是单独扫描,换句话说就是一个按键会产生短按,短按释放,长按和长按释放这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:30
我写的按键扫描是针对于我的架构的,换一句话来说就是对于我的架构非常适合。至于对于其他的,估计 ...
至于那个消抖的作用在哪里...结合我的架构,请想想,如果每隔5ms扫描一次这个程序,是不是就可以有消抖的作用了:lol MrYan 发表于 2014-4-25 22:32
至于那个消抖的作用在哪里...结合我的架构,请想想,如果每隔5ms扫描一次这个程序,是不是就可以有消抖的 ...
过来学习了:lol admin 发表于 2014-4-26 19:29
过来学习了
互相学习:lol:lol 看来你又进步不少了,
页:
[1]