- Родительская категория: Статьи
- Категория: Программирование
- Автор: ARV
- Просмотров: 22503
Библиотечка на Си для работы с HCMS-29xx
Мне сказали, что я остался в прошлом веке, раз мне нравятся такие индикаторы, как на рисунке... Но мне действительно нравятся красивые электронные штуки, и поэтому я немедля приобрел несколько штук, когда их увидел. Кстати, прорекламирую место, где можно недорого ими разжиться - вот в этой теме "на Паяльнике".
Однако, когда я стал искать примеры кода на Си для работы с этими индикаторами, выяснилось, что изобилия тут не наблюдается. В апноутах приведены примеры на ассемблере, да еще и под всякие давно устаревшие платформы, а в более-менее свободном доступе есть только библиотечка поддержки этого индикатора для ардуино.
Так как я не любитель ардуино, зато вполне неплохо чувствую себя в программировании на "голом" Си, я решил написать свою библиотечку, а результаты публикую.
Собственно, исходники с подробными комментариями в приложении - можно скачать. А сейчас предлагаю посмотреть на видео, кратко демонстрирующего достигнутые результаты.
{youtube}6KLeZsydLeg{/youtube}
На видео показаны два эффекта вывода текста, совмещенные с регулировкой яркости индикатора. Ничего особенного.
Ну а теперь кратко о самой библиотечке.
Чтобы все заработало, надо собрать минимально необходимую схему. В качестве основы можно нагуглить любую схему подключения к ардуино, а можно взять из рекомендаций производителя и слегка подкорректировать под себя.
Я применил имеющуюся у меня
Теперь следует открыть файл hcms_297x.h и отредактировать его в соответствии с вашими желаниями и/или намерениями. В этом файле все или почти все делается путем правки определенных макросов.
USE_SPI - макрос, который должен быть определен, если вы вознамерились использовать для работы с
USE_CURSOR - макрос, наличие которого в файле обеспечит вам возможность использования курсора - это если вы хотите реализовать редактор или что-то в этом духе. Курсор, к сожалению, мигать не будет (если хотите - сделайте это сами с использоанием таймера). Если этот макрос определен, то автоматически становится доступным и функция управления позицией курсора на дисплее hcms_cursor_pos, а так же константа NO_CURSOR, передав которую в эту функцию вы сможете убрать курсор с дисплея. Если курсор вам в проекте не нужен - заремарьте макрос USE_CURSOR.
CHIP_CNT - это количество отдельных корпусов индикаторов, задействованных в вашем проекте. Например, в моем проекте (см. видео) задействовано 2 отдельных чипа индикаторов, и этот макрос равен 2. Если у вас иное количество чипов - обязательно задайте правильное их количество!
CHIP_POS - количество позиций на одном чипе индикатора. Выпускаются индикаторы с 4, 8 или 16 знакоместами, соответственно значение этого макроса должно быть задано корректно в соответствии с реально примененными индикаторами. В моём случае это 8.
Макрос FONT_COLS введен для удобства, менять его значение не следует. Он обозначает количество байт знакогенератора, определяющих "рисунок" одного символа. Иначе говоря, это количество столбцов в матрице пикселей одного знакоместа.
SCR_SIZE и CHIP_RAW_SIZE вычисляются автоматически на основе предыдущих макросов и обозначают количество знакомест на всем дисплее (дисплеем я называю все индикаторы в схеме) и размер буфера данных, которые отвечают за изображение на дисплее. Второй макрос можно использовать, если вы захотите рисовать что-то более сложное, нежели текст, на индикаторах. Кстати, в библиотеке ардуино, которая легко нагугливается, применяется массив именно такого размера, в то время как в моей библиотеке под экранную область требуется SCR_SIZE байтов, т.е. в 5 раз меньше.
Теперь переходим к описанию интерфейса связи с микроконтроллером.
ONE_PORT - этот макрос должен быть объявлен, если физически все 5 сигналов управления индикатором заведены на один порт микроконтроллера. Нужно всего лишь указать букву, обозначающую этот порт. Например, для PORTD надо указать D - и всего-то! Если линии управления разбросаны по портам произвольно, макрос ONE_PORT должен быть заремарен. Кстати, при использовании аппаратного SPI этот макрос относится только к трем линиям управления - RS, CE и RESET.
Ниже по тексту файла следуют определения макросов PORT_CE, PORT_RS, PORT_RST, а так же если не используется аппаратный SPI, то еще и PORT_CLK и PORT_DI. Макросы эти должны содержать либо букву порта, к которому подключена соответствующая линия управления, либо отсылку на "единственный" порт - ONE_PORT.
Так же при помощи макросов PIN_CE, PIN_RS, PIN_RST (а без аппаратного SPI еще PIN_CLK и PIN_DI) следует указать номера битов порта, соответствующих каждому сигналу.
То есть реализована возможность совершенно произвольно разместить сигналы по свободным портам микроконтроллера. Для случая применения SPI сигнал CLOCK (CLK) всегда берется с линии CLK аппаратного SPI микроконтроллера, а для синала DATA IN (DI) используется линия MOSI. Указывать номера битов и буквы портов для аппаратного SPI не нужно.
ANIMATE_DELAY_MS - этот макрос задает задержку в миллисекундах, которая используется при реализации анимаии в момент вывода строк на индикатор. Нужен он для функций hcms_rollower_puts и hcms_smooth_rollower_puts - если вы их не применяете, на этот макрос можете наплевать.
Далее вводятся некоторые типы данных, облегчающие работу с индикаторами.
pwm_brightness_t - тип-перечисление, определяющий значения яркости дисплея, которые можно задавать аппаратно. Для удобства дополнительно введены два макроса, обозначающих границы изменения яркости (например, если вы захотите менять ее в цикле): MIN_BRIGHTNESS и MAX_BRIGHTNESS. Макрос DEFAULT_BRIGHTNESS может быть использован для задания яркости, устанавливаемой сразу после инициализации модуля.
peak_current_t - тип-перечисление, определяющий варианты аппаратно задавемого ограничения пикового тока через 1 сегмент индикатора. Аналогично DEFAULT_PEAK_CURRENT задает уровень ограничения пикового тока сразу после инициализации.
ctrl_reg0_t и ctrl_reg1_t - это два "сложных" типа для работы с двумя регистрами управления индикаторов. Типы являются объединениями (union) структуры с битовыми полями и однобайтного значения, что позволяет программисту пользоваться значением регистра, как байтом (как в ардуино), так и значениями отдельных груп битов в этом байте. Назначение полей в структурах вы можете уточнить по даташиту на индикатор (я прилагаю его к статье).
buf_size_t - это тип для хранения размера буффера под "сырые" данные. Он введен с целью максимальной экономии ОЗУ под статические переменные библиотеки. Можно было бы, конечно, всегда использовать int, но тогда для одного индикатора с 8 позициями мы бы напрасно потеряли целый байт ОЗУ...
char hcms_screen[SCR_SIZE] - это массив "экранной области". Все функции вывода в этой библиотеке обязательно используют этот массив. Вы можете обновлять его и при помощи любых иных средств, например, при помощи функций sprintf - тогда после того, как обновите, обязательно вызовите функцию hcms_update_scr - и на индикаторе появится все то, что находится в экранной области.
Осталось рассмотреть функции библиотечки, и можно завершать...
void hcms_clrscr(void) - очищает дисплей и экранную область.
void hcms_cursor_pos(uint8_t pos) - изменяет положение позиции курсора на дисплее. Самая левая позиция соответствует 0.
void hcms_puts(char *s) - вывод строки на дисплей (и в экранную область). Строка выводится всегда с крайней левой позиции дисплея, если она целиком не влезает - остаток отбрасывается, если строка короче, чем дисплей - остальные позиции дисплея очищаются.
void hcms_puts_P(const char *s) то же самое, что и предыущая функция, но строка берется из flash.
void hcms_update_scr(void) - обновление дисплея. Вызывайте эту функцию всегда после того, как изменили содержимое экранной области.
void hcms_bright(pwm_brightness_t br) - изменение яркости индикатора. Просто передайте в эту функцию соответствющее значение из определенного в pwm_brightness_t.
void hcms_peak_current(peak_current_t pc) - изменение уровня ограничения пикового тока через сегмент.
void hcms_on(uint8_t on) - включение или отключение дисплея. Если передать в эту функцию параметр 0, дисплей перейдет в спящий режим.
void hcms_rollower_puts(char *s, int8_t delta)
void hcms_smooth_rollower_puts(char *s, int8_t up) - эти две функции реализуют красивый вывод строки на дисплей. Каждая не просто затирает содержимое экранной области, как hcms_puts, а делает это путем "выталкивания" новым символом старого. На видео вы можете видеть работу именно этой пары: тектовые строки выводятся второй функцией, а смена показаний "одометра" - первой.
void hcms_raw_pixels(uint8_t *buf, buf_size_t sz) - эта функция просто последовательно выведет указанное количесвто байтов из указанного буфера на индикаторы. Что в итоге вы увидите, зависит от того, насколько тщятельно вы изучили даташит и подготовили содержимое массива...
Чтобы собрать свой проект с моей библиотечкой, вы должны добавить hcms_297x.h в модуль, где будете пользоваться функциями из библиотечки, а файл hcms_297x.c добавить в список компилируемых файлов вашего проекта. В папке проекта так же должен находиться и файл font7x5.h. Обратите внимание, что не надо предпринимать какие-то шаги по инициализации аппаратной периферии микроконтроллера, задействованной в библиотечке - настраивать порты, SPI и т.п. Все делается автоматически, просто берите и выводите на индикаторы то, что вам нужно.
Вот и все. Надеюсь, кому-то это пригодится.
P.S. Я не стал изобретать велосипед и просто использовал знакогенератор из нагугленной библиотечки для ардуино. Но небольшие изменения в него я все-таки сделал - несущественные. Если нужно выводить кириллицу, вам придется "нарисовать" знакогенератор русских символов самостоятельно по образу и подобию имеющегося.
P.P.S. В прилагаемом архиве с библиотечкой есть файл avr_helper.h - он подключается к библиотеке, как системный. Я рекомендую пометсить его в "системную" библиотеку куомпилятора.
Комментарии
5+
Заранее спасибо.
напишите на [email protected] подробно, что именно вы желаете заказать
Отправил Вам письмо, заранее спасибо.
Насколько критична данная ошибка и как ее исправить?
надо добавить в начале кода
#include {avr/pgmspace.h }
Это не ошибка, это предупреждение - не страшно, но не хорошо.
Фигурные скобки заменить на "уголки" - вставить их в текст сообщения нельзя.
Выводит символы "???" вместо русских букв
Разобрался сам
Кому интересно:
1.Открываем проект
2. File - Advanced Save Options
3. Вместо кодировки UTF-8 выбираем Cyrillic(Window s) - cp1251
Сохраняем, сохраняем проект - компилируем!
Анимация всплывающего текста красиво работает только когда процессор работает на частоте 1МГц. При большей частоте эффект анимации пролетает так быстро, что его просто не видно.
Возможно ли решить данную проблему?
RSS лента комментариев этой записи