Как настроить смартфоны и ПК. Информационный портал
  • Главная
  • Безопасность
  • Уроки Arduino: создаем бегущую строку с помощью микроконтроллера. Уроки Arduino: создаем бегущую строку с помощью микроконтроллера Бегущая строка на дисплее 1602

Уроки Arduino: создаем бегущую строку с помощью микроконтроллера. Уроки Arduino: создаем бегущую строку с помощью микроконтроллера Бегущая строка на дисплее 1602

Все давно привыкли, что у каждого электронного устройства есть экран, с помощью которого оно дает человеку всякую полезную информацию. MP3-плеер показывает название играемого трека, пульт квадрокоптера отображает полетную телеметрию, даже стиральная машина выводит на дисплей время до конца стирки, а на смартфоне вообще размещается целый рабочий стол персонального компьютера! Скорее всего, вашему очередному устройству тоже не помешает какой-нибудь небольшой дисплейчик 🙂 Попробуем сделать простые электронные часы! А в качестве табло используем распространенный и дешевый символьный жидкокристаллический дисплей 1602. Вот прямо такой, как на картинке: Кроме 16х2, достаточно популярным считается символьный дисплей 20х4 (четыре строки по 20 символов), а также графический дисплей с разрешением 128х64 точек. Вот они на картинках:

1. Подключение символьного ЖК дисплея 1602

У дисплея 1602 есть 16 выводов. Обычно они нумеруются слева-направо, если смотреть на него так как на картинке. Иногда выводы подписываются, типа: DB0, DB1, EN и т.п. А иногда просто указывают номер вывода. В любом случае, список выводов всегда одинаковый: 1 — «GND», земля (минус питания); 2 — «Vcc»,­ питание +5В; 3 — «VEE», контраст; 4 — «RS», выбор регистра; 5 — «R/W», направление передачи данных (запись/чтение); 6 — «EN», синхронизация; 7-14 — «DB0­», «DB1», .., «DB7″­- шина данных; 15 — анод подсветки (+5В); 16 — катод подсветки (земля). Линии VEE, RS и четыре линии данных DB4, DB5, DB6, DB7 подключаем к цифровым выводам контроллера. Линию «R/W» подключим к «земле» контроллера (так как нам потребуется только функция записи в память дисплея). Подсветку пока подключать не будем, с этим, я полагаю, вы сами легко разберетесь 🙂 Принципиальная схема подключения дисплея к Ардуино Уно
Внешний вид макета
На всякий случай еще и в виде таблички:
ЖК дисплей 1602 1 2 4 6 11 12 13 14 15 16
Ардуино Уно GND +5V 4 5 6 7 8 9 +5V GND

2. Программируем «Hello, world!»

Для работы с ЖК дисплеями различных размеров и типов, в редакторе Arduino IDE имеется специальная библиотека LiquidCrystal . Чтобы подключить библиотеку, запишем первой строчкой нашей программы следующее выражение: #include Далее, нам потребуется указать какие выводы Ардуино мы использовали для подключения дисплея. Эту информацию мы укажем при инициализации модуля: LiquidCrystal lcd(4, 5, 6, 7, 8, 9); Здесь первые два аргумента — это выводы RS и EN, а оставшиеся четыре — линии шины данных DB4-DB7. Далее, укажем размер дисплея с помощью команды «begin»: lcd.begin(16, 2); Напоминаю, в нашем дисплее имеется две строки, по 16 символов в каждой. Наконец, для вывода текста нам понадобится простая функция «print». Вывод с помощью этой функции всем известной фразы будет выглядеть следующим образом: lcd.print("Hello, world!"); Полностью программа будет выглядеть так: #include LiquidCrystal lcd(4, 5, 6, 7, 8, 9); void setup(){ lcd.begin(16, 2); lcd.print("Hello, world!"); } void loop(){ } Загружаем её на Ардуино Уно, и смотрим что творится на дисплее. Может быть три основных ситуации 🙂 1) На дисплее отобразится надпись «Hello, world!». Значит вы все правильно подключили, и контраст каким-то чудесным образом оказался изначально правильно настроен. Радуемся, и переходим к следующей главе. 2) На дисплее отобразится целый ряд черных прямоугольников — требуется настройка контраста! Именно для этого мы добавили в цепь потенциометр с ручкой. Крутим его от одного края, до другого, до момента пока на дисплее не появится четкая надпись. 3) Два ряда черных прямоугольников. Скорее всего, вы что-то напутали при подключении. Проверьте трижды все провода. Если не найдете ошибку — попросите кота проверить!

3. Программируем часы

Теперь когда дисплей точно работает, попробуем превратить наше нехитрое устройство в настоящие электронные часы. Внимание! Для вывода времени нам потребуется библиотека «Time». Если она еще не установлена, то можно скачать архив по ссылке . Подключим ее: #include Затем установим текущие дату и время с помощью функции «setTime»: setTime(23, 59, 59, 12, 31, 2015); Здесь все понятно: часы, минуты, секунды, месяц, число, год. Для вывода даты используем кучу функции:
  • year() — вернет нам год;
  • month()­ — месяц;
  • day() ­- день;
  • hour() ­- час;
  • minute() — вернет минуту;
  • second() -­ секунду.
Теперь обратим внимание вот на какой факт. Если посчитать количество символов в типовой записи даты: «31.12.2015 23:59:59», получим 19. А у нас всего 16! Не влазит, однако, в одну строчку. Решить проблему можно еще одной полезной функцией — «setCursor». Эта функция устанавливает курсор в нужную позицию. Например: lcd.setCursor(0,1); Установит курсор в начало второй строчки. Курсор — это место символа, с которого начнется вывод текста следующей командой «print». Воспользуемся этой функцией для вывода даты в первой строчке, а времени во второй. С выводом даты и времени теперь все ясно. Остались рутинные вещи. Например, после каждого заполнения дисплея, мы будем его чистить функцией «clear()»: lcd.clear(); А еще нам нет смысла выводить данные на дисплей чаще чем раз в секунду, поэтому между двумя итерациями сделаем паузу в 1000 миллисекунд. Итак, сложив все вместе, получим такую программу: #include #include LiquidCrystal lcd(4, 5, 6, 7, 8, 9); void setup(){ lcd.begin(16, 2); setTime(7,0,0,1,10,2015); // 7 утра, десятого января 2015 года } void loop(){ lcd.clear(); lcd.print(day()); lcd.print("."); lcd.print(month()); lcd.print("."); lcd.print(year()); lcd.setCursor(0, 1); lcd.print(hour()); lcd.print(":"); lcd.print(minute()); lcd.print(":"); lcd.print(second()); delay(1000); } Загружаем скетч на Ардуино Уно, и наблюдаем за ходом часиков! 🙂 Для того чтобы закрепить полученные знания, рекомендую прокачать наши часы до полноценного будильника. Всего-то на всего потребуется добавить пару кнопок и зуммер 🙂

Для работы с символьными графическими дисплеями предлагаем воспользоваться библиотекой LiquidCrystal которая входит в стандартный набор Arduino IDE и предназначена для работы по 8-битному (4-битному) параллельному интерфейсу. Если Ваш дисплей подключается к Arduino по шине I2, то Вам нужно установить библиотеку LiquidCrystal_I2C (большинство функций которой повторяют функции первой библиотеки).

Поддерживаемые дисплеи:

Дисплей Подключение и инициализация
LCD1602 - символьный дисплей (16x02 символов),


#include
[ , 8 , 9 , 10 , 11 ]);
void setup(){ lcd.begin(16 , 2); }

// Пояснение:

void setup(){ ОБЪЕКТ.begin(КОЛ_СТОЛБЦОВ, КОЛ_СТРОК); }


LiquidCrystal ОБЪЕКТ (RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7);


с интерфейсом I2C (синий)

#include
#include
LiquidCrystal_I2C lcd(0x27 или 0x3F , 16 , 2);
void setup(){ lcd.init(); }

// Пояснение:



LCD1602 I2C - символьный дисплей (16x02 символов),
с интерфейсом I2C (зелёный)

#include
#include
LiquidCrystal_I2C lcd(0x27 или 0x3F , 16 , 2);
void setup(){ lcd.init(); }

// Пояснение:
LiquidCrystal_I2C ОБЪЕКТ (АДРЕС_I2C , КОЛ_СТОЛБЦОВ, КОЛ_СТРОК);
// АДРЕС_I2C может быть либо 0x27, либо 0x3F

LCD2004 - символьный дисплей (20x04 символов),
с параллельным интерфейсом (синий)

#include
LiquidCrystal lcd(2 , 3 , 4 , 5 , 6 , 7 [ , 8 , 9 , 10 , 11 ]);
void setup(){ lcd.begin(20 , 4); }

// Пояснение:
LiquidCrystal ОБЪЕКТ (RS , E , D4 , D5 , D6 , D7);
void setup(){ ОБЪЕКТ.begin(КОЛ_СТОЛБЦОВ, КОЛ_СТРОК); }

// Если используется 8 проводов шины данных, то указываем их все
LiquidCrystal ОБЪЕКТ (RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7);

LCD2004 I2C - символьный дисплей (20x04 символов),
с интерфейсом I2C (синий)
#include
#include
LiquidCrystal_I2C lcd(0x27 или 0x3F , 20 , 4);
void setup(){ lcd.init(); }

// Пояснение:
LiquidCrystal_I2C ОБЪЕКТ (АДРЕС_I2C , КОЛ_СТОЛБЦОВ, КОЛ_СТРОК);
// АДРЕС_I2C может быть либо 0x27, либо 0x3F

#1 Пример

Выводим надпись на дисплей LCD1602 подключённый по шине I2C. Для работы с дисплеем LCD2004 нужно изменить 3 строку на LiquidCrystal_I2C lcd(0x27,20,4);

#include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD"); // Выводим текст "LCD", начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора } // // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#2 Пример

Выводим надпись на дисплей LCD1602 подключённый по 4-битной параллельной шине. Для работы с дисплеем LCD2004 нужно изменить 5 строку на lcd.begin(20, 4);

#include // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup(){ // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("LCD2004"); // Выводим текст "LDC1602", начиная с установленной позиции курсора lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("www.iarduino.ru"); // Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора } // // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#3 Пример

Выводим надпись «Русский язык» на дисплей LCD1602 подключённый по шине I2C:

#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol = { // Объявляем массив из 6 собственных символов (к и й я з ы), каждый символ состоит из 8 байт { 0, 0,18,20,24,20,18, 0 }, // к { 0, 0,17,19,21,25,17, 0 }, // и {10, 4,17,19,21,25,17, 0 }, // й { 0, 0,15,17,15, 5, 9, 0 }, // я { 0, 0,14,17, 6,17,14, 0 }, // з { 0, 0,17,17,29,19,29, 0 }}; // ы // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1, symbol); // Загружаем 1 символ "к" в ОЗУ дисплея lcd.createChar(2, symbol); // Загружаем 2 символ "и" в ОЗУ дисплея lcd.createChar(3, symbol); // Загружаем 3 символ "й" в ОЗУ дисплея lcd.createChar(4, symbol); // Загружаем 4 символ "я" в ОЗУ дисплея lcd.createChar(5, symbol); // Загружаем 5 символ "з" в ОЗУ дисплея lcd.createChar(6, symbol); // Загружаем 6 символ "ы" в ОЗУ дисплея lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка) lcd.print("Pycc\1\2\3 \4\5\6\1"); // Выводим текст "Pycckий языk", где "Pycc" написано латиницей, а "kий языk" - символами из ОЗУ дисплея } // Если нужно вывести символ из ОЗУ дисплея, то пишем \ и номер символа // void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#4 Пример

Выводим время прошедшее после старта на дисплей LCD1602 подключённый по шине I2C:

#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t tim_D, tim_H, tim_M, tim_S; // Объявляем переменные для хранения дней, часов, минут и секунд. uint32_t tim; // Объявляем переменную для хранения общего количества времени прошедшего после старта. // Если надпись не появилась, замените адрес 0x27 на 0x3F void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея } // // void loop(){ // // Получаем время прошедшее после старта: // tim = millis() / 1000; // Получаем общее количество секунд (максимум 4"294"967 сек ≈ 49,7 дней). tim_S = tim % 60; // Получаем секунды: остаток от деления всех секунд на минуту (60 сек). tim = (tim-tim_S) / 60; // Получаем общее количество минут. tim_M = tim % 60; // Получаем минуты: остаток от деления всех минут на час (60 мин). tim = (tim-tim_M) / 60; // Получаем общее количество часов. tim_H = tim % 24; // Получаем часы: остаток от деления всех часов на день (24 час). tim_D = (tim-tim_H) / 24; // Получаем общее количество дней. // Выводим время прошедшее после старта: // if (millis()%1000<100){ // Условие выполняется в течении 100 первых миллисекунд каждой новой секунды. delay(100); lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка). lcd.print("Days: "); // Выводим текст. if(tim_D<10){lcd.print(0);} // Выводим 0 перед количеством дней. lcd.print(tim_D); // Выводим количество дней. lcd.setCursor(0, 1); // Устанавливаем курсор в позицию (0 столбец, 1 строка) lcd.print("Time: "); // Выводим текст. if(tim_H<10){lcd.print(0);} // Выводим 0 перед количеством часов. lcd.print(tim_H); // Выводим количество часов. lcd.print(":"); // Выводим символ. if(tim_M<10){lcd.print(0);} // Выводим 0 перед количеством минут. lcd.print(tim_M); // Выводим количество минут. lcd.print(":"); // Выводим символ. if(tim_S<10){lcd.print(0);} // Выводим 0 перед количеством секунд. lcd.print(tim_S); // Выводим количество секунд. } // } //

Функции, общие для библиотек LiquidCrystal и LiquidCrystal_I2C:

  • begin(cols,rows,); – Инициализация дисплея с указанием количества столбцов, строк и размера символа.
  • clear(); – Очистка дисплея с установкой курсора в положение 0,0 (Занимает много времени!).
  • home(); – Установка курсора в положение 0,0 (Занимает много времени!).
  • display(); – Быстрое включение дисплея (без изменения данных в ОЗУ).
  • noDisplay(); – Быстрое выключение дисплея (без изменения данных в ОЗУ).
  • blink(); – Включение мигающего курсора (с частотой около 1 Гц).
  • noBlink(); – Выключение мигающего курсора.
  • cursor(); – Включение подчеркивания курсора.
  • noCursor(); – Выключение подчеркивания курсора.
  • scrollDisplayLeft(); – Прокрутка дисплея влево. Сдвиг координат дисплея на один столбец влево (без изменения ОЗУ).
  • scrollDisplayRight(); – Прокрутка дисплея вправо. Сдвиг координат дисплея на один столбец вправо (без изменения ОЗУ).
  • leftToRight(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец вправо.
  • rightToLeft(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец влево.
  • noAutoscroll(); – Указывает в дальнейшем выравнивать текст по левому краю от позиции курсора (как обычно).
  • autoscroll(); – Указывает в дальнейшем выравнивать текст по правому краю от позиции курсора.
  • createChar(num,array); – Запись пользовательского символа в CGRAM дисплея под указанным номером.
  • setCursor(col,row); – Установка курсора в позицию указанную номером колонки и строки.
  • print(text); – Вывод текста, символов или цифр на экран дисплея. Синтаксис схож с одноимённой функцией класса Serial.

Функции, реализованные только в библиотеке LiquidCrystal_I2C:

  • init(); – Инициализация дисплея. Должна быть первой командой библиотеки LiquidCrystal_I2C после создания объекта. На самом деле данная функция есть и в библиотеке LiquidCrystal, но в той библиотеке она вызывается автоматически (по умолчанию) при создании объекта.
  • backlight(); – Включение подсветки дисплея.
  • noBacklight(); – Выключение подсветки дисплея.
  • setBacklight(flag); – Управление подсветкой (true - включить / false - выключить), используется вместо функций noBacklight и backlight.

Подключение:

// Для шины I2C:
#include
#include
LiquidCrystal_I2C lcd(address , col , row );
void setup(){
lcd.init();
}

Параметр:
  • address: Адрес дисплея на шине I2C - 0x27 или 0x3F
  • col:
  • row:
// Для параллельной шины из 4 проводов:
#include
LiquidCrystal lcd( RS , E , D4 , D5 , D6 , D7 );
void setup(){
lcd.begin( col , row );
}
Параметр:
  • RS: № вывода Arduino к которому подключён вывод RS
  • E: № вывода Arduino к которому подключён вывод E
  • D0...D3: № выводов Arduino к которым подключены выводы D0-D3
  • D4...D7: № выводов Arduino к которым подключены выводы D4-D7
  • col: количество столбцов реализованное у дисплея
  • row: количество строк реализованное у дисплея
// Для параллельной шины из 8 проводов:
#include
LiquidCrystal lcd( RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 );
void setup(){
lcd.begin( col , row );
}
begin(col , row , );
Инициализация дисплея с указанием размеров экрана и символов.
Параметр:
  • col: количество столбцов реализованное у дисплея
  • row: количество строк реализованное у дисплея
  • size: размер символов, указывается константой:
    LCD_5x8DOTS (по умолчанию), или LCD_5x10DOTS
/* Для шины I2C: */ #include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x3F,20,4); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x3F, количество столбцов = 20, количество строк = 4) // void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея... // Выводим информацию, которая должна отображаться при старте } // // void loop(){} // ... // Выводим информацию которая должна меняться по алгоритму Вашего кода } // /* Для 4 проводной параллельной шины: */ #include // Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем LiquidCrystal lcd(2,3,4,5,6,7); // Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7) // Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7) void setup(){ // lcd.begin(16, 2); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк) ... // Выводим информацию, которая должна отображаться при старте } // // void loop(){} // ... // Выводим информацию которая должна меняться по алгоритму Вашего кода } //

Функции управления дисплеем:

display();
Включает дисплей после того как он был выключен функцией noDisplay.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
noDisplay();
Выключает дисплей.
Данные на дисплее не будут отображаться до вызова функции display, но и не сотрутся из памяти ОЗУ, а после вызова функции display, опять будут отображаться.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
scrollDisplayLeft();
Сдвигает координаты дисплея на один столбец влево.



scrollDisplayRight();
Сдвигает координаты дисплея на один столбец вправо.
Постоянный вызов данной функции создаст эффект бегущей строки.
Координаты сдвигаются как для имеющейся на дисплее информации, так и для той, которая будет выведена после.
Примечание: Функция выполняется без изменений ОЗУ дисплея.
Если вызвать функцию 40 раз подряд, то координата вернётся в изначальную точку
clear();
Очистка дисплея с установкой курсора в положение 0,0.
Информация имеющаяся на дисплее безвозвратно сотрётся.
Примечание: Занимает много времени.
backlight();
Включение подсветки дисплея.
noBacklight();
Выключение подсветки дисплея.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
setBacklight(flag );
Управление подсветкой (вместо функций noBacklight и backlight).
Параметр:
  • flag: значение true - включает, а false - выключает подсветку.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
/* Выводим надпись для наблюдения за функциями управления дисплеем: */ lcd.cursor(0,0); // Устанавливаем курсор в крайний верхний угол дисплея (0 столбец, 0 строка) lcd.print("iarduino.ru"); // Выводим текст "iarduino.ru" (первая буква "i" будет находиться в позиции "0,0", а последняя "u" в позиции "10,0", невидимый курсор в позиции "11,0") // lcd.noDisplay(); // Выключаем дисплей (надпись исчезнет с дисплея) lcd.display(); // Включаем дисплей (надпись появится на дисплее в том же месте) lcd.scrollDisplayLeft(); // Сдвигаем координаты столбцов влево (на дисплее будет отображаться "arduino.ru" без первой буквы "i", которая выйдет за пределы дисплея, но останется в его ОЗУ) lcd.scrollDisplayRight(); // Сдвигаем координаты столбцов вправо (на дисплее будет отображаться "iarduino.ru" на том же месте, где и была выведена изначально) lcd.clear(); // Чистим дисплей (надпись безвозвратно исчезнет с дисплея) lcd.noBacklight(); // Отключаем подсветку дисплея lcd.backlight(); // Включаем подсветку дисплея lcd.setBacklight(0); // Отключаем подсветку дисплея lcd.setBacklight(1); // Включаем подсветку дисплея

Функции управления курсором:

setCursor(col , row );
Установка курсора в указанную позицию.
Параметр:
  • col: номер столбца (начиная с 0).
  • row: номер строки (начиная с 0)
home();
Установка курсора в позицию 0,0. Работает как функция setCursor(0,0);
Примечание: Занимает много времени.
blink();
Включение мигающего курсора.
Примечание: Курсор занимает всё поле символа и мигает с частотой около 1 Гц, в той позиции где он был установлен ранее.
noBlink();
Выключение мигающего курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.
cursor();
Включение подчеркивания курсора.
Примечание: Курсор принимает вид символа подчёркивания и находится в той позиции, где он был установлен ранее.
noCursor();
Выключение подчеркивания курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.
lcd.setCursor(0, 1); // Устанавливаем курсор на первый символ второй строки (нумерация строк и столбцов начинается с 0) lcd.home(); // Устанавливаем курсор на первый символ первой строки (как при вызове lcd.setCursor(0,0);) lcd.blink(); // Делаем курсор видимым (на месте курсора будет мигать прямоугольник) lcd.noBlink(); // Делаем курсор невидимым (убираем мигающий прямоугольник) lcd.cursor(); // Делаем курсор видимым (на месте курсора появится знак подчёркивания) lcd.noCursor(); // Делаем курсор невидимым (убираем знак подчёркивания) // Если курсор попадает на место где есть символ, то этот символ не исчезает

Функции указывающие направление и выравнивание:

leftToRight();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец вправо.
Примечание: Если вывести текст "abc" на дисплее отобразится "abc" и текст будет находиться правее от изначального положения курсора.
(Как обычно)
rightToLeft();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец влево.
Примечание: Если вывести текст "abc" на дисплее отобразится "cba" и текст будет находиться левее от изначального положения курсора.
(Письменность справа налево)
noAutoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по левому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться первый символ выведенного текста.
(Как обычно)
autoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по правому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться курсор.
(Координаты дисплея будут сдвинуты влево, как будто Вы вызвали функцию scrollDisplayLeft столько раз, сколько букв в выведенном тексте)
lcd.leftToRight(); // Указываем курсору сдвигаться вправо (Как обычно в европейской письменности) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (После "A" курсор сдвинулся вправо и вывелась "B", далее курсор сдвинулся вправо и вывелась "C") lcd.rightToLeft(); // Указываем курсору сдвигаться влево (Как в письменности справа налево) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " CBA " (После "A" курсор сдвинулся влево и вывелась "B", далее курсор сдвинулся влево и вывелась "C") lcd.noAutoscroll(); // Устанавливаем выравнивание по левому краю (Как обычно) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (Как обычно) lcd.autoscroll(); // Устанавливаем выравнивание по правому краю (Координаты дисплея будут сдвинуты влево на количество выведенных символов) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // На дисплее увидим: " ABC " (Координаты дисплея будут сдвинуты на 3 символа влево, так как после каждого символа совершается вызов функции scrollDisplayLeft)

Функции ввода текста и символов:

createChar(num,array);
Запись пользовательского символа в CGRAM дисплея под указанным номером.
Если Вы хотите вывести текст (функцией print) в котором должен находиться установленный Вами символ, укажите слэш и номер под которым был записан этот символ: print("C\1MBO\2").
Параметр:
  • num: номер под которым будет записан символ.
  • array: массив представляющий записываемый символ.
Примечание: Массив состоит из нескольких байт, количество которых равно количеству строк в символе. Каждый установленный бит байта соответствует установленному (отображаемому) пикселю символа.
print(text);
Вывод текста, символов или цифр на экран дисплея.
Параметр:
  • text: символ, число или строка для вывода на дисплей.
Примечание: Синтаксис схож с одноимённой функцией класса Serial.
#include // Подключаем библиотеку для работы с шиной I2C #include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) // uint8_t symbol_d = {0b00000, // 1 строка символа "д" 0b00000, // 2 строка символа "д" 0b00110, // 3 строка символа "д" 0b01010, // 4 строка символа "д" 0b01010, // 5 строка символа "д" 0b01010, // 6 строка символа "д" 0b11111, // 7 строка символа "д" 0b10001}; // 8 строка символа "д" Весь массив можно записать одной строкой: uint8_t symbol_d={0,0,6,10,10,10,31,17}; // uint8_t symbol_i = {0b00000, // 1 строка символа "и" 0b00000, // 2 строка символа "и" 0b10001, // 3 строка символа "и" 0b10011, // 4 строка символа "и" 0b10101, // 5 строка символа "и" 0b11001, // 6 строка символа "и" 0b10001, // 7 строка символа "и" 0b00000}; // 8 строка символа "и" Весь массив можно записать одной строкой: uint8_t symbol_i={0,0,17,19,21,25,17,0}; void setup(){ // lcd.init(); // Инициируем работу с LCD дисплеем lcd.backlight(); // Включаем подсветку LCD дисплея lcd.createChar(1,symbol_d); // Загружаем в память дисплея первый символ lcd.createChar(2,symbol_i); // Загружаем в память дисплея второй символ lcd.clear(); // Чистим экран lcd.setCursor(0,0); // Устанавливаем курсор в крайний верхний угол lcd.print("Pa\1\2o"); // Выводим текст "Paдиo" при этом символы "P", "a" , "o" пишем латиницей, } // а символы "д", "и" выводим из памяти дисплея, указывая их номера // void loop(){ // lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print("i"); lcd.print("arduino"); lcd.print(".ru"); // выводим текст "i" "arduino" ".ru" в нижней строке delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12.345); // выводим число 12.34 (выводится 2 знака после запятой) delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(12, HEX); // выводим число 12 в виде шестнадцатиричного числа delay(2000); // ждём 2 секунды lcd.setCursor(0,1); lcd.print(" "); // стираем всю нижнюю строку lcd.setCursor(0,1); lcd.print(1); // выводим число 1 delay(2000); // ждём 2 секунды }

Бегущая строка в LCD на HD44780.

Поиск "готового решения" бегущей строки на Си результата не дал. Поэтому пришлось делать самому.

Этот "кусок" кода позволяет выводить бегущую строку (справа-налево), в любом месте и с использованием любого количества знакомест, в LCD индикаторах с контроллером HD44780 или аналогичном.

Первое, на чем нужно остановиться, это то, что язык Си не позволяет работать со строками "напрямую". То есть невозможно скопировать символ из одной строки в другую при помощи оператора присваивания (= )... для этого нужно использовать специальную функцию strncpy() . Вообще говоря, для работы со строками в Си используются несколько функций. В самоМучителях использованию этих функций посвящена отдельная глава. В Help"e на CV_AVR описание функций для работы со троками находится в разделе " String Functions" . Прототипы этих функций находятся в файле string.h .

"...исходная строка..." - строка символы из которой нужно выводить в "бегущей" строке;

"...отображаемые символы..." - собственно "бегущая строка".

Для организации бегущей строки выбран такой алгоритм:

1. Отображаемые символы сдвигаются справо налево. Крайний левый при этом "теряется".

2. После сдвига, в крайний правый символ копируется очередной символ из исходной строки.

3. При достижении конца исходной строки, очередным становится первый символ исходной строки.

Для сдвига символов - для сдвигаемой ячейки считывается код символа из экранного ОЗУ (DDRAM) HD44780 и записывается в левостоящую ячейку ОЗУ.

Согласно DataSheet на HD44780 левый символ верхней строки имеет адрес в DDRAM - 0x00, а левый символ нижней строки - 0x40. При этом нужно помнить, что для того чтобы обратиться именно к экранному ОЗУ (а не к ОЗУ знакогенератора) необходимо чтобы бит RS был равен 1 (RS является старшим битом в байте адреса см.DataSheet).

В итоге получаем, что для того чтобы "обратиться" ко второму слева символу верхней строки необходимо "работать" с адресом 0x01 | 0x80 = 0x81 .

Функции записи и чтения "внутреннего содержимого" HD44780 есть в библиотеке (прототипы в lcd.h ).... поэтому..собственно программа:

/* для CV_AVR

В данном примере бегущая строка выводиться в разряды с 8 (0xC7) по 16 нижней строки 16-ти разрядного индикатора.

. ......

#include

unsigned char n_sim=1,m_end=43; //43 - дина строки в примере
...........

beg_stroka(){
unsigned char i;

// сдвиг бегущей строки

if(beg_str){
for(i=0;i<9;i++)lcd_write_byte(0xC7+i,lcd_read_byte(0xC8+i));
beg_str=0;

// запись очередного символа в крайний правую позицию

lcd_gotoxy(15,1);
lcd_putchar(ish_str);
if(++n_sim>m_end)n_sim=1;
}
}

Глоссарий:

n_sim - указатель положения текущего символа в исходной строке;

m_end - общее количество символов в исходной строке;

beg_str - бит "разрещающий" сдвиг. C его помощью можно регулировать скорость "бега";

ish_str - исходная строка.

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

Исходную строку я "готовлю" при помощи известной утилиты "HD44780.exe". При ее использовании, в коментариях, указывается длина строки: "/* Maximum length of a line: 43 byte */"

Лучшие статьи по теме