• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

单片机师傅帮忙看看,为什么按键按下灯灯闪一下才正常输出CASE2呢?如何解决?谢谢!

#include
#define uchar unsigned char
#define uint unsigned int
void scan_k1();
unsigned char set;
void delay(uint z);
void delay1(uint z);
unsigned int i;
sbit led0=P1^0;
sbit led1=P1^1;
sbit sw1=P3^4;
 
void main()
{  


  while(1)
{

    if(sw1==0) scan_k1();
 
     {   
  switch(set)
{
 
 case 1: led0=0x00;
      delay(15);

      led0=0xff;
      delay(3);
          break;
  
////////////////////////////////
case 2: led1=0x00;
     delay1(20);
     led1=0xff ;
    delay1(10);
   break;

   default:P1=0Xfc;
   break;

////////////////////////////////

/* case 3:led0=0x00;
 
        break;
    default:led0=0X00;
  break;
 
 case 4:P1=0x00;
        break;
  default: P1=0Xff;
  break;*/
}
     }

 }
 }
 //////////////////////////////
  void scan_k1()

 {
   if(sw1==0) set++;
 
  if(set>=4)set=0;

  F0:if(sw1==0)goto F0;

  for(i=0;i<30000;i++);
 
 }
////////////////////////////////////

void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=45;y>0;y--); 
}

 void delay1(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=26;y>0;y--); 
}

全部回复(5)
正序查看
倒序查看
yuzixuan
LV.8
2
2011-12-11 15:17
不会是硬件问题吧,拿示波器截波形看看!
0
回复
2011-12-11 21:59
  这个找本51的书就可以解决啦。
0
回复
2011-12-16 21:54

sbit sw1=P3^4;  if(sw1==0) scan_k1();

看这两句,你一开始定义的时候sw1=1;这个时候如果你不按键,set是一直等于1的,他就不会执行scan_k1();语句的,知道你按下按键后才支持,这个时候switch里面的set才会改变,才会执行相应的case的。

0
回复
cheng111
LV.11
5
2012-01-08 13:33
@fifasanguo
sbitsw1=P3^4; if(sw1==0)scan_k1();看这两句,你一开始定义的时候sw1=1;这个时候如果你不按键,set是一直等于1的,他就不会执行scan_k1();语句的,知道你按下按键后才支持,这个时候switch里面的set才会改变,才会执行相应的case的。

太强大了,51很久没有玩了。

应该是初始值设置的问题。

0
回复
770223835
LV.1
6
2012-07-12 22:07

很久没看程序了,不好意思,你的程序我没看。

不过我记得,按键有抖动,要加延时。找一下这个:新概念51单片机C语言教程.入门、提高、开发.pdf,因为太大了所以发不了附件

0
回复