• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

请大神看下这个按键程序

武松打老虎 2017-02-28 浏览量:841
#define key_pc1 0X02
#define key_pc2 0X04
void KeyRead( void )
{
     unsigned char ReadData=PINC^0x06;
        
         
           ReadData=PINC^0x06;
       Trg=ReadData&(ReadData^Cont);      
       Cont=ReadData;
                                       
}    
void main()
{
   init();
   while(1)
   {
       KeyRead();
       if(Trg&key_pc2)
           {
              while(1)
             {
                display2(0);
                if(Trg&key_pc1)
                    break;
                 }
           }
             display2(1);
                 while(1)
                 {
                   if(num>20)
                   {
                     num=0;
                     break;
                   }
                 }
                 
   }
}
void ms()
{
    TCNT1H=0XFF;
        TCNT1L=0X82;
        
        num++;
}
按下key_pc2后能显示 display2(0),但是再按key_pc1后不能跳出while,不能显示display2(1)。而且按键好像有问题,还没按动一下就跳了,我按网上在后面加了20ms的消抖啊
 

 

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • #define key_pc1 0X02
    #define key_pc2 0X04
    void KeyRead( void )
    {
         unsigned char ReadData=PINC^0x06;
            
             
               ReadData=PINC^0x06;
           Trg=ReadData&(ReadData^Cont);      
           Cont=ReadData;
                                           
    }    
    void main()
    {
       init();
       while(1)
       {
           KeyRead();
           if(Trg&key_pc2)
               {
                  while(1)
                 {
                    display2(0);
                    if(Trg&key_pc1)
                        break;//如果条件成立跳出while函数,但是没有跳出if(Trg&key_pc2)函数,所以一直display2(0)不知道我的理                                    //解对不对-------毕竟我的外号小白
                     }
               }
                 display2(1);
                     while(1)
                     {
                       if(num>20)
                       {
                         num=0;
                         break;
                       }
                     }
                     
       }
    }
    void ms()
    {
        TCNT1H=0XFF;
            TCNT1L=0X82;
            
            num++;
    }
    • 发布于 2017-02-28
    • 举报
    • 评论 1
    • 2
    • 0
dos 回复了 dos:因为break;跳出while后,又再次进入这个while, 回复

其他答案 数量:3
  • 主函数这么写

    init();

    int kkk=-1;
    while (1);
    {
     KeyRead();
     if (Trg&key_pc2)
      kkk=2;
     if (Trg&key_pc1)

      kkk=1;

    if(kkk==1)

      display2(0)

    if(kkk==2)
      display2(1); 
    }

    • 发布于2017-02-28
    • 举报
    • 评论 0
    • 0
    • 0

  •  if(Trg&key_pc1)
                        break;你的这个判断之前要从做KeyRead();,否则你的全局变量就只能是第一次读取的值,Trg​不会改变​,就break不了啊,所以跳不出去,显示不了display2(1);
    • 发布于2017-02-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 嗨,依照您的需求,改為以下即可

    #define key_pc1 0X02
    #define key_pc2 0X04
    
    void KeyRead( void )
    {
         unsigned char ReadData=PINC^0x06;
            
         Trg=ReadData&(ReadData^Cont);      
         Cont=ReadData;
                                           
    }   
    
    void delay()
    {
    	 while(1)
       {
          if(num>20)
          {
              num=0;
              break;
          }
       }	
    }
    void main()
    {
       init();
       while(1)
       {
           KeyRead();
           if(Trg&key_pc2)
           {
    	  delay();
    	  KeyRead();
              if(Trg&key_pc2)
              {					
                while(1)
                {
                  display2(0);
    	      KeyRead();							
                  if(Trg&key_pc1)
    	      {
    	        delay();
    		KeyRead();							
                    if(Trg&key_pc1)
    		{
     		  display2(1);
                      break;
    		}
    	      }
                }
              }   
    			 	                 
            }
        }
    }
    
    
    void ms()
    {
        TCNT1H=0XFF;
        TCNT1L=0X82;
            
        num++;
    }
    

    以上供參考

    • 发布于2017-02-28
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

请大神看下这个按键程序