for "Query here"
rp-rs 组织为RP2040开发了一个 Rust Embedded-HAL rp-hal,他们还提供了一个工程模板,我们将在此工程基础上展开移植工作。
为了支持显示功能,我们需要在Cargo.toml中添加额外的crate:
embedded-graphics = "0.8.0" embedded-graphics-core = "0.4.0" display-interface-parallel-gpio = "0.7.0" # 提供数据接口,实现 WriteOnlyDataCommand trait mipidsi = "0.8.0" # 提供 Display struct
在main.rs中,引用必要的crate:
// 使用兼容型号 ILI9486Rgb565,旋转等。 use mipidsi::{models::ILI9486Rgb565, options::Orientation, options::Rotation}; use mipidsi::options::ColorOrder; // embedded_graphics 的一些接口等 use embedded_graphics::{ mono_font::{ascii::FONT_10X20, MonoTextStyle}, pixelcolor::Rgb888, prelude::*, primitives::{ Circle, PrimitiveStyle, PrimitiveStyleBuilder, Rectangle, StrokeAlignment, Triangle, }, text::{Alignment, Text}, }; // 提供 8080 16bit BUS GPIO 接口 use display_interface_parallel_gpio::{Generic16BitBus, PGPIO16BitInterface}; // 提供 Display struct use mipidsi::Builder;
定义需要用到的 Pins
let rst = pins.gpio22.into_push_pull_output_in_state(gpio::PinState::High); let wr = pins.gpio19.into_push_pull_output_in_state(gpio::PinState::High); let dc = pins.gpio20.into_push_pull_output(); let _blk = pins.gpio28.into_push_pull_output_in_state(gpio::PinState::High); let lcd_d0 = pins.gpio0.into_push_pull_output(); let lcd_d1 = pins.gpio1.into_push_pull_output(); let lcd_d2 = pins.gpio2.into_push_pull_output(); let lcd_d3 = pins.gpio3.into_push_pull_output(); let lcd_d4 = pins.gpio4.into_push_pull_output(); let lcd_d5 = pins.gpio5.into_push_pull_output(); let lcd_d6 = pins.gpio6.into_push_pull_output(); let lcd_d7 = pins.gpio7.into_push_pull_output(); let lcd_d8 = pins.gpio8.into_push_pull_output(); let lcd_d9 = pins.gpio9.into_push_pull_output(); let lcd_d10 = pins.gpio10.into_push_pull_output(); let lcd_d11 = pins.gpio11.into_push_pull_output(); let lcd_d12 = pins.gpio12.into_push_pull_output(); let lcd_d13 = pins.gpio13.into_push_pull_output(); let lcd_d14 = pins.gpio14.into_push_pull_output(); let lcd_d15 = pins.gpio15.into_push_pull_output();
创建 Display Interface,实现了 WriteOnlyDataCommand trait 的 struct
let bus = Generic16BitBus::new(( lcd_d0, lcd_d1, lcd_d2, lcd_d3, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_d8, lcd_d9, lcd_d10, lcd_d11, lcd_d12, lcd_d13, lcd_d14, lcd_d15, )); let di = PGPIO16BitInterface::new(bus, dc, wr);
定义旋转属性
let rotation = Orientation::new().rotate(Rotation::Deg270).flip_horizontal();
创建 Display struct, 并初始化,大部分显示库都是在此基础上绘制图形。
let mut display = Builder::new(ILI9486Rgb565, di) .reset_pin(rst) .color_order(ColorOrder::Bgr) .orientation(rotation) .init(&mut delay) .unwrap();