fbojue 发表于 2012-11-23 17:52:52

【求助】关于开关与LED的问题

我设置了当开关返回数据“1”的时候,LED就会亮,但是我希望LED亮了一次之后就持续亮,不管我是否松开开关。这该怎么写程序呢?请各位大侠帮帮我吧~

Randy 发表于 2012-11-23 18:47:18

你可以在开关按下时进行死循环,让灯一直亮着!

fbojue 发表于 2012-11-23 18:57:47

Randy 发表于 2012-11-23 18:47 static/image/common/back.gif
你可以在开关按下时进行死循环,让灯一直亮着!

能不能告诉我具体怎么弄啊?万分感谢~~

Randy 发表于 2012-11-23 19:13:42

fbojue 发表于 2012-11-23 18:57 static/image/common/back.gif
能不能告诉我具体怎么弄啊?万分感谢~~

while(1)

fbojue 发表于 2012-11-23 19:49:33

Randy 发表于 2012-11-23 19:13 static/image/common/back.gif
while(1)

我用的595芯片连接的LED,如果进入一个死循环,就不能亮其他的灯了。。。我想按一个开关一个灯亮,按第二个开关第一个灯不灭,和第二个灯一起亮,不知道有没有什么办法啊?

fbojue 发表于 2012-11-23 19:49:49

Randy 发表于 2012-11-23 19:13 static/image/common/back.gif
while(1)

我用的595芯片连接的LED,如果进入一个死循环,就不能亮其他的灯了。。。我想按一个开关一个灯亮,按第二个开关第一个灯不灭,和第二个灯一起亮,不知道有没有什么办法啊?

fbojue 发表于 2012-11-23 19:52:46

除了死循环之外,可不可以我先按了按钮,然后就等于把1赋值给了按钮状态之类的方法?我试了都不行。。。。

弘毅 发表于 2012-11-24 20:31:50

本帖最后由 弘毅 于 2012-11-24 20:33 编辑

你是用595驱动呀?这个需要死循环的,直接用IO口貌似更方便驱动一些。直接写一个变量,比如定义为长整数。然后呢,没按一次~~变量+1,但只有按第一次,变量为1的时候,才能改变他的状态。其他一直按。。。都大于1,就不能改变它状态了。

fbojue 发表于 2012-11-27 13:08:43

弘毅 发表于 2012-11-24 20:31 static/image/common/back.gif
你是用595驱动呀?这个需要死循环的,直接用IO口貌似更方便驱动一些。直接写一个变量,比如定义为长整数。然 ...

我这个比较妖。。。我是想用其他按钮来中断第一个灯的常亮,是否就要用到外部中断什么的?虽然现在通过Randy 教的死循环可以让他持续一段时间亮,但还没有达到我想要的效果。。。

fbojue 发表于 2012-11-27 13:27:11

如果我现在想,按一个开关一个灯亮,按第二个开关第一个灯灭第二个灯亮,这样的话能简单一点么?

fbojue 发表于 2012-11-27 16:15:39

我试出来了!!!就是用while死循环然后用条件从while里面不断break就可以了{:soso_e113:},就是语句有点罗嗦。。。
现在还有个问题,比如说我第一次按哪个按钮不确定,但是一按到某个按钮,就从这个按钮初始化开始一系列环节,这个该则么弄?

fbojue 发表于 2012-11-27 16:17:30

本帖最后由 fbojue 于 2012-11-27 18:50 编辑

就是这样子
if(state1==0){
      while (1){
      numbers=B10000000;
   shiftOut(dataPin_1, clockPin_1, LSBFIRST, numbers);

   digitalWrite(latchPin_1, HIGH);
   
   state1=digitalRead(switchPin1);
   state2=digitalRead(switchPin2);
   state3=digitalRead(switchPin3);
   state4=digitalRead(switchPin4);
   
   Serial.print("switch1: ");
   Serial.print(state1);
   Serial.println();
   Serial.print("switch2: ");
   Serial.print(state2);
   Serial.println();
   Serial.print("switch3: ");
   Serial.print(state3);
   Serial.println();
   Serial.print("switch4: ");
   Serial.print(state4);
   Serial.println();
   
   if(state2==0||state3==0||state4==0){
   break;
       }
      }

我现在有四个按钮控制四个灯,我把它写成函数_one();在loop里面调用。如果加了条件再调用,就只能开第一个灯。后面几个灯的print显示有反应,但是灯就是不亮。
我想加上条件,比如说我按了第一个按钮一次,这个函数就开始调用之类的。。。

fbojue 发表于 2012-11-28 20:08:08

本帖最后由 fbojue 于 2012-11-28 20:11 编辑


//Pin connected to SH_CP of 74HC595
int clockPin_1 = 2;
//Pin connected to ST_CP of 74HC595
int latchPin_1 = 3;
////Pin connected to DS of 74HC595
int dataPin_1 = 4;

int f_bit;
int f_bits;
int f_bits1;
int f_bits2;
int f_bits3;
int f_bits4;

byte final;
byte numbers;

int switchPin1=11;
int switchPin2=10;
int switchPin3=9;
int switchPin4=8;

int state1=1;
int state2=1;
int state3=1;
int state4=1;


void setup() {
Serial.begin(9600);
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
pinMode(switchPin3, INPUT);
pinMode(switchPin4, INPUT);

//set pins to output so you can control the shift register
pinMode(latchPin_1, OUTPUT);
pinMode(clockPin_1, OUTPUT);
pinMode(dataPin_1, OUTPUT);

}


void loop() {

    digitalWrite(latchPin_1, LOW);
    final=B00000000;

    state1=digitalRead(switchPin1);
    state2=digitalRead(switchPin2);
    state3=digitalRead(switchPin3);
    state4=digitalRead(switchPin4);
   
    numbers=1;
   //=====================================//
if(state1==0){
while(1){
      _one();   
}
}

   //=====================================//
      
    shiftOut(dataPin_1, clockPin_1, MSBFIRST, final);
    digitalWrite(latchPin_1, HIGH);

    Serial.print("switch1: ");
    Serial.print(state1);
    Serial.println();
    Serial.print("switch2: ");
    Serial.print(state2);
    Serial.println();
    Serial.print("switch3: ");
    Serial.print(state3);
    Serial.println();
    Serial.print("switch4: ");
    Serial.print(state4);
    Serial.println();
    Serial.println("LOOP");
    delay(1);   
}
//==================================//
void _one(){

   if(state1==0){   
   while (1){

   final=numbers;
   
   shiftOut(dataPin_1, clockPin_1, MSBFIRST, final);
   digitalWrite(latchPin_1, HIGH);
   
   state1=digitalRead(switchPin1);
   state2=digitalRead(switchPin2);
   state3=digitalRead(switchPin3);
   state4=digitalRead(switchPin4);
   
   Serial.print("switch1: ");
   Serial.print(state1);
   Serial.println();
   Serial.print("switch2: ");
   Serial.print(state2);
   Serial.println();
   Serial.print("switch3: ");
   Serial.print(state3);
   Serial.println();
   Serial.print("switch4: ");
   Serial.print(state4);
   Serial.println();
   Serial.println("_one_1");
   
   if(state2==0){
   break;
       }
      }
    }else if( state2==0){
      while (1){
      
      final=numbers*3;
      
   shiftOut(dataPin_1, clockPin_1, MSBFIRST, final);
   digitalWrite(latchPin_1, HIGH);
   
   state1=digitalRead(switchPin1);
   state2=digitalRead(switchPin2);
   state3=digitalRead(switchPin3);
   state4=digitalRead(switchPin4);   

   Serial.print("switch1: ");
   Serial.print(state1);
   Serial.println();
   Serial.print("switch2: ");
   Serial.print(state2);
   Serial.println();
   Serial.print("switch3: ");
   Serial.print(state3);
   Serial.println();
   Serial.print("switch4: ");
   Serial.print(state4);
   Serial.println();
   Serial.println("_one_2");
   
   if(state3==0){
   break;
       }
      }
         
    }else if(state3==0){
      while (1){
      
      final=numbers*7;
      
   shiftOut(dataPin_1, clockPin_1, MSBFIRST, final);
   digitalWrite(latchPin_1, HIGH);
   
   state1=digitalRead(switchPin1);
   state2=digitalRead(switchPin2);
   state3=digitalRead(switchPin3);
   state4=digitalRead(switchPin4);
   
   Serial.print("switch1: ");
   Serial.print(state1);
   Serial.println();
   Serial.print("switch2: ");
   Serial.print(state2);
   Serial.println();
   Serial.print("switch3: ");
   Serial.print(state3);
   Serial.println();
   Serial.print("switch4: ");
   Serial.print(state4);
   Serial.println();
   Serial.println("_one_3");
   
   if(state4==0){
   break;
       }
      }
            
    } else if(state4==0){
      while (1){
         
      final=numbers*15;
      
   shiftOut(dataPin_1, clockPin_1, MSBFIRST, final);
   digitalWrite(latchPin_1, HIGH);
   
   state1=digitalRead(switchPin1);
   state2=digitalRead(switchPin2);
   state3=digitalRead(switchPin3);
   state4=digitalRead(switchPin4);   

   Serial.print("switch1: ");
   Serial.print(state1);
   Serial.println();
   Serial.print("switch2: ");
   Serial.print(state2);
   Serial.println();
   Serial.print("switch3: ");
   Serial.print(state3);
   Serial.println();
   Serial.print("switch4: ");
   Serial.print(state4);
   Serial.println();
   Serial.println("_one_4");
      }
    }   

}

//=====================================//


现在我的代码是这样的。关于以下这段我有个问题:
if(state1==0){
while(1){
      _one();   
}
}

如果我不加条件只调用_one();的话,没有问题,但是一加条件,查看monitor的时候发现无论按哪个按钮,print的东西都是对的,但是就是灯不亮,只会亮第一个你按下的按钮控制的灯。
因为之后我会加很多东西,想确保只在一个条件下这部分函数才会起作用,我不知道该怎么办了TAT。。。
求帮助!!!

页: [1]
查看完整版本: 【求助】关于开关与LED的问题