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,                // Кількість стовпців
    LCD.Operational.DoubleLIne, // Формат рядків LCD
    4,                 // Кількість рядків у LCD
    LCD.Operational.Dot5x8);    // Розмір точки LCD
 
lcd.ShowCursor = true;
lcd.Show("www.Embedded-Lab.comWelcome's you to Netduino Tutorial site.  Happy Learning! :)", 200, true);
Thread.Sleep(1000); // час читання для глядача


Як ви можете бачити, ми створили екземпляр 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()
{
    //ініціалізувати поля
    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); // потрібно почекати кілька мілісекунд
 
    // RS в high = передача даних
    // RS в low = передача команди/інструкції
    RS.Write(false);
 
    // Enable забезпечує функцію годинника для синхронізації передачі даних
    Enable.Write(false);
 
    // Встановити для 4 бітної моделі
    Write(0x03, secondHalfAddress);
    Thread.Sleep(4);
    Write(0x03, secondHalfAddress);
    Thread.Sleep(4);
    Write(0x03, secondHalfAddress);
    Thread.Sleep(150);
    Write(0x02, secondHalfAddress);
 
    // Встановити властивості LCD
    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); // Перша половина
        Write(value, secondHalfAddress); // Друга половина
    }
}
 
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); // час читання для глядача
 
lcd.ClearDisplay();
lcd.Show("That was cool! Let's clear the display and show all text at once", 200, true);
Thread.Sleep(1000); // час читання для глядача
 
lcd.ClearDisplay();
lcd.ShowCursor = false;
lcd.Show("ABCDEFGHILKLMnopqrstuvwxyz0123456789                              -Thanks!");

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

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