Драйвер дисплея

Драйвера max7219 не достаточно, чтобы отображать нужные нам данные, он лишь предоставляет нам API микросхемы, абстрагирует нас от понятия SPI, когда и какую ножку нужно выставлять в высокий уровень и т.д. Напишем теперь драйвер дисплея display.c / display.h.

Давайте условимся, что то что отображается на дисплее и то, что мы храним в памяти МК не всегда совпадает. Оно и правильно: сначала записываем в буфер всё новое состояние дисплея, а уже после этого отправляем данные на него. То есть кроме понятных нам функций display_int() и display_set_brightness() потребуется функция обновления показаний дисплея display_update(). Все остальные функции должны работать с буфером.

Нам безусловно понадобиться функция очистки, display_clear(), а так же отрисовки некоторых примитивов: точки, чисел, линий, прямоугольников. Составим API.

Здесь нужно обратить внимание на то, как данные хранятся и как они передаются.

Т.е. для буфера нам потребуется создать массив из uint8_t элементов.

Из файла main.c модуль max7219.c/.h виден не будет, следовательно работать с микросхемой мы должны напрямую из драйвера дисплея.

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

Если вдруг нам потребуется сделать обратную операцию очистки, то придётся воспользоваться функцией заполнения.

Частный случай закрасить экран полностью — нарисовать прямоугольник во весь размер экрана. Не зачем дублировать функционал. Более того, частный случай прямоугольника в нашем случае, это линия.

Точка так же является частным случаем прямоугольника.

Таким образом большинство функций зависит только от одной единственной, display_draw_rect(). Составим её.

Так как отрисовка происходит по столбикам, то нам нужно вычислить маску (mask), в которой по сути просто стоят 1 на нужных нам позициях. Нужно зажечь первый светодиод в столбике? Записываем 1. Нужно зажечь третий? Просто смещаем на 2 позиции 1 и получаем 8.

Для отображения чисел, однако, нам потребуется отдельная функция. По сути, нам нужно создать массив из трёх значений для каждой цифры (от 0 до 9).

Попробуйте самостоятельно найти значения для остальных чисел (3, 4, 5, 6, 7, 8, 9).

Составим функцию отображении цифр.

Добавим функцию отображения времени.

И вызовим её:

Что же касается функции display_animation_intro() — оставьте её пустой или закомментируйте её вызов в функции инициализации. Вернитесь к ней после следующей главы. К слову, какую анимацию сделать — дело ваше, в стоковой прошивке это зажигание светодиодов матриц по спирали. Попробуйте реализовать данный алгоритм самостоятельно, а если не получится подсмотрите решение на Rosetta Code — Spiral matrix.

Код можно найти на GitHub: CMSIS.


Назад | Оглавление | Дальше