Это дает некоторые сбои на 7-сегментном дисплее

Он показывает правильное значение на мониторе, но не отображает значение на моем дисплее.

int pinNumb[7] = {2, 3, 4, 5, 6, 7, 8};
int num_array[11][7] = {
  { 1, 1, 1, 1, 1, 0, 1 }, // 0
  { 0, 1, 1, 0, 0, 0, 0 }, // 1
  { 1, 1, 0, 1, 1, 1, 0 }, // 2
  { 1, 1, 1, 1, 0, 1, 0 }, // 3
  { 0, 1, 1, 0, 0, 1, 1 }, // 4
  { 1, 0, 1, 1, 0, 1, 1 }, // 5
  { 1, 0, 1, 1, 1, 1, 1 }, // 6
  { 1, 1, 1, 0, 0, 0, 0 }, // 7
  { 1, 1, 1, 1, 1, 1, 1 }, // 8
  { 1, 1, 1, 0, 0, 1, 1 }, // 9
  { 0, 0, 0, 0, 0, 0, 0 }  // ничего
};

int pin = 2;
int button = 12;
int buttonVal;
int randVal;
bool pressVal;
void setup() {
  Serial.begin(9600);

  for (int i = 0; i < 7 ; i++)
  {
    pinMode(pinNumb[i], OUTPUT);
  }
  pressVal = false;
  pinMode(button, INPUT);
}

void loop() {
  buttonVal = digitalRead(button);
  if (buttonVal == 0) 
  {
    //нуль();
    turnOff();
    pressVal = false;
  }
  else
  {
    //нуль();
    if (pressVal == false)
    {
      randVal = rand() % 10;
      pressVal = true;
      delay(100);
    }
    Serial.println(randVal);
    if (randVal == 0)
    {
      zero();

    }
    else if (randVal == 1)
    {
      one();

    }
    else if (randVal == 2)
    {
      two();

    }
    else if (randVal == 3)
    {
      three();

    }
    else if (randVal == 4)
    {
      four();

    }
    else if (randVal == 5)
    {
      five();

    }
    else if (randVal == 6)
    {
      six();

    }
    else if (randVal == 7)
    {
      seven();

    }
    else if (randVal == 8)
    {
      eight();

    }
    else
    {
      nine();

    }
  }
}

void zero()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[0][j]);
    pin++;
  }
}

void one()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[1][j]);
    pin++;
  }
}

void two()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[2][j]);
    pin++;
  }
}
void three()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[3][j]);
    pin++;
  }
}
void four()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[4][j]);
    pin++;
  }
}
void five()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[5][j]);
    pin++;
  }
}
void six()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[6][j]);
    pin++;
  }
}
void seven()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[7][j]);
    pin++;
  }
}
void eight()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[8][j]);
    pin++;
  }
}
void nine()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[9][j]);
    pin++;
  }
}
void turnOff()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }

}

, 👍0

Обсуждение

7-сегментный дисплей, сгенерированное случайное значение, контакты 2-9 подключены от arduino uno к 7-сегментному дисплею. 7-сегментный дисплей не показывает сгенерированное число, а только несколько случайных цифр., @Bavo

ваш код слишком повторяющийся... вы можете удалить 95% кода и при этом сохранить желаемую функциональность... у вас также есть бесполезный код... например, внутри функции void zero(), в чем смысл наличия первого цикла for? ... то же самое для всех остальных функций, @jsotola

Я полный нуб в этом, поэтому я просто использовал то, что узнал, если бы вы могли дать немного более конкретное объяснение того, что вы имеете в виду, это было бы полезно., @Bavo

внимательно посмотрите на функцию void zero()... что делает код? ... помните, что вся функция выполняется за несколько миллисекунд .... вам действительно нужен первый цикл for?, @jsotola

Так что я просто удаляю его, потому что эта функция сделала так, что на дисплее не было других цифр., @Bavo

у тебя только одна цифра... у тебя 7 сегментов, @jsotola

ах, я имею в виду сегменты;, @Bavo


2 ответа


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

0

Вы постоянно увеличиваете значение переменной pin с помощью pin++, но никогда не сбрасываете ее на начало (2?), когда нужно записать новое число. Так что это может сработать в первый раз, но никогда после этого.

Кроме того, вы очищаете дисплей с помощью digitalWrite(pinNumb[i],LOW); Но вы включаете сегменты с помощью digitalWRite(pin,....); пин++. Разве вы не должны включать сегменты с помощью digitalWrite(pinNumb[i] . . ?

,

да, это было бы проще, но для упражнения мне нужно использовать массив, так что это невозможно., @Bavo

я хочу сказать, что вы НЕ используете массив при включении сегментов., @tavis


0

Все они могут быть byte вместо int для экономии памяти:

int pinNumb[7] = {2, 3, 4, 5, 6, 7, 8};
int num_array[11][7] = {
  { 1, 1, 1, 1, 1, 0, 1 }, // 0
  { 0, 1, 1, 0, 0, 0, 0 }, // 1
  { 1, 1, 0, 1, 1, 1, 0 }, // 2
  { 1, 1, 1, 1, 0, 1, 0 }, // 3
  { 0, 1, 1, 0, 0, 1, 1 }, // 4
  { 1, 0, 1, 1, 0, 1, 1 }, // 5
  { 1, 0, 1, 1, 1, 1, 1 }, // 6
  { 1, 1, 1, 0, 0, 0, 0 }, // 7
  { 1, 1, 1, 1, 1, 1, 1 }, // 8
  { 1, 1, 1, 0, 0, 1, 1 }, // 9
  { 0, 0, 0, 0, 0, 0, 0 }  // ничего
};

int pin = 2;
int button = 12;
int buttonVal;
int randVal;

Кроме того, массив можно уменьшить до 11 байт:

0bFD, // 0
0bC0, // 1
0bDE, // 2 
etc.

Затем ваши функции могут выполнять прямые манипуляции с портом для отправки битов 0–5 в порт для D2–D7 и битов в D8.

Как написано, этим функциям, вероятно, требуется некоторое время удержания, чтобы они не просто мигали светодиодом и исчезали:

void one()
{
  for(int i = 0; i < 7 ; i++)
  {
    digitalWrite(pinNumb[i],LOW);  
  }
  for (int j = 0; j < 7; j++) {
    digitalWrite(pin, num_array[1][j]);
    pin++;
  }
}
,

какую команду я должен использовать, чтобы удерживать их задержку, на самом деле ничего не делая., @Bavo

Более длительная задержка ()? Вроде 250 (четверть секунды)? Экспериментируйте, смотрите, что вам подходит., @CrossRoads

Теперь только первый сгенерированный номер отображается правильно, все остальные после него просто сломанные сегменты., @Bavo