Оставлю свои наработки на сайте. Вдруг потеряются или пригодятся кому.
bootloader
Самозагрузчик для AVR минимального размера, использующий UART. Запускается автоматически при старте программы, если в течении определенного времени по UART ничего не пришло, возвращается в основную программу. Написан на ассемблере.
Используемые константы:
F_CPU - тактовая частота контроллера (Гц)
TIMEOUT_SEC - время до перехода в рабочий режим (сек)
UART_BAUD - скорость UART (бод)
.
pinmacro.h
Набор макросов на Си для удобного назначения и использования портов.
Пример объявления:
#define ANY_PORT C,2
Пример использования:
PORT_0( ANY_PORT ) - установить PORTC2 в лог.0, эквивалентно PORTC &=~(1<<2);
DDR_1( ANY_PORT ) - установить DDRC2 в лог.1, эквивалентно DDRC |= (1<<2);
PIN_1( ANY_PORT ) - возвращает логическое значение, равное уровню на PINC2, эквивалентно (PINC & (1<<2))
PIN_0( ANY_PORT ) - возвращает значение, противоположное уровню на PINC2, эквивалентно (!(PINC & (1<<2)))
И другие.
.
lcd.h
Библиотека на Си для работы с дисплеем на контроллере HD44780 по 4-проводной шине. Требуется набор макросов pinmacro.h. Линии RS и E могут располагаться на любых портах, RW не используется.
Используемые макросы:
#define LCD_DATA С,2 - куда подключены линии данных D4-D8 дисплея. В данном случае, это PC2-PC5
#define LCD_RS B,0 - куда подключена линия RS. В данном случае PB0
#define LCD_E D,3 - куда подключена линия E. В данном случае PD3
#define LCD_NUM_STR 4 - сколько строк поддерживает дисплей. В настоящее время реализованы 2-х и 4-х строчные дисплеи. Этот макрос используется для получения адресов строк LCD_STR_1, LCD_STR_2, LCD_STR_3, LCD_STR_4, их и рекомендуется использовать.
Функции:
lcd_init(); - в комментариях не нуждается
lcd_cur_*(); - установка формы и размера курсора. На выбор 4 варианта:
cd_cur_small(); - нижнее подчеркивание
lcd_cur_large(); - мигающее знакоместо, здоровенный прямоугольник
lcd_cur_two(); - оба вместе
lcd_cur_hide(); - курсор не виден
lcd_goto(unsigned char addr); - позиционирование в нужной точке. Адресация абсолютная, так что для обращения к отдельным строкам придется использовать макросы lcd_goto(LCD_STR_2+8); - 2 строка 8-й символ.
lcd_enable() / lcd_disable(); - перевод линий, используемых дисплеем в рабочее / нерабочее состояние, на случай, если на них висит что-нибудь еще.
lcd_str(const char *ch) / lcd_str_P(const char *ch); - вывод строки (стандарта Си, то есть заканчивающейся \0), из ОЗУ или из flash. Названия
сделаны по шаблону strcmp / strcmp_P и подобных стандартных библиотек.
lcd_data(char data) - посылка байта данных. Осторожно! устанавливает бит RS в лог.1
Полусистемные макросы и функции. Для штатного использования они не предназначены, но, учитывая, что библиотека писалась под себя, что-то мог забыть. Например, запись собственных символов в память, или последовательность команд, которые не надо разделять постоянной установкой бита RS. Однако, при их использовании стоит соблюдать осторожность и, желательно, просмотреть исходный код и предупреждения.
lcd_send(unsigned char data); - посылка байта в дисплей. Биты RS и E, как и настрокйи порта (DDR) не меняются
lcd_cmd(char cmd); - посылка команды. Обычно не нужна, так как написаны более специализированные макросы, вроде lcd_goto или lcd_cur_* Осторожно! Устанавливает RS в лог.0.
bootloader.tar.gz
pinmacro.tar.gz
lcd.tar.gz