STM8 и LCD на основе HD44780

Выходные прошли, а так как хобби выходных не признает, написал я небольшую интерфейсную либу для STM8 (а конкретнее под STM8S-Discovery, но думаю будет работать где угодно).
Для вывода на LCD достаточно трех строчек :)

#include "HD44780.h"
....
InitLcd(GPIOB, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_LNIB);

Out(0, "DareDen&STM8 for");
Out(1, "easyelectronics.");

и получается вот такая красота:

Первая строка — инициализация порта (используется 6 бит, остальные 2 корректно не трогаются), единственное ограничение — дата-линии должны быть либо в младшем, либо в старшем ниббле (ну или по-посконному, по-латыни, тетраде :)).
Далее выводим функцией Out. Для очистки экрана есть ClearLcd.

Наткнулся на одну непонятку: Cosmic не дает сделать extern функцию без аргументов — кто знает, WTF?
Функцию надо объявлять так:

extern void foo(void);
— void в скобках обязателен.

Исходники (Cosmic)

Исходники можете использовать как угодно, при условии вспоминания меня хорошим и добрым словом ;).
PS. При использовании надо подключать StdPeriphLib, соответственно в настройках проекта определены дефайны: STM8S105 F_CPU=16000000. При использовании другого контроллера или частоты не забывайте их корректировать.

Комментарии (43)

RSS свернуть / развернуть
Подскажите пожалуйсто.
Для IAR и stm8l подойдет? И схему подключения не подскажите где подглядеть.
0
Для IAR не подойдет, ИМХО. У них своя библиотека для STM8. Но если использовать только StdPeriphLib, то может и будет собираться. Схема подключения — в хидере :). Аргументы названы как пины дисплея.
Насчет STM8L самому было бы интересно узнать :). Если удастся проверить, отпишитесь, плиз.
0
Сори за оффтоп, но в IAR завелось с полпинка
0
С космиком не сталкивался, но возможно он хочет объявления функции явно без параметров
extern void foo (void);
Да или вообще без extern.
0
  • avatar
  • amx
  • 07 октября 2011, 11:11
Да, именно так. Void в скобках оказался обязательным, что кажется странным, после стольких лет и компиляторов :).
0
Это же Си :) Если вы явно не указали параметров, значит можно подсовывать что угодно. Что не есть хорошо, так как можно долго удивляться при дебаге. Ради исключения таких моментов видимо и настаивают на явном определении.
0
Залез в стандарт. Вот в чем дело:
An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
То есть в extern действительно надо писать void в данном случае. Интересно, почему другие компиляторы не обращают внимания на это утверждение? (С99 $6.7.5.3 14)
0
Ну так всё правильно у всех кроме космика, который оказался слишком привередливым. В отдельно стоящем объявлении функции можно не указывать список параметров, что и написано в стандарте.
0
На задней части сбоку дисплеев типа HD44780 есть пара контактных площадок:





Обычно подписывается A и К (катод и анод) это же подсветка?
И как и ее запитывать? Не нашел где пишут про нее.
0
Да, она. Обычно они или выведены на линейку основных контактов (как у дисплеев на фото), либо имеется возможность подключить к питанию дисплея через резистор (под него предусмотрено место).
Запитка зависит от схемы подсветки на дисплее. Обычно там светодиодния сборка и питать нужно через резистор.
0
а я свою напишу, сначала в гугле помучаюсь с переводом даташита на стм8, потом ещё с компилятором в отладчике, ух… руку набью… так сказать.
0
Первая строка — инициализация порта (используется 6 бит, остальные 2 корректно не трогаются)
всё никак не догоню про «6бит» — как ни считаю: 7 линий получается (для 4х битной шины LCD)
0
  • avatar
  • Doka
  • 14 ноября 2011, 15:06
Без линии RW можно обойтись.
0
Неплохо бы если эала либа поддерживала опцию 4-х проводного интерфейса.
14 проводков распиновать еще, но и не всегда свободных аж 11 IO имеются.
0
IAR для STM8 как и для всего другого — (мое мнение) УЖАСЕН )
Там нет ничего.
Ни какой информации о регистрах, авто-дополнения…
0
автодополнение там есть — стандартный ctrl+space.
инфа о регистрах какого плана? пруф дайте.
0
автодополнение там есть — стандартный ctrl+space.
Только глючит оно наверное — подсказывает что нипоподя.
0
А как подключать-то? RS и E я понял, а что есть LNIB — нефкурил :(
У меня стм8л-дискаверя. Проект собирается нормально.
0
а что есть LNIB — нефкурил :(
L_NIBBLE. D4-D7.
0
Не совсем то. То, что это пины дисплея — догадался. А куда подключаются на стм.е?
0
единственное ограничение — дата-линии должны быть либо в младшем, либо в старшем ниббле
Соответственно, для LNIB — пины PORT0..PORT3.
0
Спасибо
0
стм перехвалили сильно
-1
Разверни мысль.
0
Часто можно встретить замечание «STM круче Atmega в стотыщмильеновраз!». Я вот смотрю и на атмелы и на стм как юзверь на венду и вижу как атмега — венда, а линукс — стм. Вроде все умеет, очень крутое, быстрое и прочая, но документация только на английском и только для уже прошаренных. Для юзверей, пытающихся постигнуть платформу, информация «околотемная» — т.е. у меня стм8л, но статьи читаю про стм32, ибо про первый крайне мало примеров.
При всем при этом ещё и среда. Не углубляясь в детали — проводник и терминал. Кто чей думаю понятно. Для атмелов всяких разных сотня, ибо компилятор один практически. А для стм — темный дремучий лицензионный лес.
Я сравниваю не конкретно атмел с атмегами и стм. Тоже самое можно сказать и про микрочиповские пики и (забыл как зовутся — что-то типа stc чтоли) прочих популярных.
Порог вхождения для стм очень высок. Программировать надо уметь не на уровне «я знаю if...then...else», а на уровне «О! Асм дорогой! Язык детства!».
Т.е. в данном конкретном случае, я хотел оттолкнуться от чего-то достаточно знакомого — дисплея hd44780 — но даже не смог собрать прошивку (как оказалось она не собиралась! просто чисто в логах и все). То либа не та, то не там, то ещё что.
Пока держу первые стм в руках — разочаровываюсь страшно. (с пиками было похоже, а с атмелами наоборот — сначала счастье, а потом озарение насколько же они слабы).
Вроде вменяемо изложил.
0
Часто можно встретить замечание «STM круче Atmega в стотыщмильеновраз!»
Это было про STM32. А там есть и среды, и инфа на русском, и доступные (в том числе самосборные) отладчики. STM8 же известен как «атмега за 10р». Да, с тулзами все грустно (в опенсорсе что-то делается, но пока что вроде не слишком юзабельно), как и у пиков — все нужно переть и ломать. В плане инфы — лично я предпочитаю англоязычную документацию.
А вообще, разница между разными МК не так уж велика. Вкурил первый — остальные пойдут куда как проще. За первый, притом, вполне пойдет и не МК, а ПК.
Программировать надо уметь не на уровне «я знаю if...then...else», а на уровне «О! Асм дорогой! Язык детства!».
Напротив, асм — это очень просто. Вот С — сложен, нужны достаточно обширные познания, чтобы разбираться, что пошло не так. Но и на AVR спасает разве что большее количество готовых проектов, которые можно взять за основу, знаний язык там требует ни разу не меньше (если, конечно, использовать GCC, а не нечто вроде микропаскаля).
0
Когда кричат — не уточняют 8 или 32. Для меня С с библиотечками намного проще битовых маневров АСМа :)
0
Видимо, ты просто еще не знаешь С в достаточной степени)
А в асме ничего сложного. Примитивный только очень, поэтому писанины много. Зато осваивается за день.
+1
Я когда-то пытался его выучить и это многое дало мне в плане общих знаний. Но все эти биты, регистры, адреса — процентов так на 70 так и остались для меня темным лесом.
0
Если я правильно понял о чем ты, то в С оно играет такую же роль.
0
При всем при этом ещё и среда.
Сред и для мег и для stm32 — море.
Для атмелов всяких разных сотня, ибо компилятор один практически.
Как один компилятор? Для AVR есть GCC, IAR, Imagecraft, CodeVision и ещё несколько.
Для STM32 (Cortex-M) всё тоже самое — IAR, Keil, GCC, Tasking, Imagecraft и другие.
Для атмелов всяких разных сотня
И почему «атмел»? Atmel делает контроллеры на разных ядрах — x51, AVR, AVR32, ARM7,ARM9, Cortex-M, Cortex-A.
0
Не придирайтесь к словам. Во-первых в контексте данной статьи я имел ввиду именно стм8. Про компилятор уточняю — самое популярное и оно же бесплатное. И в контексте моего комментария видно, что я имею ввиду именно атмегу типа авр, а не атмел в целом.
И вообще, моё возмущение вызвано тем фактом, что код какого-то дисплея я не могу собрать уже неделю, в то время как для тиньки2313 в коде на баскоме уже рулетку написал ;)
0
Ну в том, что не собирается виноваты совсем не контроллеры ведь, разве нет? =)
0
Не, то, что не собирается виновно только в том, что я высказался :)
0
Понятно желание приспособить HD44780 для управления контроллером не имеющим интерфейса для этого. Те контроллеры которые для этого приспособлены, т.е. имеющие интерфейс внешней памяти, не требуют таких ухищрений. Да и размер кода меньше получается. А так хай буде…
0
Таки задам ещё один вопрос. Выскакивает вот такая ошибка линкера
Running Linker
clnk -lY:\st\cosmic\4313\Lib -lY:\st\lcdsources -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\inc -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\src -o Debug\lcdtest.sm8 -mDebug\lcdtest.map Debug\lcdtest.lkf
#error clnk Debug\lcdtest.lkf:1 symbol _GPIO_ReadOutputData not defined (Debug\hd44780.o )
#error clnk Debug\lcdtest.lkf:1 symbol _GPIO_Write not defined (Debug\hd44780.o )
#error clnk Debug\lcdtest.lkf:1 symbol _GPIO_DeInit not defined (Debug\hd44780.o )
#error clnk Debug\lcdtest.lkf:1 symbol _GPIO_Init not defined (Debug\hd44780.o )
The command: «clnk -lY:\st\cosmic\4313\Lib -lY:\st\lcdsources -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\inc -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\src -o Debug\lcdtest.sm8 -mDebug\lcdtest.map Debug\lcdtest.lkf » has failed, the returned value is: 1
exit code=1.
Я вроде добавил в hd44780.c #include «stm8l15x_gpio.h», в котором есть эти write,init,deinit, но оно все равно не линукется. Подскажите, пожалуйста, почему.
И с наступающим, вроде как :)
0
Да-да, вот и все твое знание С. Все же, если тебе не кажется, что ассемблер — это примитивно и очевидно, то на С тебе писать рановато.
#include не подключает библиотеку. Это не ява. И не дельфи. Это С. Почитай.
0
Ну я не говорил что я программист на любом языке ;)
Да и это. Если я правильно въехал, то вот эта часть «clnk -lY:\st\cosmic\4313\Lib -lY:\st\lcdsources -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\inc -lY:\st\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Libraries\STM8L15x_StdPeriph_Driver\src -o Debug\lcdtest.sm8 -mDebug\lcdtest.map Debug\lcdtest.lkf » должна какбэ дело поправлять, ибо файлик лежит там. Не? А про всякие uses… я так и не нагуглил ничего.
0
Выделенное — это пути поиска. Линкует он по скрипту — .lkf. Полагаю, у тебя STVD и проект под нее — тогда скрипт генерируется средой. Так вот, в скрипте должны быть указаны все объектные файлы и библиотеки, из которых линкуется бинарник, и с #include это не связано вообще никак, абсолютно. В том случае, если ты используешь среду — нужно добавить требуемые .c файлы в проект.
И еще раз почитай статью по ссылке. До просветления.
0
Ну, судя по сообщениям компилятора, с инклюдами StdPeriphLib ты уже разобрался и HD44780.c в проект включил. Осталось только включить таким же макаром в проект файл stm8s_gpio.c из состава SPL и все должно собраться.
0
Да включил я его вроде. Вот так. Причем изначально.
0
Еще раз: не путай включение хедера и исходника. Более того, включать хедер stm8s_gpio.h в main.c совершенно не нужно.
Все инклюды обрабатывает компилятор. У тебя же ругается линкер, значит все успешно скомпилировалось и все нужные инклюды включены. Осталось указать линкеру, из каких файлов собирать бинарник. В твоем случае это делается добавлением .c файла в проект.
0
Спасибо. Про.с я вообще забыл. Собрал наконец-то. Правда все равно ничего не заработало ;)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.