Мигание 7-сегментного сегмента Atmega328 и 4Digit !

Я подключил 4 светодиода 7Seg (CC) с транзисторами NPN на катоде каждой цифры. Я использую регистр сдвига 74HC595, подключенный к схеме довольно распространенным способом. Код, который я запускаю, является основным кодом сканирования для 7seg. Проблема в том, что я вижу отсканированные цифры и на других светодиодных цифрах. Прилагается изображение. Я называю их "призраками". Схема, которую я использую, имеет Atmega328 с внутренним Osc 8 МГц. Резисторы на сегментах 220Ом и 4 ВС547 на катодах цифр с резисторами 1кОм на их основании.

ниже приведен код:

void loop() {
 
катод_высокий(); // очистить экран
  
break_number(число);
      
отображаемое_число();
задержка (1);

    
}

void break_number(int num) { // разделяем введенное число на 4 отдельные цифры

первая_цифра = число/1000;
цифры[0] = первая_цифра;

int first_left = num - (first_digit * 1000);
вторая_цифра = первая_левая/100;
цифры[1] = вторая_цифра;
int second_left = first_left - (second_digit * 100);
третья_цифра = вторая_левая/10;
цифры[2] = третья_цифра;
четвертая_цифра = вторая_левая - (третья_цифра * 10);
цифры[3] = четвертая_цифра;
  
  
}

void display_number() { // сканирование
   
катод_высокий();
цифровая запись (защелка, НИЗКИЙ);
shiftOut(данные, clk, LSBFIRST, числа[цифры[количество]]);
digitalWrite(CAS[количество], ВЫСОКИЙ);
digitalWrite(защелка, ВЫСОКИЙ);
количество++;
если (количество == 4) {
количество = 0;
}
}

void cathode_high() { // отключаем все 4 цифры
цифровая запись (CA_1, НИЗКИЙ);
цифровая запись (CA_2, НИЗКИЙ);
цифровая запись (CA_3, НИЗКИЙ);
цифровая запись (CA_4, НИЗКИЙ);

Любая помощь будет высоко оценена. Заранее спасибо!

, 👍3

Обсуждение

ПНП на каждом катоде?! Вы, конечно, имеете в виду NPN...? Вы бы использовали PNP с общим анодом, а не с дисплеем с общим катодом., @Majenko

О да... Прости. 547 — это НПН., @spdif

Если вы когда-либо отображаете только одну цифру (никогда не увеличиваете счетчик), вы все еще видите ореолы на этой цифре?, @Majenko

Не могли бы вы измерить напряжение на выводах катода, когда они якобы выключены? Я предполагаю, что BC547 не полностью отключают ток через дисплей или выключаются очень медленно, что объясняет «призрак» при переключении между цифрами. Если у вас есть осциллограф, вы можете посмотреть напряжение на коллекторе BC547., @StarCat

@Majenko Спасибо за усилия. Это решено., @spdif

@StarCat Это была ошибка кодирования. Это сделано сейчас. В любом случае спасибо!!, @spdif

@jsotola я исправил это. спасибо, @spdif


1 ответ


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

4

Вы меняете катоды (цифры) перед фиксацией новых данных. Таким образом, на долю секунды данные для предыдущих цифр отображаются на текущей цифре.

Поменяйте местами digitalWrite(CAS[count], HIGH); и digitalWrite(latch, HIGH);, чтобы исправить это.

,

Бинго!! Это сработало. Спасибо!, @spdif

Рад, что это сработало. digitalWrite работает относительно медленно. Думал, что у меня тоже были «призраки» с прямым манипулированием портами., @Gerben

Есть ли способ включить / выключить полную цифру, используя метод сканирования с 74hc595? Насколько я понимаю, мы не можем, потому что функция display_number() уже переключает цифровые контакты для сканирования., @spdif

Я бы добавил еще один элемент в массив numbers для «без цифры», со всеми отключенными сегментами. Чтобы изменить цифру, вы можете установить цифру на «число» 10., @Gerben

Ну, я понял первую часть (добавление числа в массив), и в моем случае 7-й элемент сделал бы все цифры пустыми, но неясно во второй части. И специально "число" 10, @spdif

Массив numbers представляет собой таблицу поиска того, как отображать определенное число (то есть, какие сегменты включить. Где индекс 0 дает вам сегменты, которые должны быть включены, чтобы показать **символ** "0 " на вашем 7-сегментном дисплее. Индекс 1 для символа "1" и т. д. Я бы добавил индекс 10 в конце для пустого символа. Чтобы установить цифру как пустую, используйте что-то вроде digits[ 1]=10;. Почему в массиве numbers всего 6 элементов? Я ожидал, что их будет 10 (индексы 0..9)., @Gerben

Вы даже можете добавить больше индексов для символов «AbCdEF-_» (это почти все символы, которые вы можете создать на 7-сегментном дисплее)., @Gerben

Аааа я тебя понял! Извините, я запутался в числовых числах. Раньше у меня было 4 цифры, а теперь их 6. Так что пришлось добавить еще один элемент в массив numbers... отлично, позвольте мне попробовать. Я делаю обратный счетчик времени для машины. 6 цифр означают **H** **M** **S** . Он работает хорошо, только я просто хотел мигать цифрой при установке времени обратного отсчета., @spdif

Ааа, теперь я понял. Обратите внимание, что у вас также есть десятичная точка. Вы также можете использовать их для обозначения другого режима (например, «режим установки времени»). Просто мысль., @Gerben

Эй, извините, я застрял в другом месте. У меня это тоже на уме. Постараюсь вернуться. Спасибо за всю поддержку снова., @spdif