Семисегментный индикатор

В первом занятии мы познакомились со светодиодом.

Что же такое семисегментный индикатор? Это по сути 8 светодиодов, с соединённым анодом, или катодом, которые упакованы в единый корпус, форма которого позволяет включением всех, или части светодиодов формировать символы. Так например если мы подадим ток на сегменты A, B, D, E, и G - мы получим цифру 2.

chrome Rvw29FJsiN

Использовать будем индикатор, с маркировкой E10561-G-O-0-W.

 

Добрый день.
На предыдущих занятиях мы познакомились со светодиодами.
Сегодня продолжим развитие этой темы, и разберём не менее интересное устройство -
семисегментный индикатор.
По своей сути - это 7 или 8 светодиодов, соединенные анодами, либо катодами, и упакованные
в единый корпус. Форма которого позволяет включением всех, или части светодиодов
формировать символы.

Для нашего занятия - нашел у себя индиктатор с маркировкой E10561-G.
Даташит на него сейчас на экране.
Так,как в нашем случае индикатор с буквой G, то он с общим анодом.

Подключим наш индикатор к микроконтроллеру.
это конечно выглядит страшно, но можно разобрать, что его выводы подключены к пинам
0,1,2,3,4,5,6,7 порта А.
Кнопка же у нас подключена к пину 9, того же порта.

Ну и как же без задачи на занятие.
Требуется при нажатии на кнопку, на индикаторе выводить числа от 0 до F в шеснадцетиричной системе.
по достижении конца последовательности - вывести символы от F до нуля, но уже со включенной точкой.
Если кнопка нажата долее 1 секунды - выводить те же числа, как если бы её нажимали, с чередованием
их с промежутком 1 секунду, до момента отпускания.

Давайте приступать.

Так как у нас кардинально изменился набор компонентов, и задача, создадим новый проект.
Сначала не забываем сохранить наш предыдущий проект на сервер.
После чего - создаём репозиторий.
Дадим ему имя.
SingleDigitDisplay.
gitIgnore.
Создаём.
Клонируем в VSCode.
Далее - запускаем CubeMX.
Выбираем наш микроконтроллер.
Указываем какие выводы для чего задействованы.
PA9 - даём имя Button.
А дальше идем подглядывать в даташит на индикатор, сравнивать с собранной схемой,
и давать выводам соответствующие имена...
Но это я лучше оставлю за кадром.
После этого - обязательно включаем отладку.
и так как у нас задействована кнопка - подтяжку.

На этом - тут всё. Осталось дать проекту имя, выбрать toolchain, и сгенерировать код.

Возвращаемся в VSCode, и импортируем проект.

Проект периодически не до конца импортируется, по этому перезапустим VSCode.

Для начала - напишем простую логику - будем включать все сегменты по очереди, и выключать их.
Что бы проверить корректность подключения.
Подключено конечно всё у нас корректно, но вот логика включения светодиодов
инвертирована. Когда мы подаём высокий уровень на вывод - этот диод гаснет.
Что бы было как в привычной логике необходимо использовать индикатор с маркировкой J в названии.
Но работаем с тем, что имеем. Просто будем в уме держать информацию о том, что необходимо
инвертировать сигналы.

Используя эти знания - выведем цифру два. Для этого нам потребуется зажечь A, B, D, E и G,
и погасить всё остальное.

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

По этому вынесем это всё в отдельные файлы.

создаём заголовочный файл, и файл с кодом.
Добавляем наш c-файл в список файлов для CMake.
в заголовочном файле - напишем типовой шаблон.
Так же добавим заголовочный файл, для работы с типами данных HAL.

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

Далее - прототипы функций.
инициализация.
Вывод символа
управление точкой.

Теперь реализуем наши функции.
Инициалзация.
Опять я забыл передать экземпляр структуры, в которой всё это надо сохранить.

После инициализации портов и пинов - принудительно выключим точку.
Ну и раз мы её уже использовали, реализуем фукнцию управления точкой.

Наступила пора функции вывода символа....
Я буду использовать конструкцию switch - case;

Если переданное число вне диапазона - выключаем все сегменты.

После вывода числа - выводим точку в неизменном состоянии.

Подготовительные работы с индикатором окончены,
в функции main инициализируем дисплей, и сделаем простенький цикл, который
выведет все символя на наш индикатор для проверки.

можно теперь заняться кнопкой.
функции для работы с ней - возьмём из предыдущего нашего проекта.

Для этого скопируем файлы, и пропишем новый файл в список CMake.

На этом все подготовительные действия завершены.
Займемся функцией main.
Добавим заголовочные файлы.

Создадим и инициализируем кнопку и индикатор.

Осталось написать пару циклов и работу с кнопкой.
Для начала - в бесконечном цикле запустим автоматическое обновления состояния кнопки.

Далее - сделаем проверку, если кнопка нажата - изменим значение счетчика.
помимо счетчика, нам потребуется переменная, для хранения направления счета.

И выведем на индикатор полученное значение.

Прошиваем то, что у нас получилось, и проверяем.
Работает не так, как ожидалось. Всё время, что мы держим кнопку - символы на индикаторе меняются.
и делают это так быстро, что создается ощущение как будто они все включены.

Получается нам необходима функция, которая будет при нажатии на кнопку выдавать 1 импульс.
Какой бы длительностью не было нажатие.

Окей. Идём дописывать файл DS_Button.

Сначала - прототип. Функция будет называться DS_ButtonRisingEdge. В дополнение к ней сразу же
объявим прототим fallingEdge.

Немножко доработаем наш switch - case.

и допишем функции возврата.

Теперь в main.c заменим вызов функции DS_ButtonPressed на DS_ButtonRisingEdge

Проверяем. При некоторых нажатиях - видно что цифры перескакивают через свои значения.
Значит не отрабатывает антидребезг, хоть мы его и делали. Идём искать проблему.

Забыли сделать присваивание.

Исправляем, прошиваем, проверяем.

Фух, теперь работает как задумано.
Осталось написать обработчик длительного нажатия на кнопку.

Лучше 5 минут подумать, чем пол часа писать!

Вот и всё,поставленная задача - выполнена.
Спасибо за внимание.