Помогите с прерыванием while

Тема в разделе "Arduino & Shields", создана пользователем mister.trots, 13 мар 2022.

  1. mister.trots

    mister.trots Нуб

    Всем доброго здравия! Помогите! Есть такой код, все работает, но при нажатии кнопки 1, цифра 1 появляется не сразу, сначала происходит выполнение всего цикла, а затем собственно цифра 1 появляется. Вопрос, как сделать так чтобы при нажатии, цифра появлялась сразу, без ожидания окончания цикла. Работать должно так, при нажатии и удержании кнопки, загорается соответствующая цифра, при отпускании кнопки происходит цикл бегущих сегментов. Спасибо за понимание!
    int pins[7]={2,3,4,5,6,7,8};
    int button1 = 9;
    int button2 = 10;
    int button3 = 11;
    int button4 = 12;
    int button5 = 13;
    int button6 = 14;
    int val = 0;
    // значения для вывода цифр 0-9
    /*byte digitRank[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
    B10110110, B10111110, B11100000, B11111110, B11100110};
    */
    byte digitRank[117][7] = { { 0,0,0,0,0,0,0 }, // = 0
    { 0,1,1,0,0,0,0 }, // = 1
    { 1,1,0,1,1,0,1 }, // = 2
    { 1,1,1,1,0,0,1 }, // = 3
    { 0,1,1,0,0,1,1 }, // = 4
    { 1,0,1,1,0,1,1 }, // = 5
    { 1,1,1,0,1,1,1 }, // = R
    { 0,0,0,0,0,0,0 }, // = 7
    { 1,1,0,0,0,0,0 }, // = 8
    { 0,1,0,0,0,0,1 }, // = 9
    { 0,0,0,0,1,0,1 }, // = 10
    { 0,0,0,1,1,0,0 }, // = 11
    { 0,0,1,1,0,0,0 }, // = 12
    { 0,0,1,0,0,0,1 }, // = 13
    { 0,0,0,0,0,1,1 }, // = 14
    { 1,0,0,0,0,1,0 }, // = 15
    };

    // переменная для хранения значения текущей цифры
    int number=0;

    void setup(){

    // контакты выходы
    /*for(int i=0;i<7;i++)
    pinMode(pins,OUTPUT);
    */
    pinMode(2, OUTPUT); // a
    pinMode(3, OUTPUT); // b
    pinMode(4, OUTPUT); // c
    pinMode(5, OUTPUT); // d
    pinMode(6, OUTPUT); // e
    pinMode(7, OUTPUT); // f
    pinMode(8, OUTPUT); // g
    pinMode(9, INPUT); // первая передача
    pinMode(10, INPUT); // вторая передача
    pinMode(11, INPUT); // третья передача
    pinMode(12, INPUT); // четвертая передача
    pinMode(13, INPUT); // пятая передача
    pinMode(14, INPUT); // задняя
    }

    //вывод цифры на семисегментный индикатор
    void
    setDigit(byte digit) {
    byte pin=2;
    for (byte i = 0; i < 9; ++i) {
    digitalWrite(pin, digitRank[digit]);
    ++pin;}
    }

    void loop()
    {
    if (digitalRead(button1) == HIGH) {setDigit(1);}
    if (digitalRead(button1) != HIGH)
    {setDigit(8); delay(200);
    setDigit(9); delay(200);
    setDigit(10); delay(200);
    setDigit(11); delay(200);
    setDigit(12); delay(200);
    setDigit(13); delay(200);
    setDigit(14); delay(200);
    setDigit(15); delay(200);}
    while (digitalRead(button2) == HIGH) {setDigit(2); }
    while (digitalRead(button3) == HIGH) {setDigit(3); }
    while (digitalRead(button4) == HIGH) {setDigit(4); }
    while (digitalRead(button5) == HIGH) {setDigit(5); }
    while (digitalRead(button6) == HIGH) {setDigit(6); }
    }
    [/code]
     
  2. b707

    b707 Гуру

    избавляйтесь от delay(), с этим оператором кнопки сразу срабатывать не будут
     
  3. mister.trots

    mister.trots Нуб

    принял, сейчас попробую. Спасибо.
     
  4. b707

    b707 Гуру

    код - Г. полное
    Судя по всему, ты списал где-то номальный код, с использованием массивов и битов для сегментов - но не смог его осилить и весь перекорежил...
    а вот это что?
    Код (C++):
    byte digitRank[117][7] = { { 0,0,0,0,0,0,0 },
    что за 117 элементов в массиве?
     
  5. mister.trots

    mister.trots Нуб

    это помогло, но теперь как сделать так, чтобы сегменты бегали змейкой, когда кнопки не нажаты
     
  6. mister.trots

    mister.trots Нуб

    это для меня новое все, я в первый раз пробую, поэтому и прошу помощи
     
  7. b707

    b707 Гуру

    показывайте код.
    ТОЛЬКО ВСТАВЛЯЙТЕ ЕГО ПО ПРАВИЛАМ ФОРУМА, иначе попрощу модератора снести вашу тему полностью
     
  8. mister.trots

    mister.trots Нуб

    Код (C++):
    int pins[7]={2,3,4,5,6,7,8};
    int button1 = 9;
    int button2 = 10;
    int button3 = 11;
    int button4 = 12;
    int button5 = 13;
    int button6 = 14;
    int val = 0;
    // значения для вывода цифр 0-9
    /*byte digitRank[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
    B10110110, B10111110, B11100000, B11111110, B11100110};
    */

    byte digitRank[117][7] = { { 0,0,0,0,0,0,0 }, // = 0
                               { 0,1,1,0,0,0,0 }, // = 1
                               { 1,1,0,1,1,0,1 }, // = 2
                               { 1,1,1,1,0,0,1 }, // = 3
                               { 0,1,1,0,0,1,1 }, // = 4
                               { 1,0,1,1,0,1,1 }, // = 5
                               { 1,1,1,0,1,1,1 }, // = R
                               { 0,0,0,0,0,0,0 }, // = 7
                               { 1,1,0,0,0,0,0 }, // = 8
                               { 0,1,0,0,0,0,1 }, // = 9
                               { 0,0,0,0,1,0,1 }, // = 10
                               { 0,0,0,1,1,0,0 }, // = 11
                               { 0,0,1,1,0,0,0 }, // = 12
                               { 0,0,1,0,0,0,1 }, // = 13
                               { 0,0,0,0,0,1,1 }, // = 14
                               { 1,0,0,0,0,1,0 }, // = 15
                               };

    // переменная для хранения значения текущей цифры
    int number=0;

    void setup(){
     
    // контакты выходы
    /*for(int i=0;i<7;i++)
    pinMode(pins[i],OUTPUT);
    */

      pinMode(2, OUTPUT);    //  a
      pinMode(3, OUTPUT);    //  b
      pinMode(4, OUTPUT);    //  c
      pinMode(5, OUTPUT);    //  d
      pinMode(6, OUTPUT);    //  e
      pinMode(7, OUTPUT);    //  f
      pinMode(8, OUTPUT);    //  g
      pinMode(9, INPUT);   // первая передача
      pinMode(10, INPUT);  // вторая передача
      pinMode(11, INPUT);  // третья передача
      pinMode(12, INPUT);  // четвертая передача
      pinMode(13, INPUT);  // пятая передача
      pinMode(14, INPUT);  // задняя
    }

    //вывод цифры на семисегментный индикатор
    void
    setDigit(byte digit) {
      byte pin=2;
      for (byte i = 0; i < 9; ++i) {
        digitalWrite(pin, digitRank[digit][i]);
        ++pin;}
    }

    void loop()
    {    
         if (digitalRead(button1) == HIGH) {setDigit(1);}          
         if (digitalRead(button1) != HIGH)
               {setDigit(8);  delay(200);
                setDigit(9);  delay(200);
                setDigit(10); delay(200);
                setDigit(11); delay(200);
                setDigit(12); delay(200);
                setDigit(13); delay(200);
                setDigit(14); delay(200);
                setDigit(15); delay(200);}    
         while (digitalRead(button2) == HIGH) {setDigit(2);  }
         while (digitalRead(button3) == HIGH) {setDigit(3);  }
         while (digitalRead(button4) == HIGH) {setDigit(4);  }
         while (digitalRead(button5) == HIGH) {setDigit(5);  }
         while (digitalRead(button6) == HIGH) {setDigit(6);  }
    }
     
                     
     

       
     
     
       
     
  9. b707

    b707 Гуру

    это тот же код, что и в начале? Зачем он мне?
    Покажите, что у вас получилось после замены delay()

    И еще раз!!!! уберите уже двойной массив на 117 элементов... это чушь.
    Или вы вообще не понимаете ни буквы в этом коде?
     
  10. mister.trots

    mister.trots Нуб

    не горячитесь, все мы учимся.
     
  11. mister.trots

    mister.trots Нуб

    Код (C++):
    int pins[7]={2,3,4,5,6,7,8};
    int button1 = 9;
    int button2 = 10;
    int button3 = 11;
    int button4 = 12;
    int button5 = 13;
    int button6 = 14;
    int val = 0;
    // значения для вывода цифр 0-9
    /*byte digitRank[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
    B10110110, B10111110, B11100000, B11111110, B11100110};
    */

    byte digitRank[16][7] = { { 0,0,0,0,0,0,0 }, // = 0
                               { 0,1,1,0,0,0,0 }, // = 1
                               { 1,1,0,1,1,0,1 }, // = 2
                               { 1,1,1,1,0,0,1 }, // = 3
                               { 0,1,1,0,0,1,1 }, // = 4
                               { 1,0,1,1,0,1,1 }, // = 5
                               { 1,1,1,0,1,1,1 }, // = R
                               { 0,0,0,0,0,0,0 }, // = 7
                               { 1,1,0,0,0,0,0 }, // = 8
                               { 0,1,0,0,0,0,1 }, // = 9
                               { 0,0,0,0,1,0,1 }, // = 10
                               { 0,0,0,1,1,0,0 }, // = 11
                               { 0,0,1,1,0,0,0 }, // = 12
                               { 0,0,1,0,0,0,1 }, // = 13
                               { 0,0,0,0,0,1,1 }, // = 14
                               { 1,0,0,0,0,1,0 }, // = 15
                               };

    // переменная для хранения значения текущей цифры
    int number=0;

    void setup(){
     
    // контакты выходы
    /*for(int i=0;i<7;i++)
    pinMode(pins[i],OUTPUT);
    */

      pinMode(2, OUTPUT);    //  a
      pinMode(3, OUTPUT);    //  b
      pinMode(4, OUTPUT);    //  c
      pinMode(5, OUTPUT);    //  d
      pinMode(6, OUTPUT);    //  e
      pinMode(7, OUTPUT);    //  f
      pinMode(8, OUTPUT);    //  g
      pinMode(9, INPUT);   // первая передача
      pinMode(10, INPUT);  // вторая передача
      pinMode(11, INPUT);  // третья передача
      pinMode(12, INPUT);  // четвертая передача
      pinMode(13, INPUT);  // пятая передача
      pinMode(14, INPUT);  // задняя
    }

    //вывод цифры на семисегментный индикатор
    void
    setDigit(byte digit) {
      byte pin=2;
      for (byte i = 0; i < 9; ++i) {
        digitalWrite(pin, digitRank[digit][i]);
        ++pin;}
    }

    void loop()
    {    
         if (digitalRead(button1) == HIGH) {setDigit(1);}          
         if (digitalRead(button1) != HIGH)
               {setDigit(8);
                setDigit(9);
                setDigit(10);
                setDigit(11);
                setDigit(12);
                setDigit(13);
                setDigit(14);
                setDigit(15); }
                   
         while (digitalRead(button2) == HIGH) {setDigit(2);  }
         while (digitalRead(button3) == HIGH) {setDigit(3);  }
         while (digitalRead(button4) == HIGH) {setDigit(4);  }
         while (digitalRead(button5) == HIGH) {setDigit(5);  }
         while (digitalRead(button6) == HIGH) {setDigit(6);  }
    }
     
       
     
  12. parovoZZ

    parovoZZ Гуру

    делается это всё совершенно по-другому.