极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13706|回复: 12

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

[复制链接]
发表于 2012-11-23 17:52:52 | 显示全部楼层 |阅读模式
我设置了当开关返回数据“1”的时候,LED就会亮,但是我希望LED亮了一次之后就持续亮,不管我是否松开开关。这该怎么写程序呢?请各位大侠帮帮我吧~
回复

使用道具 举报

发表于 2012-11-23 18:47:18 | 显示全部楼层
你可以在开关按下时进行死循环,让灯一直亮着!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-23 18:57:47 | 显示全部楼层
Randy 发表于 2012-11-23 18:47
你可以在开关按下时进行死循环,让灯一直亮着!

能不能告诉我具体怎么弄啊?万分感谢~~
回复 支持 反对

使用道具 举报

发表于 2012-11-23 19:13:42 | 显示全部楼层
fbojue 发表于 2012-11-23 18:57
能不能告诉我具体怎么弄啊?万分感谢~~

while(1)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-23 19:49:33 | 显示全部楼层
Randy 发表于 2012-11-23 19:13
while(1)

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

使用道具 举报

 楼主| 发表于 2012-11-23 19:49:49 | 显示全部楼层
Randy 发表于 2012-11-23 19:13
while(1)

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

使用道具 举报

 楼主| 发表于 2012-11-23 19:52:46 | 显示全部楼层
除了死循环之外,可不可以我先按了按钮,然后就等于把1赋值给了按钮状态之类的方法?我试了都不行。。。。
回复 支持 反对

使用道具 举报

发表于 2012-11-24 20:31:50 | 显示全部楼层
本帖最后由 弘毅 于 2012-11-24 20:33 编辑

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

使用道具 举报

 楼主| 发表于 2012-11-27 13:08:43 | 显示全部楼层
弘毅 发表于 2012-11-24 20:31
你是用595驱动呀?这个需要死循环的,直接用IO口貌似更方便驱动一些。直接写一个变量,比如定义为长整数。然 ...

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

使用道具 举报

 楼主| 发表于 2012-11-27 13:27:11 | 显示全部楼层
如果我现在想,按一个开关一个灯亮,按第二个开关第一个灯灭第二个灯亮,这样的话能简单一点么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-27 16:15:39 | 显示全部楼层
我试出来了!!!就是用while死循环然后用条件从while里面不断break就可以了{:soso_e113:},就是语句有点罗嗦。。。
现在还有个问题,比如说我第一次按哪个按钮不确定,但是一按到某个按钮,就从这个按钮初始化开始一系列环节,这个该则么弄?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-27 16:17:30 | 显示全部楼层
本帖最后由 fbojue 于 2012-11-27 18:50 编辑

就是这样子
  1. if(state1==0){
  2.       while (1){
  3.       numbers[f_bits1]=B10000000;
  4.      shiftOut(dataPin_1, clockPin_1, LSBFIRST, numbers[f_bits1]);

  5.      digitalWrite(latchPin_1, HIGH);
  6.      
  7.      state1=digitalRead(switchPin1);
  8.      state2=digitalRead(switchPin2);
  9.      state3=digitalRead(switchPin3);
  10.      state4=digitalRead(switchPin4);
  11.      
  12.      Serial.print("switch1: ");
  13.      Serial.print(state1);
  14.      Serial.println();
  15.      Serial.print("switch2: ");
  16.      Serial.print(state2);
  17.      Serial.println();
  18.      Serial.print("switch3: ");
  19.      Serial.print(state3);
  20.      Serial.println();
  21.      Serial.print("switch4: ");
  22.      Serial.print(state4);
  23.      Serial.println();
  24.      
  25.      if(state2==0||state3==0||state4==0){
  26.      break;
  27.        }
  28.       }
复制代码


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

使用道具 举报

 楼主| 发表于 2012-11-28 20:08:08 | 显示全部楼层
本帖最后由 fbojue 于 2012-11-28 20:11 编辑

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

  7. int f_bit;
  8. int f_bits;
  9. int f_bits1;
  10. int f_bits2;
  11. int f_bits3;
  12. int f_bits4;

  13. byte final[1];
  14. byte numbers[1];

  15. int switchPin1=11;
  16. int switchPin2=10;
  17. int switchPin3=9;
  18. int switchPin4=8;

  19. int state1=1;
  20. int state2=1;
  21. int state3=1;
  22. int state4=1;


  23. void setup() {
  24.   Serial.begin(9600);
  25.   pinMode(switchPin1, INPUT);
  26.   pinMode(switchPin2, INPUT);
  27.   pinMode(switchPin3, INPUT);
  28.   pinMode(switchPin4, INPUT);

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

  33. }


  34. void loop() {

  35.     digitalWrite(latchPin_1, LOW);
  36.     final[f_bit]=B00000000;
  37.   
  38.     state1=digitalRead(switchPin1);
  39.     state2=digitalRead(switchPin2);
  40.     state3=digitalRead(switchPin3);
  41.     state4=digitalRead(switchPin4);
  42.    
  43.     numbers[f_bits]=1;
  44.    //=====================================//
  45. if(state1==0){
  46.   while(1){
  47.       _one();   
  48.   }
  49. }

  50.    //=====================================//
  51.         
  52.     shiftOut(dataPin_1, clockPin_1, MSBFIRST, final[f_bit]);  
  53.     digitalWrite(latchPin_1, HIGH);

  54.     Serial.print("switch1: ");
  55.     Serial.print(state1);
  56.     Serial.println();
  57.     Serial.print("switch2: ");
  58.     Serial.print(state2);
  59.     Serial.println();
  60.     Serial.print("switch3: ");
  61.     Serial.print(state3);
  62.     Serial.println();
  63.     Serial.print("switch4: ");
  64.     Serial.print(state4);
  65.     Serial.println();
  66.     Serial.println("LOOP");
  67.     delay(1);   
  68. }
  69. //================[1]==================//
  70. void _one(){

  71.      if(state1==0){   
  72.      while (1){

  73.      final[f_bits1]=numbers[f_bits];
  74.      
  75.      shiftOut(dataPin_1, clockPin_1, MSBFIRST, final[f_bits1]);
  76.      digitalWrite(latchPin_1, HIGH);
  77.      
  78.      state1=digitalRead(switchPin1);
  79.      state2=digitalRead(switchPin2);
  80.      state3=digitalRead(switchPin3);
  81.      state4=digitalRead(switchPin4);
  82.      
  83.      Serial.print("switch1: ");
  84.      Serial.print(state1);
  85.      Serial.println();
  86.      Serial.print("switch2: ");
  87.      Serial.print(state2);
  88.      Serial.println();
  89.      Serial.print("switch3: ");
  90.      Serial.print(state3);
  91.      Serial.println();
  92.      Serial.print("switch4: ");
  93.      Serial.print(state4);
  94.      Serial.println();
  95.      Serial.println("_one_1");
  96.    
  97.      if(state2==0){
  98.      break;
  99.        }
  100.       }
  101.     }else if( state2==0){  
  102.       while (1){
  103.         
  104.       final[f_bits2]=numbers[f_bits]*3;
  105.       
  106.      shiftOut(dataPin_1, clockPin_1, MSBFIRST, final[f_bits2]);
  107.      digitalWrite(latchPin_1, HIGH);
  108.      
  109.      state1=digitalRead(switchPin1);
  110.      state2=digitalRead(switchPin2);
  111.      state3=digitalRead(switchPin3);
  112.      state4=digitalRead(switchPin4);     

  113.      Serial.print("switch1: ");
  114.      Serial.print(state1);
  115.      Serial.println();
  116.      Serial.print("switch2: ");
  117.      Serial.print(state2);
  118.      Serial.println();
  119.      Serial.print("switch3: ");
  120.      Serial.print(state3);
  121.      Serial.println();
  122.      Serial.print("switch4: ");
  123.      Serial.print(state4);
  124.      Serial.println();
  125.      Serial.println("_one_2");
  126.      
  127.      if(state3==0){
  128.      break;
  129.        }
  130.       }
  131.          
  132.     }else if(state3==0){
  133.       while (1){
  134.         
  135.       final[f_bits3]=numbers[f_bits]*7;
  136.       
  137.      shiftOut(dataPin_1, clockPin_1, MSBFIRST, final[f_bits3]);
  138.      digitalWrite(latchPin_1, HIGH);
  139.      
  140.      state1=digitalRead(switchPin1);
  141.      state2=digitalRead(switchPin2);
  142.      state3=digitalRead(switchPin3);
  143.      state4=digitalRead(switchPin4);
  144.      
  145.      Serial.print("switch1: ");
  146.      Serial.print(state1);
  147.      Serial.println();
  148.      Serial.print("switch2: ");
  149.      Serial.print(state2);
  150.      Serial.println();
  151.      Serial.print("switch3: ");
  152.      Serial.print(state3);
  153.      Serial.println();
  154.      Serial.print("switch4: ");
  155.      Serial.print(state4);
  156.      Serial.println();
  157.      Serial.println("_one_3");
  158.      
  159.      if(state4==0){
  160.      break;
  161.        }
  162.       }
  163.             
  164.     } else if(state4==0){
  165.       while (1){
  166.          
  167.       final[f_bits4]=numbers[f_bits]*15;
  168.       
  169.      shiftOut(dataPin_1, clockPin_1, MSBFIRST, final[f_bits4]);
  170.      digitalWrite(latchPin_1, HIGH);
  171.      
  172.      state1=digitalRead(switchPin1);
  173.      state2=digitalRead(switchPin2);
  174.      state3=digitalRead(switchPin3);
  175.      state4=digitalRead(switchPin4);     

  176.      Serial.print("switch1: ");
  177.      Serial.print(state1);
  178.      Serial.println();
  179.      Serial.print("switch2: ");
  180.      Serial.print(state2);
  181.      Serial.println();
  182.      Serial.print("switch3: ");
  183.      Serial.print(state3);
  184.      Serial.println();
  185.      Serial.print("switch4: ");
  186.      Serial.print(state4);
  187.      Serial.println();
  188.      Serial.println("_one_4");
  189.       }
  190.     }   

  191.   }

  192. //=====================================//
复制代码


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


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

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-19 21:44 , Processed in 0.064284 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表