Netduino: Взаємодія з символьним ЖК-дисплеєм
Рідкокристалічні дисплеї (LCD) є відмінним вибором пристрою виводу для відображення буквено-цифрових символів в реальному часі. Вони також дуже корисні, якщо вашому проекту потрібен інтерактивний користувацький інтерфейс для введення даних. Крім того, вони недорогі, споживають менше енергії, ніж світлодіодні дисплеї, і надають вашому проекту більш професійний вигляд. Сьогодні ми розглянемо, як взаємодіяти з символьним ЖК-дисплеєм на основі HD44780 з Netduino для відображення буквено-цифрових символів. Для уточнення технічних деталей контролера HD44780, будь ласка, прочитайте його даташит, а також приклад взаємодії з ним з chipKit.
Збірка схеми і теорія
Правильне з'єднання дуже просте. ЖК-дисплей працює в 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
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, який ви використовуєте, ви отримаєте різні результати, один покаже букву за буквою, а інший покаже весь текст одразу. Як і в відео, при повороті потенціометра, змінюється контрастність дисплея.
Невелике відео, основане на наступному коді:
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!");
- EmbeddedLab_NetduinoPlus_Day2_.zip (6 Кб)
- LCDFzz.zip (8 Кб)