Примечание. Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с полным исходным кодом к проекту.
Как вы знаете, предшествующая версия программной библиотеки компилятора AVR-GCC, предназначеная для работы с символьными ЖК индикаторами в 4- и 8-битном режиме, прекрасно зарекомендовала себя в работе. Однако, она имеет некоторые ограничения, которые для некоторых пользователей могут стать причиной отказа от работы с библиотекой. Одно из них – ЖК индикатор должен быть подключен к одному порту микроконтроллера. Например, в 8-битном режиме выводы индикатора LCD_D0…LCD_D7 должны быть байт-синхронизированы и подключены, скажем, к линиям PORTB микроконтроллера. Такая же ситуация и при 4-битном режиме: выводы данных ЖК индикатора должны быть подключены к одному порту микроконтроллера, биты 4, 5, 6 и 7. Для двух режимов управления, сигналы управления RS, RW, E должны быть подключены также к одному порту.
И так работают большинство других программных библиотек, которые можно найти в Интернет. В реальности все может немного по другому. Каждая линия вода/вывода микроконтроллера имеет, как минимум, несколько альтернативных функций (каналы АЦП, внешние прерывания, линии шины I2C, линии UART), и если в проекте используется одна из них или несколько, и требуется использование ЖК индикатора, стандартная библиотека работать не будет, и вы не сможете получить доступ ко всем линиям порта, к которому подключен ЖК индикатор. Вы должны будете использовать те линии ввода/вывода, которые остались свободными.
Для такого случая и была модифицирована библиотека. Она не переписывалась с нуля, была лишь изменена ее функциональность. Принципы работы в 8- и 4-битном режиме при стандартном подключении индикатора не изменились, но были добавлены два режима работы: 8-битный режим при использовании разных портов микроконтроллера и 4-битный режим при использовании разных портов микроконтроллера. Эти режимы позволят управлять ЖК индикатором при наличии любых свободных выводов микроконтроллера.
Конфигурирование библиотеки для 4-битного режима
Давайте посмотрим, что необходимо выполнить для начала использования этих возможностей. Рассмотрим на простом примере при использовании разных выводов разных портов микроконтроллера.
Как видно из схемы, выводы индикатора подключены к микроконтроллеру Atmel AVR ATmega328P в следующем порядке:
RS → PB5
RW → PD1
E → PD2
D4 → PD4
D5 → PC2
D6 → PD6
D7 → PB0
Таким образом мы получаем, что сигналы данных и управления берутся от разных портов микроконтроллера и не являются байт-синхронизированными. Прежде всего, нам необходимо отредактировать назначение выводов в заголовочном файле lcd_lib.h, а перед этим исключить из комментариев одну из строк, которая определяет какой режим работы выбран:
//используется 4-битный режмим работы ЖК индикатора (при стандартном подключении индикатора к МК)
//#define LCD_4BIT
//используется 8-битный режмим работы ЖК индикатора (при стандартном подключении индикатора к МК)
//#define LCD_8BIT //используется 4-битный режмим работы ЖК индикатора (при использовании разных выводов МК)
#define LCD_4BIT_M
//используется 8-битный режмим работы ЖК индикатора (при использовании разных выводов МК)
//#define LCD_8BIT_M
В нашем случае мы работаем в 4-битном режиме со смешанными выводами. Нам необходимо связать выводы индикатора в выводами порта микроконтроллера. Если сигнал управления индикатора RS подключен к порту PB5, то мы напишем 5:
#define LCD_RS 5 //вывод порта МК 5 подключен к LCD RS
#define LCD_RW 1 //вывод порта МК 1 подключен к LCD R/W
#define LCD_E 2 //вывод порта МК 2 подключен к LCD E
#define LCD_D0 0 //вывод порта МК 0 подключен к LCD D0
#define LCD_D1 1 //вывод порта МК 1 подключен к LCD D1
#define LCD_D2 2 //вывод порта МК 2 подключен к LCD D2
#define LCD_D3 3 //вывод порта МК 3 подключен к LCD D3
#define LCD_D4 4 //вывод порта МК 4 подключен к LCD D4
#define LCD_D5 2 //вывод порта МК 2 подключен к LCD D5
#define LCD_D6 6 //вывод порта МК 6 подключен к LCD D6
#define LCD_D7 0 //вывод порта МК 0 подключен к LCD D7
И теперь мы должны определить порт и регистр направления данных для каждого вывода микроконтроллера. Так как выводы индикатора могут быть подключены к разным портам, нам нужно работать с индивидуальными выводами. Редактируем следующую часть:
#ifdef LCD_4BIT_M || LCD_8BIT_M //8-битный или 4-битный режим работы (при использовании разных выводов МК)
#define LDPRS PORTB //назначаем порт для сигнала RS
#define LDDRS DDRB
#define LDPRW PORTD //назначаем порт для сигнала RW
#define LDDRW DDRD
#define LDPE PORTD //назначаем порт для сигнала E
#define LDDE DDRD
#define LDPD0 PORTD //назначаем порт для сигнала D0
#define LDDD0 DDRD
#define LDPD1 PORTD //назначаем порт для сигнала D1
#define LDDD1 DDRD
#define LDPD2 PORTD //назначаем порт для сигнала D2
#define LDDD2 DDRD
#define LDPD3 PORTD //назначаем порт для сигнала D3
#define LDDD3 DDRD
#define LDPD4 PORTD //назначаем порт для сигнала D4
#define LDDD4 DDRD
#define LDPD5 PORTC //назначаем порт для сигнала D5
#define LDDD5 DDRC
#define LDPD6 PORTD //назначаем порт для сигнала D6
#define LDDD6 DDRD
#define LDPD7 PORTB //назначаем порт для сигнала D7
#define LDDD7 DDRB
#endif
Часть 2 – Настройка библиотеки при 8-битном режиме работы