Жидкокристаллические дисплеи (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, // 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 который вы используете, вы получите разные результаты, один покажет букву за буквой, а другой покажет весь текст сразу. Как и в видео, при повороте потенциометра, изменяется контрастность дисплея.
Небольшое видео основанное на следующем коде:
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!");