Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Netduino: Взаимодействие с символьным ЖК-дисплеем

Жидкокристаллические дисплеи (LCD) являются отличным выбором устройства вывода для отображения буквенно-цифирных символов в реальном времени. Они также очень полезны, если вашему проекту требуется интерактивный пользовательский интерфейс для ввода данных. Кроме того, они недороги, потребляют меньше энергии, чем светодиодные дисплеи, и дают вашему проекту более профессиональный вид . Сегодня мы рассмотрим, как взаимодействовать с символьным ЖК-дисплеем на основе HD44780 с Netduino для отображения буквенно-цифирных символов. Для уточнения технических деталей контроллера HD44780, пожалуйста, прочитайте его даташит, а также пример взаимодействия с ним с chipKit.

NetduinoIndexPageTopBanner.png

Сборка схемы и теория

Правильное соединение очень просто. ЖК-дисплей работает в 4-битном режиме, поэтому контакты с 7 по 10 (D0-D3) ЖК-дисплея не используются. Четыре наиболее значимых бита данных, D4-D7 (контакты с 12 по 14), получают ЖК данные/команды с портов ввода/вывода Netduino 7, 5, 3 и 1 соответственно. Кроме того, сигнальные линии Register Select (R/S) и Enable (E)  LCD идут к портам ввода/вывода Netduino 11 и 9  соответственно. Контакты LCD 1, 2, 3, 4, 15 и 16 относятся к источнику питания, регулировке контрастности и светодиодной подсветке дисплея, и они  подключаться правильно, как показано ниже. Чтобы понять, как работает ЖК, я должен указать на другой документ, где это объясняется лучше. В статье Взаимодействие с символьным ЖК-дисплем, Raj  рассказывает о связи в 4-битном режиме, и он также рассказывает об основах ЖК-драйвера HD44780. Для получения дополнительной технической информации см. Hitachi HD44780U (LCD-II) даташит.

Соединение с Netduino/Netduino Plus

netduino_day2_circuit.png


C#.NET программа

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

LCD lcd = new LCD(
    Pins.GPIO_PIN_D11, // RS
    Pins.GPIO_PIN_D9,  // Enable
    Pins.GPIO_PIN_D7,  // D4
    Pins.GPIO_PIN_D5,  // D5
    Pins.GPIO_PIN_D3,  // D6
    Pins.GPIO_PIN_D1,  // D7
    20,                // Number of Columns
    LCD.Operational.DoubleLIne, // LCD Row Format
    4,                 // Number of Rows in LCD
    LCD.Operational.Dot5x8);    // Dot Size of LCD
 
lcd.ShowCursor = true;
lcd.Show("www.Embedded-Lab.comWelcome's you to Netduino Tutorial site.  Happy Learning! :)", 200, true);
Thread.Sleep(1000); // reading time for the viewer


Как вы можете видеть, мы создали экземпляр LCD класса, а затем установили некоторые свойства к тому, что нам нравится, и просто вызвали Show метод. Есть два Show метода, один будет отображать данный текст весь сразу, и другой Show метод  будет отображать одну букву за раз.

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

public LCD(Cpu.Pin rs, Cpu.Pin enable,
    Cpu.Pin d4, Cpu.Pin d5, Cpu.Pin d6, Cpu.Pin d7,
    byte columns, Operational lineSize, int numberOfRows,
    Operational dotSize)
{
    RS = new OutputPort(rs, false);
    Enable = new OutputPort(enable, false);
    D4 = new OutputPort(d4, false);
    D5 = new OutputPort(d5, false);
    D6 = new OutputPort(d6, false);
    D7 = new OutputPort(d7, false);
 
    Columns = columns;
    DotSize = (byte)dotSize;
    NumberOfLines = (byte)lineSize;
    NumberOfRows = numberOfRows;
 
    Initialize();
}

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

private void Initialize()
{
    //initialize fields
    isVisible = true;
    showCursor = false;
    isBlinking = false;
 
    rowAddress = new byte[] { 0x00, 0x40, 0x14, 0x54 };
    firstHalfAddress = new byte[] { 0x10, 0x20, 0x40, 0x80 };
    secondHalfAddress = new byte[] { 0x01, 0x02, 0x04, 0x08 };
 
    currentRow = 0;
    dirtyColumns = 0;
 
    Thread.Sleep(50); // must wait for a few milliseconds
 
    // RS to high = data transfer
    // RS to low = command/instruction transfer
    RS.Write(false);
 
    // Enable provides a clock function to synchronize data transfer
    Enable.Write(false);
 
    // Set for 4 bit model
    Write(0x03, secondHalfAddress);
    Thread.Sleep(4);
    Write(0x03, secondHalfAddress);
    Thread.Sleep(4);
    Write(0x03, secondHalfAddress);
    Thread.Sleep(150);
    Write(0x02, secondHalfAddress);
 
    // Set the LCD properties
    byte operationalValue = (byte)((byte)Operational.FourBit | (byte)NumberOfLines | (byte)DotSize);
    SendCommand((byte)((byte)Command.Operational | operationalValue));
 
    UpdateDisplayOptions();
 
    ClearDisplay();
 
    byte entranceValue = (byte)Entrance.FromLeft | (byte)Entrance.ShiftDecrement;
    SendCommand((byte)((byte)Command.Entrance | entranceValue));
 
}

Теперь, давайте посмотрим на методы, которые являются критическими для отображения текста на LCD. Первый метод Show позволяет показывать данный текст буква за буквой, как вы можете видеть в цикле, структурированном для каждого символа в данном тексте.

public void Show(string text, int delay, bool newLine)
{
    if (newLine) dirtyColumns = 0;
    foreach (char textChar in text.ToCharArray())
    {
        ResetLines();
        Show(Encoding.UTF8.GetBytes(textChar.ToString()));
        dirtyColumns += 1;
        Thread.Sleep(delay);
    }
}

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

public void Show(string text)
{
    string[] splitedText = SplitText(text);
    Show(splitedText);
}

Наконец, метод, который пишет информацию на LCD, сделан Write методом. Первым Write методом осуществляется отправка значения записи и адреса, куда отправлять информацию. Второй Write метод в основном выводит информацию на ЖК-дисплей.

private void Write(byte[] data)
{
    foreach (byte value in data)
    {
        Write(value, firstHalfAddress); // First half
        Write(value, secondHalfAddress); // Second half
    }
}
 
private void Write(byte value, byte[] halfAddress)
{
    D4.Write((value & halfAddress[0]) > 0);
    D5.Write((value & halfAddress[1]) > 0);
    D6.Write((value & halfAddress[2]) > 0);
    D7.Write((value & halfAddress[3]) > 0);
 
    Enable.Write(true);
    Enable.Write(false);
    //Debug.Print("Wrote " + value.ToString());
}

Результат

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

Day-2_Netduino_Output_on_Character_LCD.p

Day2_Netduino_CharcterLCD_BreadBoard.jpg

Небольшое видео основанное на следующем коде:

lcd.ShowCursor = true;
lcd.Show("www.Embedded-Lab.comWelcome's you to Netduino Tutorial site.  Happy Learning! :)", 200, true);
Thread.Sleep(1000); // reading time for the viewer
 
lcd.ClearDisplay();
lcd.Show("That was cool! Let's clear the display and show all text at once", 200, true);
Thread.Sleep(1000); // reading time for the viewer
 
lcd.ClearDisplay();
lcd.ShowCursor = false;
lcd.Show("ABCDEFGHILKLMnopqrstuvwxyz0123456789                              -Thanks!");

Оригинал статьи

Прикрепленные файлы:

Теги:

Опубликована: 11.01.2013 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (0) | Я собрал (0) | Подписаться

Статью еще никто не комментировал. Вы можете стать первым.
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов Конструктор УНЧ 60 Вт на LM3886
вверх