Главная » Статьи » Arduino с нуля » Работа с Arduino

Урок 8. Вывод на экран LCD своих символов и знаков.

 

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

В этом уроке мы разберем пошаговое создание своих символов, на примере загрузочной строки, которую можно использовать в большом количестве проектов и устройств. 

 

 

Компоненты, схема устройства и сам дисплей, будут такими же, как и в предыдущем уроке. Изменится только сам код программы. Давайте начнем. 

 

Для начала берем основу кода, для работы с LCD дисплеем:

//подключение библиотеки для работы с LCD
#include <LiquidCrystal.h>

//инициализируем LCD с указанием контактов
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup()
{
//начало работы, с указанием размерности экрана
 lcd.begin(16, 2);

}

void loop()
{

}

 

Описывать данный скетч мы не будем, так как подробно каждая строка рассматривается в предыдущем уроке. 

Теперь давайте научимся создавать свои символы и выводить их на экран.

 

Добавление символов происходит с помощью создания массива, размерностью 5 на 7 (что соответствует размеру одного прямоугольника, входящего в дисплей), состоящего из бинарных чисел (0 и 1):

byte line_1[8] = 
{
 B00000, 
 B00000,
 B00000,
 B00000,
 B00000,
 B00000,
 B00000,
}

Как видите, сейчас массив заполнен одними нулями. То есть ни один из пикселей прямоугольника сейчас не задействован. Чтобы сформировать символ, нужно в массив добавить единицы. Получается, что там где в массиве 0 - пиксель не включен, а где 1 - пиксель включен. 

Например вот так выглядит символ "П":

byte line_1[8] = 
{
 B11111, 
 B10001,
 B10001,
 B10001,
 B10001,
 B10001,
 B10001, 
};

 

Теперь нужно данный символ инициализировать, для этого в функции setup() пишем следующее:

 lcd.createChar(1,line_1);

, где 1 - это порядковый номер, а line_1 - это имя массива байтов. 

Вот так выглядит полный код программы:

//подключение библиотеки для работы с LCD
#include <LiquidCrystal.h>

//инициализируем LCD с указанием контактов
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

//создаем свои символы
byte line_1[8] = 
{
 B11111, 
 B10001,
 B10001,
 B10001,
 B10001,
 B10001,
 B10001,
};

void setup()
{
//начало работы, с указанием размерности экрана
 lcd.begin(16, 2);
//инициализируем массив
 lcd.createChar(1,line_1);
//сдвигаем курсор на первый столбец и первую строку 
 lcd.setCursor(0,0);
//выводим символ на экран 
 lcd.write(1);
}

void loop()
{

}

Если залить скетч в Arduino, то мы увидим букву "П", стоящую в первом столбце, первой строки. 

Теперь давайте немного усложним задачу, и создадим линию загрузки. Для этого нужно создать пять дополнительных символов, отвечающие за каждый из столбцов дисплея.  И также их инициализировать:

//подключение библиотеки для работы с LCD
#include <LiquidCrystal.h>

//инициализируем LCD с указанием контактов
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

//создаем свои символы
byte line_1[8] = 
{
 B10000, 
 B10000,
 B10000,
 B10000,
 B10000,
 B10000,
 B10000,
};

byte line_2[8] = 
{
 B11000, 
 B11000,
 B11000,
 B11000,
 B11000,
 B11000,
 B11000,
};

byte line_3[8] = 
{
 B11100, 
 B11100,
 B11100,
 B11100,
 B11100,
 B11100,
 B11100, 
};

byte line_4[8] = 
{
 B11110, 
 B11110,
 B11110,
 B11110,
 B11110,
 B11110,
 B11110, 
};

byte line_5[8] = 
{
 B11111, 
 B11111,
 B11111,
 B11111,
 B11111,
 B11111,
 B11111,
};

void setup()
{
//начало работы, с указанием размерности экрана
 lcd.begin(16, 2);
//инициализируем массивы
 lcd.createChar(0,line_1);
 lcd.createChar(1,line_2);
 lcd.createChar(2,line_3);
 lcd.createChar(3,line_4);
 lcd.createChar(4,line_5);
 //сдвигаем курсор на одну второй столбце, первой строки
 lcd.setCursor(1,0);
 //выводим сообщение
 lcd.print("GM-project.com"); 
}

Теперь нужно выводить строку. Для этого создаем двойной цикл. Внешний цикл, по i, будет отвечать за номер столбца в строке. А внутренний цикл, по j, будет отвечать за вывод соответствующего столбца на экран. Таким образом, функция loop() будет иметь вид:

void loop()
{
//сдвигаем курсор на первый столбец и вторую строку 
 lcd.setCursor(0,1);
//очищаем эту строку
 lcd.print(" "); //16 пробелов
//выводим на экран загрузку
for (int i = 0; i < 16 ; i++)
{
 for (int j = 0; j < 5 ; j++)
 {
 lcd.setCursor(i,1);
 lcd.write(j); 
 delay(10);
 } 
}

}

 

Первым делом мы переводим курсор на вторую строку и очищаем ее:

//сдвигаем курсор на первый столбец и вторую строку 
 lcd.setCursor(0,1);
//очищаем эту строку
 lcd.print(" "); //16 пробелов

Теперь выводим эту строку на экран. Сначала мы берем первый прямоугольник (i = 0). И этот прямоугольник начинаем заполнять линиями. От line_1, до line_5. Таким образом, последним нашим действием, в данном прямоугольнике, будет вывод на экран line_5. Потом мы берем второй прямоугольник, и проделываем с ним тоже самое. И так все 16 областей:

for (int i = 0; i < 16 ; i++)
{
 for (int j = 0; j < 5 ; j++)
 {
 lcd.setCursor(i,1);
 lcd.write(j); 
 delay(10);
 } 
}

Когда вся наша строка заполнена, цикл прерывается. Мы очищаем всю строку, и снова начинаем ее заполнение с нуля. 

Полный код программы:

//подключение библиотеки для работы с LCD
#include <LiquidCrystal.h>

//инициализируем LCD с указанием контактов
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

//создаем свои символы
byte line_1[8] = 
{
 B10000, 
 B10000,
 B10000,
 B10000,
 B10000,
 B10000,
 B10000,
};

byte line_2[8] = 
{
 B11000, 
 B11000,
 B11000,
 B11000,
 B11000,
 B11000,
 B11000,
};

byte line_3[8] = 
{
 B11100, 
 B11100,
 B11100,
 B11100,
 B11100,
 B11100,
 B11100, 
};

byte line_4[8] = 
{
 B11110, 
 B11110,
 B11110,
 B11110,
 B11110,
 B11110,
 B11110, 
};

byte line_5[8] = 
{
 B11111, 
 B11111,
 B11111,
 B11111,
 B11111,
 B11111,
 B11111,
};

void setup()
{
//начало работы, с указанием размерности экрана
 lcd.begin(16, 2);
//инициализируем массивы
 lcd.createChar(0,line_1);
 lcd.createChar(1,line_2);
 lcd.createChar(2,line_3);
 lcd.createChar(3,line_4);
 lcd.createChar(4,line_5);
 //сдвигаем курсор на одну второй столбце, первой строки
 lcd.setCursor(1,0);
 //выводим сообщение
 lcd.print("GM-project.com"); 
}

void loop()
{
//сдвигаем курсор на первый столбец и вторую строку 
 lcd.setCursor(0,1);
//очищаем эту строку
 lcd.print(" "); //16 пробелов
//выводим на экран загрузку
for (int i = 0; i < 16 ; i++)
{
 for (int j = 0; j < 5 ; j++)
 {
 lcd.setCursor(i,1);
 lcd.write(j); 
 delay(10);
 } 
}

}

 

Видео работы устройства:

 

 

Задания для самостоятельного выполнения:

  1. Сделайте так, чтобы поведении линии, было такое же, как и на видео ниже:


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

 

Двенадцатый урок проекта "Arduino с нуля" подошел к концу. Надеюсь тема была для вас полезной, и вы узнали что-нибудь новое. Также надеюсь, что при выполнении заданий у вас не возникнет вопросов и вы справитесь самостоятельно.

Если же что-нибудь не будет получаться, или у вас появятся какие-либо вопросы, не стесняйтесь, и оставляйте их в комментариях или же на форуме.  

 

Если Вам понравился наш урок, поделитесь им с друзьями.

 

 


←Предыдущий урок | Следующий урок→


 

Категория: Работа с Arduino | Добавил: GM (22.11.2015)
Просмотров: 9615 | Рейтинг: 5.0/1
Всего комментариев: 0
avatar