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

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем OOM, 27 янв 2017.

  1. OOM

    OOM Нерд

    Всем доброго! Подскажите пожалуйста, как можно реализовать следующую задачу.
    Есть семь кнопок и один 7-ми сегментный индикатор с ОК,
    При включении платы (UNO) на индикаторе зажигается цифра "0", при нажатии кнопки №1 - загорается цифра "1", при нажатии кнопки №2 - загорается цифра "2" и так далее, при нажатии кнопки №7 происходит сброс цифр на "0".
     
  2. rkit

    rkit Гуру

    Подключаете индикатор и кнопки к пинам, пишете код. Конкретно в чем проблема? Что уже сделано?
     
  3. OOM

    OOM Нерд

    Пока по примерам вывод (последовательный) цифр, как счетчик, а мне нужно, чтобы при нажатии кнопок выводилась определенная цифра, а как это сделать ни как не могу найти.
     
  4. OOM

    OOM Нерд

    Код (Text):

    // список выводов Arduino для подключения к разрядам a-g
    // семисегментного индикатора
    int pins[7]={2,3,4,5,6,7,8};
    // значения для вывода цифр 0-9
    byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
    B10110110, B10111110, B11100000, B11111110, B11100110};
    // переменная для хранения значения текущей цифры
    int number=0;
    void setup()
    {
    // Сконфигурировать контакты как выходы
    for(int i=0;i<7;i++)
    pinMode(pins[i],OUTPUT);
    }
    void loop()
    {
    showNumber(number);
    delay(1000);
    number=(number+1)%10;
    }
    // функция вывода цифры на семисегментный индикатор
    void showNumber(int num)
    {
    for(int i=0;i<7;i++)
    {
    if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
    digitalWrite(pins[i],HIGH);
    else // потушить сегмент
    digitalWrite(pins[i],LOW);
    }
    }


     
     
  5. rkit

    rkit Гуру

    Копируя примеры вы далеко не уедете. Их надо разбирать и понимать, чтобы учиться делать что-то самому.
    Уберите функцию счетчика, чтобы он был только на одну цифру. Потом добавите вторую кнопку на другую цифру, и так далее.
     
  6. Delit

    Delit Нерд

    Код (C++):
    // список выводов Arduino для подключения к разрядам a-g
    // семисегментного индикатора
    int pins[7]={2,3,4,5,6,7,8};
    int button[5] = {9, 10, 11, 12, 13};
    // значения для вывода цифр 0-9
    byte numbers[10] = { B11111100, B01100000, B11011010, B11110010, B01100110,
    B10110110, B10111110, B11100000, B11111110, B11100110};
    // переменная для хранения значения текущей цифры
    int number=0;
    void setup()
    {
    // Сконфигурировать контакты как выходы
    for(int i=0;i<7;i++)
    pinMode(pins[i],OUTPUT);

    for(int i=0; i<5; i++)
    pinMode(button[i], INPUT_PULLUP);
    }
    void loop()
    { for(int i=0; i<5; i++)
        if(digitalRead(button[i]) == LOW)
         number = i;
       showNumber(number);
    }
    // функция вывода цифры на семисегментный индикатор
    void showNumber(int num)
    {
    for(int i=0;i<7;i++)
    {
    if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
    digitalWrite(pins[i],HIGH);
    else // потушить сегмент
    digitalWrite(pins[i],LOW);
    }
    }
     
  7. OOM

    OOM Нерд

     
  8. OOM

    OOM Нерд

    Код (Text):

    int e = 6;
    int d = 5;
    int c = 4;
    int b = 3;
    int a = 2;
    int f = 7;
    int g = 8;

    int PinOut = 9; // пин-выход
    int PinIn[4] {11, 10, 13, 12}; // пины входа

    void setup()
    {
      pinMode(e, OUTPUT);
      pinMode(d, OUTPUT);
      pinMode(c, OUTPUT);
      pinMode(b, OUTPUT);
      pinMode(a, OUTPUT);
      pinMode(f, OUTPUT);
      pinMode(g, OUTPUT);
      pinMode (10, INPUT);
      digitalWrite(10, HIGH);
      pinMode (11, INPUT);
      digitalWrite(11, HIGH);
      pinMode (12, INPUT);
      digitalWrite(12, HIGH);
      pinMode (13, INPUT);
      digitalWrite(13, HIGH);
      //установить выходной пин на вывод
      pinMode (PinOut, OUTPUT);
      //установить входные пины на ввод и подать на них ток
      for (int i = 0; i < 4; i++) {
        pinMode (PinIn[i], INPUT_PULLUP);
        digitalWrite(PinIn[i], HIGH);
      }
      displayDigit(0);
    }

    void displayDigit(int digit)
    {
      if (digit == 0)
      {
        digitalWrite(e, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(a, HIGH);
        digitalWrite(f, HIGH);

      }
      else if (digit == 1)
      {
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
      }

      else if (digit == 2)
      {
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(d, HIGH);
      }

      else if (digit == 3)
      {
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
      }

      else if (digit == 4)
      {
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
      }
      else if (digit == 5)
      {
        digitalWrite(a, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
      }

      else if (digit == 6)
      {
        digitalWrite(a, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(g, HIGH);
      }
      else if (digit == 7)
      {
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
      }
      else if (digit == 8)
      {
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);

      }
      else if (digit == 9)
      {
        digitalWrite(a, HIGH);
        digitalWrite(b, HIGH);
        digitalWrite(c, HIGH);
        digitalWrite(d, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, HIGH);
      }

    }
    void turnOff()
    {
      digitalWrite(a, LOW);
      digitalWrite(b, LOW);
      digitalWrite(c, LOW);
      digitalWrite(d, LOW);
      digitalWrite(e, LOW);
      digitalWrite(f, LOW);
      digitalWrite(g, LOW);
    }

    void loop()
    {

      digitalWrite(PinOut, LOW); //подать 0 на выходной пин
      for (int i = 1; i <= 4; i++) // обойти цикл по кнопкам (колнкам кнопок)
      {
        if (digitalRead(PinIn[0]) == LOW)
        {
          turnOff();
          displayDigit(1);
        }

        if (digitalRead(PinIn[1]) == LOW)
        {
          turnOff();
          displayDigit(2);
        }
        if (digitalRead(PinIn[2]) == LOW)
        {
          turnOff();
          displayDigit(3);
        }
        if (digitalRead(PinIn[3]) == LOW)
        {
          turnOff();
          displayDigit(4);
        }
      }
      digitalWrite(PinOut, HIGH); //вернуть ток на выходной пин

    }

     
    Подскажите пожалуйста как этот код можно сделать более компатным