74HC595 + семисегмент. Нужна помощь знатоков для саморазвития ;)

Нет ответов
arssev1
Offline
Зарегистрирован: 10.04.2014

Постепенно учусь Wiring'у, сейчас учусь работать со сдвиговыми регистрами (в частности с 74HC595). Сейчас решил подключить к нему семисегментный индикатор с общим анодом (кстати, сколько нужно сопротивления на этот анод, а то в даташите не нашел и поставил 360Ом)

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

Ближе к делу - написал свой код (простейший счетчик нажатий), хотелось бы критики, что можно улучшить, где допилить, где я закостылил и можно иначе (образование ни разу не техническое, склад ума тоже, так что сильно не пинайте)

/*
Скетч для работы с 7-сегментным дисплеем (общий анод), ИС 74HC595
-----------------------------------------------
Подключение 7-сегментного индикатора к 74HC595:
A -> Q1
B -> Q2
C -> Q3
D -> Q4
E -> Q5
F -> Q6
G -> Q0
DP -> Q7
-----------------------------------------------
Подключение ИС 74HC595 к Arduino
DS -> pin 7 | пин данных
STCP -> pin 6 | пин "защелки"
SHCP -> pin 5 | пин "таймера"
-----------------------------------------------
*/

const int latchPin = 6; //пин "защелки" подключаем к 6 порту
const int clockPin = 5; //пин "таймера" к 5 порту
const int dataPin = 7; //пин данных к 7 порту

const int counterButton = 4; //кнопку счетчика к 4 порту

int digits[] = {129, 243, 200, 224, 178, 164, 132, 177, 128, 160}; //значения для вывода цифр от 0 до 9 (конвертированно из двоичных чисел), НЕ ТРОГАТЬ!

int val = 0; //вспомогатьельная переменная, счетчик
long previousMillis = 0; //вспомогатьельная переменная, для защиты от "дребезга" кнопки

void setup() {
  pinMode(latchPin, OUTPUT); //устанавливаем пин "защелки" на выход
  pinMode(clockPin, OUTPUT); //устанавливаем пин "таймера" на выход
  pinMode(dataPin, OUTPUT); //устанавливаем пин данных на выход
  
  pinMode(counterButton, INPUT_PULLUP); //устанавливаем пин кнопки на вход, подтягивающий резистор вкл. (по умолчанию HIGH, при замыкании LOW)
}

void loop() {
  if(digitalRead(counterButton) == LOW) { //если кнопка нажата
    if (millis() - previousMillis > 250) { //если прошло 250мс с прошлого нажатия
      previousMillis = millis(); //приравниваем таймер прошлого нажатия к таймеру текущего
      val++; //увеличиваем переменную счетчика на 1
    }
  }
  
  if(val >= 10) { //если переменная счетчика больше или равна 10 (превышает 9)
    val = 0; //сбрасываем ее (обнуляем)
  }
  
  digitalWrite(latchPin, LOW); //открываем "защелку" (разрешаем писать в пин данных)
  shiftOut(dataPin, clockPin, MSBFIRST, digits[val]);  //пишем текущую цифру (согласно переменной счеткика)
  digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, данные в микросхему писать нельзя
}

Мне кажется, что что-то не так с этим я сделал, можно наверное и проще:

int digits[] = {129, 243, 200, 224, 178, 164, 132, 177, 128, 160};

Заранее спасибо!