AVR библиотека для LCD с произвольным подключением выводов

Введение

   Некоторое время назад я написал макросы для реализации виртуальных портов. С помощью этих макросов можно переделать практически любую библиотеку для работы с произвольными выводами микроконтроллера. Первая библиотека, которая попала под это изменение, стала библиотека для символьного LCD. В этом посте я расскажу, как ее применить в своем проекте. 

Особенности

- работает с компиляторами IAR AVR, CodeVision AVR, GNU GCC,
- поддерживает lcd контроллеры HD44780 и KS0066,
- поддерживает подключение lcd к произвольным выводом микроконтроллера,
- поддерживает 4-х и 8-ми разрядный интерфейс,
- имеет функции вывода строк из ОЗУ и флэш,
- имеет функции добавление пользовательских символов.

Состав библиотеки

compilers_4.h - файл для поддержки трех компиляторов
port_macros.h - макросы виртуальных портов
lcd_lib_2.h - заголовочный файл LCD библиотеки с прототипами функций и настройками
lcd_lib_2.c - файл реализации функций LCD библиотеки

Подключение к проекту

1. Переписываем все файлы библиотеки в папку проекта.
2. Подключаем lcd_lib_2.c к проекту внутри среды разработки.
3. Инклюдим заголовочный файл lcd_lib_2.h к сишному файлу, в котором будут использоваться lcd функции.
4. Настраиваем конфигурацию lcd библиотеки в заголовочном файле lcd_lib_2.h
5. Прописываем в код вызов функций lcd библиотеки.

Настройка конфигурации

   Настройка конфигурации в файле lcd_lib_2.h включает в себя следующие шаги.

   1. Настройка виртуального или реального порта, к которому подключается LCD

   Синтаксис объявления виртуального порта подробно описан в файле port_macros.h и в статье посвященной виртуальным портам. В заголовочном файле lcd_lib_2.h уже объявлен порт, в этих объявления нужно менять только буквы порта (A, B, C..), номера выводов (0, 1, 2, 3 ...), тип порта (_REAL, _VIRT), активный уровень (_HI, _NONE). Все остальное (имя порта и имена выводов) трогать не надо. 

Пример объявление виртуального порта для 8-ми битной шины и реального порта для 4-х битной шины.

   Рамками выделены те части кода, которые нужно настраивать под свой проект. 


   2. Глобальные настройки драйвера

LCD_CHECK_FL_BF - проверять флаг BF или использовать программную задержку. 0 - задержка, 1 - проверка флага.

LCD_BUS_4_8_BIT - используемая шина данных. 0 - 4 разрядная шина, 1 - 8-ми разрядная

   3. Настройка инициализации дисплея

Эти настройки определяют состояние дисплей после вызова функции LCD_Init().

LCD_ONE_TWO_LINE - количество отображаемых строк. 0 - 1 строка; 1 - 2 строки.

LCD_FONT58_FONT511 - тип шрифта. 0 - 5х8 точек; 1 - 5х11 точек.

LCD_DEC_INC_DDRAM - изменения адреса ОЗУ при выводе на дисплей. 0 - курсор движется влево, адрес уменьшается на 1 (текст получается задом наперед) ; 1 - курсор движется вправо, адрес увеличивается на 1.

LCD_SHIFT_RIGHT_LEFT - сдвиг всего дисплея. 0 - при чтении ОЗУ сдвиг не выполняется, 1 - при записи в ОЗУ сдвиг дисплея выполняется согласно установке LCD_DEC_INC_DDRAM (0 - сдвиг вправо, 1 - сдвиг влево)

LCD_DISPLAY_OFF_ON - включение / выключение дисплея. 0 - дисплей выключен, но данные в ОЗУ остаются; 1 - дисплей включен.

LCD_CURSOR_OFF_ON - отображение подчеркивающего курсора. 0 - курсор не отображается, 1 - курсор отображается.

LCD_CURSOR_BLINK_OFF_ON - отображение мигающего курсора. 0 - мигающий курсор не отображается; 1 - мигающий курсор отображается.

LCD_CURSOR_DISPLAY_SHIFT - команда сдвига вправо/влево курсора или дисплея без записи на дисплей. В библиотеке не используется и ни на что не влияет. Затесалась сюда случайно )

Пользовательские макросы и функции

LCD_Clear() - очистка дисплея.
LCD_ReturnHome() - возврат курсора в начальное положение.
LCD_Goto(x, y) - позиционирование курсора. x - номер знакоместа, y - номер строки.
void LCD_Init(void) - инициализация дисплея.
void LCD_WriteCom(uint8_t data) - запись команды 
void LCD_WriteData(char data) - вывод одного символа
void LCD_SendStr(char *str) - вывод строки из ОЗУ.
void LCD_SendStrFl(char __flash *str) - вывод строки из флэш памяти.
void LCD_SetUserChar(uint8_t __flash *sym, uint8_t adr) - загрузка пользовательского символа в ОЗУ дисплея. 

Пример использования:

char textCompiler[] = "xz ";
__flash uint8_t quarterNote[] = {4,4,4,4,4,4,28,28}; 

int main( void )
{ 
 //инициализируем дисплей
 LCD_Init();
 //загружаем пользовательский символ в нулевую ячейку ОЗУ дисплея
 LCD_SetUserChar(quarterNote, 0); 
 //устанавливаем курсор в 8-мое знакоместо
 LCD_Goto(8,0);
 //выводим строку на дисплей
 LCD_SendStr(textCompiler);
 while(1);
 return 1;
}

Файлы

LCD_VP_iar.rar  -  тестовый проект для IAR AVR
LCD_VP_as6.rar - тестовый проект для AtmelStudio
LCD_VP_cv.rar - тестовый проект для CodeVision AVR
LCD_VP_winavr.rar - тестовый проект для WinAvr
LCD_VP_proteus.rar - тестовый проект для Proteus
lcd_lib_2.rar  - lcd библиотека с произвольным подключением выводов

У вас недостаточно прав для комментирования.