В данной статье мы рассмотрим подключение ЖК дисплея 16x2 к плате Raspberry Pi Pico с использованием языка программирования Micropython, с помощью которого мы сможем отображать символы и строки символов на экране дисплея. Ранее на нашем сайте мы рассматривали начало работы с платой Raspberry Pi Pico, подключение к ней OLED дисплея и использование в ней АЦП.
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Общие принципы работы модуля ЖК дисплея 16x2
ЖК дисплей 16x2 (на англ. 16x2 LCD) получил свое название вследствие того факта, что он содержит 16 столбцов и 2 строки, итого суммарно он может отображать на своем экране (16x2=32) 32 символа, каждый символ отображается с помощью матрицы пикселов 5x8. На следующем рисунке представлено схематичное изображение пикселов, используемых для отображения одного символа на экране ЖК дисплея.
Итак, каждый символ на экране дисплея состоит у нас из (5x8=40) 40 пикселей, итого суммарно получаем 1280 пикселей на 32 символа. Но в командах на управление ЖК дисплеем должно быть указано местоположение символов, которыми необходимо управлять для отображения нужных символов. Для управления этими процессами на обратной стороне модуля ЖК дисплея расположена микросхема HD44780, более подробную информацию о ней вы можете прочитать в даташите на нее.
Основное назначение микросхемы HD44780 состоит в том, чтобы принимать команды и данные от микроконтроллера (микроконтроллерной платы) и обрабатывать их таким образом, чтобы обеспечить отображение релевантной (соответствующей) информации на экране дисплея. Без использования фоновой подсветки рабочее напряжение ЖК дисплея составляет от 4.7 до 5.3 Вольта, а его текущее потребление тока равно 1mA. Дисплей способен работать как в 8-битном, так и в 4-битном режимах. Модуль ЖК дисплея 16x2 может поставляться как с зеленой, так и синей фоновой подсветкой, а также может показывать любые символы, созданные пользователем.
ЖК дисплей содержит 16 контактов и назначение его контактов (распиновка) показаны на следующем рисунке.
Более подробно о назначении контактов ЖК дисплея очень много написано в сети интернет, не буду повторять эту информацию здесь в статье. Я думаю, при желании, вы без труда эту информацию найдете.
Схема проекта
Схема подключения ЖК дисплея 16x2 к плате Raspberry Pi Pico представлена на следующем рисунке.
Для управления яркостью ЖК дисплея в схеме предусмотрен потенциометр. 4 контакта данных ЖК дисплея (с D4 по D7) подключены к контактам GPIO 18, 19, 20, 21 платы Raspberry Pi Pico. Контакт Rs ЖК дисплея подключен к контакту 16 платы, а контакт E дисплея – к контакту 17 платы. Выход потенциометра подключен к контакту V0 ЖК дисплея, а контакт VBUS платы – к входному контакту потенциометра. Контакт VBUS платы Raspberry Pi Pico используется для подачи питания на ЖК дисплей – на его контакт VDD. Контакт 15 дисплея подключен к контакту VDD чтобы обеспечить подачу питания на дисплей, а контакт 16 дисплея замкнут на землю (Ground), на нее же замкнут и контакт RW ЖК дисплея.
Объяснение программы для Raspberry Pi Pico
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Вначале вам необходимо скачать по следующей ссылке с репозитория GITHUB каталог, содержащий необходимые библиотеки для работы с Micropython и примеры программ для платы Raspberry Pi Pico. В скачанном каталоге вы найдете подкаталог “codes”, в котором содержатся файлы с именами “lcd_pico.py” и “main.py”. Файл “lcd_pico” может быть использован как библиотека для программирования взаимодействия платы Raspberry Pi Pico с ЖК дисплеем на языке Micropython. В файле “main.py” использованы некоторые функции из файла “lcd_pico.py” для отображения строк на экране ЖК дисплея. Рассмотрим содержание каждого из этих файлов по отдельности.
Файл Lcd_pico.py
В файле “lcd_pico.py” мы импортировали (подключили) две библиотеки: “machine.py” и “utime.py”. Библиотека machine.py содержит функции для работы с контактами платы Raspberry Pi Pico. Библиотека utime.py используется для организации временных задержек в программе.
Далее в программе мы инициализировали и задали режимы работы для используемых контактов платы. 4 контакта используются в качестве контактов передачи данных на ЖК дисплей и еще 2 контакта подключены к контактам RS и E ЖК дисплея. К примеру, команда machine.Pin(16,machine.Pin.OUT) используется для конфигурации контакта GPIO16 для работы в качестве цифрового выхода. Аналогичным образом контакты с GPIO17 до GPIO 21 также конфигурируются в качестве цифровых выходов и ассоциируются с переменными “e”, “d4”, “d5”, “d6” и “d7” соответственно.
1 2 3 4 5 6 7 8 |
import machine import utime rs= machine.Pin(16,machine.Pin.OUT) e = machine.Pin(17,machine.Pin.OUT) d4 = machine.Pin(18,machine.Pin.OUT) d5 = machine.Pin(19,machine.Pin.OUT) d6 = machine.Pin(20,machine.Pin.OUT) d7 = machine.Pin(21,machine.Pin.OUT) |
Далее мы запрограммировали функцию “setCursor(line,pos)”, которая используется для установки позиции курсора на экране ЖК дисплея. В эту функцию передаются два параметра: “line” и “pos” (соответственно номер строки и номер столбца).
1 2 3 4 5 6 7 8 9 |
def setCursor(line, pos): b = 0 if line==1: b=0 elif line==2: b=40 returnHome() for i in range(0, b+pos): moveCursorRight() |
Функция clearScreen() используется для очистки экрана ЖК дисплея, а функция setupLCD() – для инициализации ЖК дисплея, эту функцию нам необходимо использовать в начале основной программы. Функция displayString() используется для отображения строки на экране дисплея, в ней три параметра: “row”, “col” и “input_string”. Параметры “row” и “col” используются для установки позиции курсора, а “input_string” – это строка для вывода на экран ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def clearScreen(): rs.value(0) send2LCD8(0b00000001)#clear screen longDelay(2)#clear screen needs a long delay rs.value(1) def setupLCD(): rs.value(0) send2LCD4(0b0011) send2LCD4(0b0011) send2LCD4(0b0011) send2LCD4(0b0010) send2LCD8(0b00101000) send2LCD8(0b00001100)#lcd on, blink off, cursor off. send2LCD8(0b00000110)#increment cursor, no display shift send2LCD8(0b00000001)#clear screen longDelay(2)#clear screen needs a long delay rs.value(1) def displayString(row, col, input_string): setCursor(row,col) for x in input_string: send2LCD8(ord(x)) longDelay(10) |
Файл main.py
В файле main.py мы импортируем (подключаем) библиотеку “lcd_pico” и затем вызываем функцию “setupLCD()” для инициализации ЖК дисплея. Далее мы используем функцию “displayString()” для вывода необходимых строк на экран дисплея в месте, задаваемом параметрами “row” и “col”. Функция longDelay() используется для формирования необходимой задержки в микросекундах.
1 2 3 4 5 6 7 8 |
from lcd_pico import * setupLCD() displayString(1,0,"WELCOME") displayString(2,0,"TO") longDelay(4000) displayString(1,0,"CIRCUIT") displayString(2,0,"DIGEST") longDelay(4000) |
Далее в цикле while мы используем функцию displayString() для отображения строки “CIRCUIT DIGEST” на экране дисплея на время равное 1 секунде. Затем мы используем функцию clearScreen() для очистки экрана ЖК дисплея.
1 2 3 4 5 6 |
while(True): displayString(1,0,"CIRCUIT") displayString(2,0,"DIGEST") longDelay(1000) clearScreen() longDelay(500) |
Далее откройте в Thonny IDE файлы “main.py” и “lcd_pico.py”. Сначала сохраните файл “lcd_pico.py” на плату Raspberry Pi Pico при помощи нажатия комбинации клавиш “ctrl+shift+s” на клавиатуре. Перед сохранением файла убедитесь в том, что ваша плата Raspberry Pi Pico подключена к компьютеру. При сохранении кода программы откроется всплывающее окно, показанное на рисунке ниже. В этом окне вам необходимо выбрать Raspberry Pi Pico, после этого сохранить код программы под именем "lcd_pico.py". Аналогичную процедуру необходимо повторить и для файла “main.py”. После этого вы сможете запускать эти программы на плате всегда, когда на нее подано питание.
Когда вы загрузите коды программ на плату и запустите основную программу на выполнение вы на экране ЖК дисплея должны увидеть картину, показанную на рисунках ниже. Сначала в первой строке дисплея должна отобразиться надпись “WELCOME”, а во второй строке дисплея – надпись “TO”. Затем, спустя 4 секунды, в первой строке дисплея должна загореться надпись “CIRCUIT”, а во второй строке дисплея – надпись “DIGEST”.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программ на Micropython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
def pulseE(): e.value(1) utime.sleep_us(40) e.value(0) utime.sleep_us(40) def longDelay(t): utime.sleep_ms(t) def shortDelay(t): utime.sleep_us(t) def send2LCD4(BinNum): d4.value((BinNum & 0b00000001) >>0) d5.value((BinNum & 0b00000010) >>1) d6.value((BinNum & 0b00000100) >>2) d7.value((BinNum & 0b00001000) >>3) pulseE() def send2LCD8(BinNum): d4.value((BinNum & 0b00010000) >>4) d5.value((BinNum & 0b00100000) >>5) d6.value((BinNum & 0b01000000) >>6) d7.value((BinNum & 0b10000000) >>7) pulseE() d4.value((BinNum & 0b00000001) >> 0) d5.value((BinNum & 0b00000010) >> 1) d6.value((BinNum & 0b00000100) >> 2) d7.value((BinNum & 0b00001000) >> 3) pulseE() def setCursor(line, pos): b = 0 if line==1: b=0 elif line==2: b=40 returnHome() for i in range(0, b+pos): moveCursorRight() def returnHome(): rs.value(0) send2LCD8(0b00000010) rs.value(1) longDelay(2) def moveCursorRight(): rs.value(0) send2LCD8(0b00010100) rs.value(1) def setupLCD(): rs= machine.Pin(16,machine.Pin.OUT) e = machine.Pin(17,machine.Pin.OUT) d4 = machine.Pin(18,machine.Pin.OUT) d5 = machine.Pin(19,machine.Pin.OUT) d6 = machine.Pin(20,machine.Pin.OUT) d7 = machine.Pin(21,machine.Pin.OUT) rs.value(0) send2LCD4(0b0011) send2LCD4(0b0011) send2LCD4(0b0011) send2LCD4(0b0010) send2LCD8(0b00101000) send2LCD8(0b00001100)#lcd on, blink off, cursor off. send2LCD8(0b00000110)#increment cursor, no display shift send2LCD8(0b00000001)#clear screen longDelay(2)#clear screen needs a long delay rs.value(1) def displayString(row, col, input_string): setCursor(row,col) for x in input_string: send2LCD8(ord(x)) utime.sleep_ms(100) .............................................................................................................................. from lcd_pico import * setupLCD() displayString(1,0,"WELCOME") displayString(2,0,"TO") longDelay(4000) displayString(1,0,"CIRCUIT") displayString(2,0,"DIGEST") longDelay(4000) while(True): displayString(1,0,"CIRCUIT") displayString(2,0,"DIGEST") longDelay(1000) clearScreen() longDelay(500) |