登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看3049|回6|收藏
楼主 ID:244748 只看他
2018-3-12 19:42
#include "button.h"
#include "reg51.h"
sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;

void delay_button(unsigned char m)
{
         unsigned char n;
         for(m;m>0;m--)
         {
                 for(n=250;n>0;n--)
                {}
         }
}
unsigned char keyboard()
{
     unsigned char button_flag=0;
         int count=0;
         if(s4==0)
         {
                   delay_button(10);
                  if(s4==0)
                  {
                          while((s4==0)&&(count<500000))
                          {
                                button_flag=4;
                                count++;
                          }
                  }
         }
               
         if(s5==0)
         {
                   delay_button(10);
                  if(s5==0)
                  {
                           while((s5==0)&&(count<500000))
                           {
                           button_flag=5;
                           count++;
                           }
                  }
         }
         
         if(s6==0)
         {
                    delay_button(10);
                   if(s6==0)
                   {
                           while((s6==0)&&(count<500000))
                           {
                                 button_flag=6;
                                 count++;
                           }
                         }
          }
               
         if(s7==0)
         {
                    delay_button(10);
                   if(s7==0)
                   {
                           while((s7==0)&&(count<500000))
                           {
                                 button_flag=7;
                                 count++;
                           }
                   }
         }

         if(count>500000)
         count=0;
         return button_flag;
}


沙发 ID:290919 只看他
2018-3-12 20:16
当s5的值为0并且count的值小于500000这两个条件都为真,进入while()循环;否则不进入while()循环。
板凳 ID:290919 只看他
2018-3-12 20:18
s5的值为0并且count<500000两个条件都为真的时候进入While()循环
地板 ID:290299 只看他
2018-3-12 21:24
&&是按位与   (s5==0)&&(count<500000)同时为真时执行
5# ID:244748 只看他
2018-3-13 08:13
为什么count<500000,而不是其他
6# ID:164602 只看他
2018-3-13 10:26
这条语句就是松键消抖的功能。
键被按下就等于零(S1==0),后面就是控制按键的时间的(count<50000)。
这两个条件同时满足,说明键是按着的,而且时间不是很长。
如果松开键,或者按键时间太长,都会跳出循环,避免程序死在这里。

个人认为,这样的程序不好。
对于像你的程序,这样的简单按键功能,还可以使用,看不问题,但如果按键功能复杂一点,那么,就会在按下键不松的一段时间内,程序会让那个功能重复很多次(事实上,你的程序已经重复了很多次,最大可以重复49999次,只是功能简单,眼睛看不出来而已)。
7# ID:454000 只看他
2019-1-30 21:16
while((s5==0)&&(count<500000))
分解来分析:(s5==0)&&(count<500000)
有三个结果1.(1&&1)// (s5==0是真)&&(count<500000也是真)
               2.(0&&1)// (s5==0是假)&&(count<500000是真)
               3.(1&&0)// (s5==0是真)&&(count<500000是假)
最终while(中只有1或者0),     当while(1时)执行button_flag=5;count++; 否则就跳

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版