Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

«Hello, Rust!» на ЖК-дисплее

Мы создадим простую программу, которая выводит «Hello, Rust!» на ЖК-экран. Это поможет быстро проверить, что проводка, настройка I2C и конфигурация дисплея верны, прежде чем переходить к следующему упражнению.

Драйверы HD44780

Драйверы можно найти, выполнив поиск по названию аппаратного контроллера HD44780. Иногда помогает поиск по названию модуля дисплея, например lcd1602.

Пока я искал, я наткнулся на несколько крейтов на Rust, которые могут управлять этим ЖК-дисплеем. Некоторые из них даже поддерживают асинхронный режим. Также можно написать собственный драйвер по даташиту, но это выходит за рамки этой главы.

Tip

Если вы хотите научиться писать собственные драйверы для embedded Rust, можно обратиться к книге Rust Embedded Drivers (RED)

Сейчас мы воспользуемся одним из готовых крейтов. Позже вы можете попробовать и другие. Просто прочитайте документацию крейта и при необходимости адаптируйте код.

В этом упражнении мы будем использовать крейт hd44780-driver

Проект из шаблона

Начнём с создания нового проекта из шаблона.

cargo generate --git https://github.com/ImplFerris/pico2-template.git --tag v0.3.2

Когда появится запрос, задайте проекту имя, например «hello-lcd», и выберите embassy в качестве HAL.

Дополнительные крейты

Добавьте в Cargo.toml следующую зависимость вместе с уже существующими:

#![allow(unused)]
fn main() {
hd44780-driver = "0.4.0"
}

Дополнительные импорты

Добавьте импорты, необходимые для I2C и драйвера ЖК-дисплея.

#![allow(unused)]
fn main() {
// I2C
use embassy_rp::i2c::Config as I2cConfig;
use embassy_rp::i2c::{self}; // для удобства импортируем с псевдонимом

// Драйвер ЖК-дисплея
use hd44780_driver::HD44780;

use embassy_time::Delay;
}

Адрес I2C

Адаптеры I2C для LCD1602 обычно используют адрес 0x27, хотя некоторые модули используют 0x3F в зависимости от адаптера. Проверьте даташит своего модуля или попробуйте оба адреса, если не уверены.

#![allow(unused)]
fn main() {
const LCD_I2C_ADDRESS: u8 = 0x27;
}

Настройка I2C

Настроим интерфейс I2C, используя GPIO 16 для SDA и GPIO 17 для SCL, с частотой 100 кГц.

#![allow(unused)]
fn main() {
let sda = p.PIN_16;
let scl = p.PIN_17;

let mut i2c_config = I2cConfig::default();
i2c_config.frequency = 100_000; //100 кГц

let i2c = i2c::I2c::new_blocking(p.I2C0, scl, sda, i2c_config);
}

Инициализация ЖК-дисплея

Теперь создадим экземпляр драйвера ЖК-дисплея с нашим интерфейсом I2C:

#![allow(unused)]
fn main() {
// Инициализация ЖК-дисплея
let mut lcd =
    HD44780::new_i2c(i2c, LCD_I2C_ADDRESS, &mut Delay).expect("failed to initialize lcd");

}

Очистка дисплея

Перед тем как что-либо вывести, сбросим и очистим экран:

#![allow(unused)]
fn main() {
// Очищаем экран
lcd.reset(&mut Delay).expect("failed to reset lcd screen");
lcd.clear(&mut Delay).expect("failed to clear the screen");
}

Вывод текста на ЖК-дисплей

Наконец, выведем наше сообщение на ЖК-дисплей:

#![allow(unused)]
fn main() {
// Выводим в верхней строке
lcd.write_str("Hello, Rust!", &mut Delay)
    .expect("failed to write text to LCD");
}

Клонируйте существующий проект

Можно клонировать проект, который я создал, и перейти в папку hello-lcd.

git clone https://github.com/ImplFerris/pico2-embassy-projects
cd pico2-embassy-projects/lcd/hello-lcd/

Версия на rp-hal

Можно клонировать проект, который я создал, и перейти в папку hello-lcd (версия на rp-hal).

git clone https://github.com/ImplFerris/pico2-rp-projects
cd pico2-rp-projects/lcd/hello-lcd/