Мигание 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, НИЗКИЙ);
Любая помощь будет высоко оценена. Заранее спасибо!
@spdif, 👍3
Обсуждение1 ответ
Лучший ответ:
Вы меняете катоды (цифры) перед фиксацией новых данных. Таким образом, на долю секунды данные для предыдущих цифр отображаются на текущей цифре.
Поменяйте местами 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
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Не удается снова загрузиться после смены платы
- ATMEGA328P-U vs ATMEGA328-PU
- Модуль SIM808 GSM работает нормально, GPS не работает (нет сообщения о готовности GPS при включении питания)
- Arduino 16 МГц только с 3,3 В?
- Генерация стабильной частоты
- В чем разница между ATMEGA32 и ATMEGA328?
ПНП на каждом катоде?! Вы, конечно, имеете в виду NPN...? Вы бы использовали PNP с общим анодом, а не с дисплеем с общим катодом., @Majenko
О да... Прости. 547 — это НПН., @spdif
Если вы когда-либо отображаете только одну цифру (никогда не увеличиваете счетчик), вы все еще видите ореолы на этой цифре?, @Majenko
Не могли бы вы измерить напряжение на выводах катода, когда они якобы выключены? Я предполагаю, что BC547 не полностью отключают ток через дисплей или выключаются очень медленно, что объясняет «призрак» при переключении между цифрами. Если у вас есть осциллограф, вы можете посмотреть напряжение на коллекторе BC547., @StarCat
@Majenko Спасибо за усилия. Это решено., @spdif
@StarCat Это была ошибка кодирования. Это сделано сейчас. В любом случае спасибо!!, @spdif
@jsotola я исправил это. спасибо, @spdif