74HC595 + семисегмент. Нужна помощь знатоков для саморазвития ;)
- Войдите на сайт для отправки комментариев
Постепенно учусь 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};
Заранее спасибо!