Каждая из 4-х кнопок должна менять свой разряд на индикаторе

Тема в разделе "Arduino & Shields", создана пользователем AmadeusEvg, 23 дек 2021.

  1. AmadeusEvg

    AmadeusEvg Нуб

    Прошу помощи в написании скетча для следующей задачи:
    Есть 4-разрядный 7-сегментный индикатор, подключенный через сдвиговый регистр 74HC595N и четыре кнопки.
    При запуске отображаются цифры, напр. 1234.
    Нужно сделать так, чтобы:
    - при нажатии на первую кнопку менялся первый разряд на +1 (т.е. 2234, ещё раз нажали - 3234 и т.д. - 9234 затем 0234;
    - при нажатии на вторую кнопку - второй разряд +1 (т.е. 1334, 1434 и т.д.),
    - при нажатии на третью - 3 разряд (1244, 1254, 1264 и т.д),
    - и на четвёртую - 4 разряд (1235, 1236 и т.д.).
    После цифры 9 снова 0, т.е. не должно происходить суммирование к следующему разряду.
    После набора некоторой переменной присваивается полученное итоговое четырёхзначное число.
     
  2. SergeiL

    SergeiL Оракул Модератор

    А что не получается то?
     
  3. AmadeusEvg

    AmadeusEvg Нуб

    Для одного разряда понятно как, а вот передать данные shiftOut для следующего разряда, чтобы не сдвигались другие - не понятно.
     
  4. AmadeusEvg

    AmadeusEvg Нуб

    Хотя уже примерно понял как - можно просто математическим делением на разряды и выводить один итоговый результат.
     
  5. parovoZZ

    parovoZZ Гуру

    Используй BCD формат.
     
  6. b707

    b707 Гуру

    чтоб не сдвигались - никак. При изменении любого разряда придется выводить все.
    После того как поймешь это - проблем нет, задачка простейшая
     
  7. AmadeusEvg

    AmadeusEvg Нуб

    Всё получилось!

    Код (C++):
    #include "Timer.h"
    Timer t; //создание объекта Timer
    int number = 1234;
    int first_digit = 0;
    int second_digit = 0;
    int third_digit = 0;
    int fourth_digit = 0;
    int data = 4;
    int latch = 5;
    int clk = 6;
    int OK_1 = 12;
    int OK_2 = 11;
    int OK_3 = 10;
    int OK_4 = 9;
    int count = 0;
    int BUTTON_PIN1 = 13;
    int BUTTON_PIN2 = 8;
    int BUTTON_PIN3 = 7;
    int BUTTON_PIN4 = 3;
    boolean buttonWasUp1 = true;
    boolean buttonWasUp2 = true;
    boolean buttonWasUp3 = true;
    boolean buttonWasUp4 = true;
    int led = 2;
    int digits[4];
    int CAS[4] = {12, 11, 10, 9};
    byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110}; // 0 – 9

    void setup() {
      pinMode(data, OUTPUT);
      pinMode(latch, OUTPUT);
      pinMode(clk, OUTPUT);
      pinMode(OK_1, OUTPUT);
      pinMode(OK_2, OUTPUT);
      pinMode(OK_3, OUTPUT);
      pinMode(OK_4, OUTPUT);
      digitalWrite(OK_1, HIGH);
      digitalWrite(OK_2, HIGH);
      digitalWrite(OK_3, HIGH);
      digitalWrite(OK_4, HIGH);
      pinMode(BUTTON_PIN1, INPUT_PULLUP);
      pinMode(BUTTON_PIN2, INPUT_PULLUP);
      pinMode(BUTTON_PIN3, INPUT_PULLUP);
      pinMode(BUTTON_PIN4, INPUT_PULLUP);
      pinMode(led, OUTPUT);
      digitalWrite(led, LOW);
      t.every(1, display_number);  //  прерывание по таймеру 1 мс
      break_number(number);
    }


    void loop() {
      t.update();
      digitalWrite(led, LOW);
      if (buttonWasUp1 && !digitalRead(BUTTON_PIN1)) {
        delay(10);
        if (!digitalRead(BUTTON_PIN1))
          digits[0] ++;
          if (digits[0] > 9) digits[0] = 0;
          }
        buttonWasUp1 = digitalRead(BUTTON_PIN1);
      if (buttonWasUp2 && !digitalRead(BUTTON_PIN2)) {
        delay(10);
        if (!digitalRead(BUTTON_PIN2))
          digits[1] ++;
          if (digits[1] > 9) digits[1] = 0;
          }
        buttonWasUp2 = digitalRead(BUTTON_PIN2);
       if (buttonWasUp3 && !digitalRead(BUTTON_PIN3)) {
        delay(10);
        if (!digitalRead(BUTTON_PIN3))
          digits[2] ++;
          if (digits[2] > 9) digits[2] = 0;
          }
        buttonWasUp3 = digitalRead(BUTTON_PIN3);
      if (buttonWasUp4 && !digitalRead(BUTTON_PIN4)) {
        delay(10);
        if (!digitalRead(BUTTON_PIN4))
          digits[3] ++;
          if (digits[3] > 9) digits[3] = 0;
          }
        buttonWasUp4 = digitalRead(BUTTON_PIN4);

        number = digits[3] + digits[2]*10 + digits[1]*100 + digits[0]*1000;

        if (number == 5555) digitalWrite(led, HIGH);
    }

    void break_number(int num) { // деление на разряды
      digits[0] = num/1000;
      digits[1] = (num%1000)/100;
      digits[2] = (num%100)/10;
      digits[3] = num%10;
    }

    void display_number() {
      cathode_high();                   //  Выключаем индикатор
      digitalWrite(latch, LOW);
      shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //передаем данные
      digitalWrite(CAS[count], LOW);
      digitalWrite(latch, HIGH);
      count++;
      if (count == 4) count = 0;
    }

    void cathode_high() {
      digitalWrite(OK_1, HIGH);
      digitalWrite(OK_2, HIGH);
      digitalWrite(OK_3, HIGH);
      digitalWrite(OK_4, HIGH);
    }