7 светодиодных индикаторов номера

Мне нужно написать строку цифр, например 1234567, на 7-светодиодном дисплее. Например, на дисплее будет гореть 1 на 0,5 секунды, затем он погаснет, затем загорится 2 и так далее. В конце концов мне нужно отобразить «-» в течение 2 секунд. Я также добавил изображение данной задачи.Given Task

Ниже приведен код, который я написал. Хотелось бы спросить, правильно ли оно, и есть ли какие-то огрехи.

  const int LEDa=13;
  const int LEDb=12;
  const int LEDc=11;
  const int LEDd=10;
  const int LEDe=9;
  const int LEDf=8;
  const int LEDg=7;

  int i;
  int a;

  void setup() {

    pinMode(LEDa, OUTPUT);
    pinMode(LEDb, OUTPUT);
    pinMode(LEDc, OUTPUT);
    pinMode(LEDd, OUTPUT);
    pinMode(LEDe, OUTPUT);
    pinMode(LEDf, OUTPUT);
    pinMode(LEDg, OUTPUT);

  }

  void loop() {
    int array[7]= {1,8,0,5,1,0,0};
    for(i=0;i<8;i++){
      a= array[i];
      }
        switch(a){
          case 1:
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          delay(500);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          break;
          case 2:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDg,HIGH);
          digitalWrite(LEDe,HIGH);
          digitalWrite(LEDd,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDg,LOW);
          digitalWrite(LEDe,LOW);
          digitalWrite(LEDd,LOW);
          break;
          case 3:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDg,HIGH);
          digitalWrite(LEDd,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDg,LOW);
          digitalWrite(LEDd,LOW);
          break;
          case 4:
          digitalWrite(LEDf,HIGH);
          digitalWrite(LEDg,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          delay(500);
          digitalWrite(LEDf,LOW);
          digitalWrite(LEDg,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          break;
          case 5:
          digitalWrite(LEDf,HIGH);
          digitalWrite(LEDg,HIGH);
          digitalWrite(LEDd,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDa,HIGH);
          delay(500);
          digitalWrite(LEDf,LOW);
          digitalWrite(LEDg,LOW);
          digitalWrite(LEDd,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDa,LOW);
          break;
          case 6:
          digitalWrite(LEDf,HIGH);
          digitalWrite(LEDg,HIGH);
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDe,HIGH);
          digitalWrite(LEDd,HIGH);
          delay(500);
          digitalWrite(LEDf,LOW);
          digitalWrite(LEDg,LOW);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDe,LOW);
          digitalWrite(LEDd,LOW);
          break;
          case 7:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          break;
          case 8:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDd,HIGH);
          digitalWrite(LEDe,HIGH);
          digitalWrite(LEDf,HIGH);
          digitalWrite(LEDg,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDd,LOW);
          digitalWrite(LEDe,LOW);
          digitalWrite(LEDf,LOW);
          digitalWrite(LEDg,LOW);
          break;
          case 9:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDd,HIGH);
          digitalWrite(LEDf,HIGH);
          digitalWrite(LEDg,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDd,LOW);
          digitalWrite(LEDf,LOW);
          digitalWrite(LEDg,LOW);
          break;
          case 0:
          digitalWrite(LEDa,HIGH);
          digitalWrite(LEDb,HIGH);
          digitalWrite(LEDc,HIGH);
          digitalWrite(LEDd,HIGH);
          digitalWrite(LEDe,HIGH);
          delay(500);
          digitalWrite(LEDa,LOW);
          digitalWrite(LEDb,LOW);
          digitalWrite(LEDc,LOW);
          digitalWrite(LEDd,LOW);
          digitalWrite(LEDe,LOW);
          digitalWrite(LEDf,LOW);
          break;
          }
          if(i=8){
            digitalWrite(LEDg,HIGH);
            delay(2000);
            digitalWrite(LEDg,LOW);
            }
          }

, 👍0

Обсуждение

Так вы действительно пытались проверить, работает ли код? Вы просите людей просто проверить код на наличие ошибок., @MichaelT

переключатель находится снаружи for, @Juraj

Я еще не построил схему. Это был образовательный код, который мне нужно было написать. Помимо запроса о проверке ошибок, мне было интересно, как я могу сделать это более кратким без необходимости использования случаев, на что в данном случае я получил ответ., @E.Canberk

Возможно, вас заинтересует моя реализация. Я использую сдвиговый регистр вместо набора контактов Arduino, но это может дать вам некоторые идеи. Посмотрите тесты, чтобы увидеть, как оно используется. https://github.com/rubberduck203/digital-thermometer/blob/master/src/SevenSegment.cpp, @RubberDuck

мой комментарий какой-то придирчивый, но это все-таки программирование......важно точно следовать инструкциям.......ваше описание проблемы и описание на картинке различаются......у вас сказал он выключится.... на картинке такой директивы нет... возможно, переход от 1 к 2 означает оставить сегмент "b" включенным, выключить сегмент "c" " и включаем сегменты "а", "г" и "д", @jsotola


2 ответа


Лучший ответ:

2

Я вижу 3 ошибки:

  1. Вы определяете массив из 7 элементов, но в цикле for вы подсчитываете 8 элементов, используя i<8 (индексы массива начинаются с 0, поэтому 0 будет первым, а 6 — последним элементом). В настоящее время вы пытаетесь получить доступ к несуществующему элементу массива.

  2. Инструкция if здесь также бесполезна. В вашем текущем коде вы проверяете, чтобы i был равен 8, но внутри цикла for оно никогда не будет равно 8, поскольку вы использовали условие i<8 . Чтобы отобразить последний - после числа, вам следует поместить код после цикла for.

  3. В том же операторе if вы пишете i=8, но один знак равенства означает присваивание. Переменной i будет присвоено значение 8, и это присвоение всегда истинно. Если вы хотите проверить равенство, используйте == (двойные знаки равенства)


Совет. Вы можете уменьшить размер кода, определив функции для часто повторяющихся частей кода (например, код для отключения всех светодиодов).

Совет 2. Если вы хотите, чтобы код был максимально эффективным, вы можете изменить контакты, чтобы использовать один единственный порт. Тогда вы сможете изменить все выводы порта сразу, присвоив ему один байт. Вы можете сохранить эти байты в массиве. Это сделает ваш код намного короче, но вам также потребуется более глубокое понимание манипуляций с портами. Вы можете выбрать, чем хотите заниматься.

,

0

Похоже, что это в основном правильно, хотя это очень трудоемкий способ присвоения 7 сегментам нескольких значений. Я был бы более склонен создать массив байтов, в котором 7 бит каждого байта содержат единицы/нули для управления светодиодами. Тогда вы можете пропустить массивный оператор переключения и просто перебрать массив байтов.

Одна ошибка: if(i=8) должен быть if (i == 8). (= — это присваивание. Вам нужен оператор сравнения ==.) Ваш код не будет работать правильно, пока вы это не исправите.

,