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!");