打印

按键与显示

[复制链接]
2182|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
嗜杀成性|  楼主 | 2010-6-1 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         请各位帮帮忙!!!!
         if(G_Key_Flag==4)     
           if(!G_Key2)
             delay_ms(100);
              if(!G_Key2)

                 G_Counter3++;
                    if(G_Counter3==100)
                    {
                       G_Counter3=1;
                      }

1.  G_Key_Flag是一个状态量;
2.G_Key2是一个按键量;
3.G_Counter3是一个变量;
    问题:
1.这一段的执行结果是什么?
2.为什么按键按下结果加的不是1?
3.真正要完成的目的是:按一下G_Key2加1,一直按着G_Key2就连续加1.

相关帖子

沙发
NE5532| | 2010-6-1 17:42 | 只看该作者
想法没错,建议打断点跟踪一下,程序流程是不是按照你的设计在跑。

使用特权

评论回复
板凳
嗜杀成性|  楼主 | 2010-6-1 17:52 | 只看该作者
就这里不是   其他的地方都是

使用特权

评论回复
地板
NE5532| | 2010-6-1 18:01 | 只看该作者
那你的断点看到哪些程序没执行呢?控制程序跳转流程的条件又成立不成立呢?

使用特权

评论回复
5
一棵小草| | 2010-6-1 21:00 | 只看该作者
本帖最后由 一棵小草 于 2010-6-1 21:04 编辑

写程序是一件很严谨的事情,LZ的态度~~~要改正啊
哪怕一个括号,一个标点,空格,注释都不要放过,这样才能避免小问题,才能专心研究算法,研究-------

把你的程序整理后:

if(G_Key_Flag==4)         //所谓的状态应该是0或1吧,怎么有4呢,应该也是一个变量吧。
{
        if(!G_Key2)            // 这一句好像没有意义,这里是说,只有G_Key_Flag=4成立才扫描键盘
        {                           //但是下面不用条件也能扫描啊
                 delay_ms(100);
        }
}
if(!G_Key2)
{
       G_Counter3++;
}
if(G_Counter3==100)
{
       G_Counter3=1;
}

(1)执行的结果不知道。
(2)因为按键按下后,变量一直做加法(哪怕按下的时间很短),所以加的不是1。
(3)不知道你的状态变量能做什么,所以先省略了,下面这个是能加1和连加(连加的快慢设1s)的。
试试看,先做一个定时器(自己写),10ms后让bit变量flag_10ms  =1;1s后让bit变量flag_1s = 1。
bit变量flag_shake =1表示消过抖了,bit变量flag_down=1表示按键一直按着,所有变量初始化为0。
if(flag_10ms==1)
{
        if(!G_Key2)
     {
                 if(flag_shake==1)
                  {
                           if(flag_down==1)
                           {
                                   if(flag_1s==1)G_Counter3++;    //1s做一次加1。
                           }
                           else
                           {
                                      G_Counter3++;//如果在1s内松开键,就算只加1。
                                      flag_down =1; //按键第二次进来,可以做加1了,同时置位一直按标志。
                           }
                           if(G_Counter3==100)G_Counter3=1;
                  }
                  else      flag_shack =1;  //按键第一次进来,设置消抖标志。
        }
        else
        {
                 flag_shack =0;        //如果按键已经松开,记得释放消抖标志
                 flag_down =0;        //如果按键已经松开,记得释放按下标志
        }
        flag_10ms = 0;
}

临时想出来的算法,不是很好。而且5层if,有点耗程序空间了,不过对新手来说,也许不错。

使用特权

评论回复
6
嗜杀成性|  楼主 | 2010-6-2 08:44 | 只看该作者
:handshake        很好懂   我去试试

使用特权

评论回复
7
一棵小草| | 2010-6-2 12:50 | 只看该作者
好像忘了清0了
if(flag_1s==1)
{
         G_Counter3++;    //1s做一次加1。
         flag_1s=0;
}

使用特权

评论回复
8
brief110| | 2010-6-2 15:41 | 只看该作者
5# 一棵小草 呢能具体解释一下不  你还是没有消抖呀
我觉得他出现连续加的问题是最后没有检测按键抬起  应该检测一下 就不会连加了

使用特权

评论回复
9
brief110| | 2010-6-2 15:43 | 只看该作者
5# 一棵小草 呢能具体解释一下不  你还是没有消抖呀
我觉得他出现连续加的问题是最后没有检测按键抬起  应该检测一下 就不会连加了

使用特权

评论回复
10
brief110| | 2010-6-2 15:45 | 只看该作者
if(G_Key_Flag==4)         //所谓的状态应该是0或1吧,怎么有4呢,应该也是一个变量吧。
{
        if(!G_Key2)            // 这一句好像没有意义,这里是说,只有G_Key_Flag=4成立才扫描键盘
        {                           //但是下面不用条件也能扫描啊
                 delay_ms(100);
        }
}
if(!G_Key2)
{
       G_Counter3++;
}
if(G_Counter3==100)
{
       G_Counter3=1;
}
while(!G_Key2);

使用特权

评论回复
11
brief110| | 2010-6-2 15:45 | 只看该作者
5# 一棵小草
能具体解释一下不  你还是没有消抖呀
我觉得他出现连续加的问题是最后没有检测按键抬起  应该检测一下 就不会连加了

使用特权

评论回复
12
ElderFox| | 2010-6-2 16:00 | 只看该作者
你这个程序好像是按键按下一次多次响应的范例吧!

使用特权

评论回复
13
嗜杀成性|  楼主 | 2010-6-2 19:28 | 只看该作者
是个范例啦   都好长时间没解决啦

使用特权

评论回复
14
一棵小草| | 2010-6-2 20:13 | 只看该作者
5# 一棵小草
能具体解释一下不  你还是没有消抖呀
我觉得他出现连续加的问题是最后没有检测按键抬起  应该检测一下 就不会连加了
brief110 发表于 2010-6-2 15:45


你好像没理解LZ的问题吧,LZ想实现的是:按一下则加1,一直按着就连续加1。

你说的检测按键抬起,不对题。

里面已经有消抖了,注意消抖标志flag_shack,第一次扫描到按键时,消抖标志是0,那么程序就置位消抖标志,然后跳出程序;等到第二次10ms,如果按键还在,那么才处理按键。这个之间的10ms就是消抖。

貌似程序不难理解吧,测试一下也简单吧,要知道,实践过了才是正确的,否则就是纸上谈兵了。

使用特权

评论回复
15
嗜杀成性|  楼主 | 2010-6-3 10:37 | 只看该作者
单个理解这几句是不难啊   难就难在现在整合不到主函数里去
       感谢   一棵小草

使用特权

评论回复
16
嗜杀成性|  楼主 | 2010-6-3 10:49 | 只看该作者
头要炸啦  ~!!~~~~~!~~!~~!~!~!!~!~!!~!!~!!~!~~!!~
~!~!~!~!~!~~!~!~~!~
1·11·!~!·1·1·
    救救我吧!~!~!!~!~!~!!~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

21

帖子

0

粉丝