Накопилось понемногу информации на разные темы. Дисплейчики, расширители портов и git. Решил свалить все в одну большую кучу.
Дошли наконец руки и до прикручивания символьного дисплея через I2C. На самом деле все оказалось слишком просто. Конкретно свой дисплейчик я брал на али, выглядит довольно симпатично.
По сути это тот же hd44780 клон, но сверху к нему припаивается отдельная платка с i2c расширителем портов на базе микросхемы PCF8574.
В начале мне очень понравилась эта микросхема, она очень дешевая и их можно вешать по нескольку на одну шину. Ну подумал я теперь заживем. На деле она сильно огорчила меня. Дело в том, что при логической единице на ножке ток, который можно снять с нее всего 300мкА, да да никакой опечатки микроампер. Даже светодиод не зажечь. Однако по низкому уровню допустим ток 25мА. В общем сфера применений данной микросхемы ограничена.
Тем не менее с поставленной задачей она справляется. Работать с ней мегапросто. Задаем адрес подтяжками ноги
Т.е. если притянуть A0-A2 к земле, то адрес будет 0x3F. Стоит отметить, чтобы бывают PCF8574 и PCF8574A, адреса у них отличаются. Далее кидаем на шину адрес и 8битное значение которое нужно установить на ножках, т.е. нулевой бит = нулевая ножка порта и т.п. В общем то и все.
Что же касается подключения дисплея, 0-3 ноги E, RW, RS, далее 4 ноги для подключения 4битной шины и еще одна нога на подсветку. Итого все 8 ног забиты.
Следующая часть, это пара слов о библиотеке. Взбрела мне идея написать свою библиотеку для символьного дисплея hd44780, причем такую, чтобы можно было юзать на любый устройствах, без переделок и на stm32, и на raspberryPi и на любом другом устройстве. За основу взял либу из кокосовской статьи, ибо она работала со всеми дисплеями, что у меня были.
Итак, немного подробнее. От платформозависимых вещей никуда не денешься, обычно на микроконтроллерах это решают либо дефайнами, либо хардкодом, под конкретную платформу. Однако я решил сделать это так, как делают в линуксовых драйверах.
Сразу приведу пример как это реализовано в данной либе. Внутри самой либы, среди прочих используются функции hd44780_delay_us, hd44780_delay_ms и hd44780_write_pin они зависят от периферии, ноги у всех разные и работу задержек можно по разному реализовать, поэтому чтобы связать их именно вашими функциями delay_us, delay_ms, gpio_set_value_remote, внутри определена структура.
struct hd44780_operations hd44780_ops = { .hd44780_delay_us = delay_us, .hd44780_delay_ms = delay_ms, .hd44780_write_pin = gpio_set_value_remote }; |
т.е. вам нужно передать указатели на функции используемые именно для вашей платформы. С задержками вроде все понятно, ибо они везде одинаково используются, с установкой пина чуток сложнее, но тоже в принципе просто. Добавляете свою функцию установки пина. Например у меня установка пина производилась через i2c функции работы с PCF8574.
void gpio_set_value_remote(uint16_t pin, uint8_t value) { switch (pin) { case HD44780_EN_PIN: i2c_write_pin(2, value); break; case HD44780_RS_PIN: i2c_write_pin(0, value); break; case HD44780_RW_PIN: i2c_write_pin(1, value); break; case HD44780_D4_PIN: i2c_write_pin(4, value); break; case HD44780_D5_PIN: i2c_write_pin(5, value); break; case HD44780_D6_PIN: i2c_write_pin(6, value); break; case HD44780_D7_PIN: i2c_write_pin(7, value); break; default: break; } } |
Если вы используете микроконтроллер и дисплей висит на одном порту, то обертка может оказаться какой то такой, например
void gpio_set_value(uint16_t pin, uint8_t value) { GPIO_Write(GPIOA, pin, value); } |
Далее нужно проинициализировать дисплей передав ему созданную структуру.
hd44780_init(&hd44780_ops); |
В общем чудес не бывает, решение все равно не элегантное, но надеюсь кому то это поможет в понимании того, как сделать либу платформонезависимой.
Что касается остальных функций, они все есть в хедере, я старался называть их так, как они были в CAVR. Всякие ништяки с кастомными символами и т.п. не добавлял, возможно потом добавлю.
void hd44780_gotoxy(uint8_t pos_x, uint8_t pos_y); //переместить курсор void hd44780_clear(void); //очистить экран void hd44780_putchar(uint8_t ascii_symb); //вывести символ void hd44780_puts(const uint8_t *ascii_string); //вывести строку void hd44780_cursor(uint8_t cur_state); //показать/скрыть курсор |
Забрать либину можно с GITHUB
И напоследок, пару слов о git. На самом деле, попытки его юзать в домашних целях были уже давно, но как то не прижилось. Однако, в последнее время я таки оценил удобство и начал активнее юзать, да и то только малую часть возможностей, поэтому для таких же ленивых, основные команды и информация. Для тех кто не в теме, утрированно говоря, эта хрень позволит вам не только скачать исходники, но и даже внести в них изменения, а также видеть историю изменений в проекте. И это будут видеть все, если проект расшаренный.
Для работы вам понадобится клиент GIT, он есть и под винду, и под linux. Это консольная утилита. Кроме того, есть всякие оболочки, которые упрощают работу. На самом деле консоли в большинстве случаев достаточно, ибо основных операций не так много. Однако, для ленивых могу посоветовать черепашку TortoiseGit, там все делается через гуй и команды не нужны.
Для консольщиков. Перед началом работы понадобится задать имя и мыло
git config user.name "Name"
git config user.email "123@mail.com"
Посмотреть текущие настройки можно
git config --list
Ну и основное. Ищите нужный проект и копируете репку. Например библиотека для дисплея описанного выше.
git clone https://github.com/avrstart/hd44780
Теперь все исходники целиком и полностью на вашем компе. Допустим вы захотите добавить новый файл. Копируете его в папку с репкой и добавляете в проект.
git add pcа8574.c
Или добавить папку
git add example/*
Дальше добавляете новый комит, т.е. вы добавляете новую версию библиотеки, в кавычках пишете комментарий.
git commit -m "added example"
Но пока что эта версия будет только у вас на компе, чтобы ее увидели все, закидываем ее обратно на github репозиторий.
git push origin master
Остальные ништяки можно раскурить по мере необходимости. Если подвести итог, то подключить дисплей можно через любой port expander и сложного в этом ничего нет. Библиотеку можно сделать универсальной, но не всегда решение будет красивым и работающим быстро. Gitом пользоваться можно и нужно, ничего сложно в этом нет. Надеюсь это вам поможет в ваших начинаниях.
Добавить комментарий