HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL

Библиотека AVR GCC для управления ЖК индикатором - использование различных выводов микроконтроллера. Часть 1

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

Как вы знаете, предшествующая версия программной библиотеки компилятора AVR-GCC, предназначеная для работы с символьными ЖК индикаторами в 4- и 8-битном режиме, прекрасно зарекомендовала себя в работе. Однако, она имеет некоторые ограничения, которые для некоторых пользователей могут стать причиной отказа от работы с библиотекой. Одно из них – ЖК индикатор должен быть подключен к одному порту микроконтроллера. Например, в 8-битном режиме выводы индикатора LCD_D0…LCD_D7 должны быть байт-синхронизированы и подключены, скажем, к линиям PORTB микроконтроллера. Такая же ситуация и при 4-битном режиме: выводы данных ЖК индикатора должны быть подключены к одному порту микроконтроллера, биты 4, 5, 6 и 7. Для двух режимов управления, сигналы управления RS, RW, E должны быть подключены также к одному порту.

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Однострочный индикатор LM016L, схематическое изображение

И так работают большинство других программных библиотек, которые можно найти в Интернет. В реальности все может немного по другому. Каждая линия вода/вывода микроконтроллера имеет, как минимум, несколько альтернативных функций (каналы АЦП, внешние прерывания, линии шины I2C, линии UART), и если в проекте используется одна из них или несколько, и требуется использование ЖК индикатора, стандартная библиотека работать не будет, и вы не сможете получить доступ ко всем линиям порта, к которому подключен ЖК индикатор. Вы должны будете использовать те линии ввода/вывода, которые остались свободными.

Для такого случая и была модифицирована библиотека. Она не переписывалась с нуля, была лишь изменена ее функциональность. Принципы работы в 8- и 4-битном режиме при стандартном подключении индикатора не изменились, но были добавлены два режима работы: 8-битный режим при использовании разных портов микроконтроллера и 4-битный режим при использовании разных портов микроконтроллера. Эти режимы позволят управлять ЖК индикатором при наличии любых свободных выводов микроконтроллера.

Конфигурирование библиотеки для 4-битного режима

Давайте посмотрим, что необходимо выполнить для начала использования этих возможностей. Рассмотрим на простом примере при использовании разных выводов разных портов микроконтроллера.

AVR-GCC LCD library – mixed pin support

Как видно из схемы, выводы индикатора подключены к микроконтроллеру 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-битном режиме работы

Перевод: Vadim по заказу РадиоЛоцман

На английском языке: AVR-GCC LCD library - mixed pin support. Part 1

Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Библиотека хороша, но, на мой взгляд, есть недоработка функции LCDstring, в которую я добавил перенос строки на следующую строчку дисплея если она не влезает, и если вторая строка дисплея есть. Мой код коряв, сразу предупреждаю. К тому же функция переписана исходя из того, что курсор в (0,0) [CODE]void LCDstring(uint8_t* data, uint8_t nBytes) //Outputs string to LCD { register uint8_t i; register uint8_t j=0; // check to make sure we have a good pointer if (!data) return; // print data for(i=0; i1) { if ((i>0) & (i%LCD_LINE_LENGTH==0)) { if (j
  • Согласен, но я думаю, что такая функция (перенос строки на следующую) редко нужна ИМХО и не совсем корректное отображение информации может получиться. Тем более, что это реализуется в библиотеке. На мой взгляд, такие манипуляции можно сделать в программе.
  • согласен. перенос совсем не нужен, самому себе головоломка...
  • кто использовал? я начинающий на Си, подскажите как на lcd строку, число, переменную...? желательно примерчик... заранее благодарен.
  • На kazus.ru зайдите в раздел проекты Proteus. Найдёте достаточно примеров. Вот моё извращение в полном комплекте для WinAVR.
  • Спасибо, посмотрю.
Полный вариант обсуждения »