说在前面
- 树莓派版本:4b
- LCD模块:ST7789V2 240*280 LCD
- 树莓派系统:Linux raspberrypi 5.15.76-v8+ #1597 SMP aarch64 GNU/Linux
- rust版本:rustc 1.73.0
模块详情
- 某雪的1.69inch LCD模块,包含杜邦线
准备工作
开始
-
相关依赖包
toml[dependencies] rppal = { version = "0.15.0", features = ["hal"] } embedded-graphics = { version = "0.8.1", features = ["defmt"]} display-interface-spi = "0.4.1" mipidsi = "0.7.1"
-
代码
rustuse display_interface_spi::SPIInterfaceNoCS; use embedded_graphics::mono_font::ascii::FONT_10X20; use embedded_graphics::mono_font::MonoTextStyle; use embedded_graphics::pixelcolor::Rgb565; use embedded_graphics::prelude::{Point, RgbColor, DrawTarget}; use embedded_graphics::text::Text; use embedded_graphics::Drawable; use mipidsi::Builder; use rppal::gpio::Gpio; use rppal::spi::Spi; use std::process::ExitCode; fn main() -> ExitCode { // GPIO let gpio = Gpio::new().unwrap(); // reset let rst = gpio.get(27).unwrap().into_output(); // backlight let mut backlight = gpio.get(18).unwrap().into_output(); // data/commend let dc = gpio.get(25).unwrap().into_output(); // spi let spi = Spi::new( rppal::spi::Bus::Spi0, rppal::spi::SlaveSelect::Ss0, 60_000_000, rppal::spi::Mode::Mode0, ) .unwrap(); let di = SPIInterfaceNoCS::new(spi, dc); let mut delay = rppal::hal::Delay::new(); let mut display = Builder::st7789(di) .with_display_size(240, 280) .with_orientation(mipidsi::Orientation::Landscape(true)) .with_invert_colors(mipidsi::ColorInversion::Inverted) .init(&mut delay, Some(rst)) .unwrap(); // Text let char_w = 10; let text = "Hello World ^_^;"; let mut text_x = 120; let text_y = 280 / 2; let text_style = MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE); // Alternating color let colors = [Rgb565::RED, Rgb565::GREEN, Rgb565::BLUE]; // Clear the display initially display.clear(colors[0]).unwrap(); // Turn on backlight backlight.set_high(); let mut last = std::time::Instant::now(); let mut counter = 0; loop { let elapsed = last.elapsed().as_secs_f64(); if elapsed < 0.00125 { continue; } last = std::time::Instant::now(); counter += 1; // Fill the display with alternating colors every 8 frames display.clear(colors[(counter / 8) % colors.len()]).unwrap(); // Draw text let right = Text::new(text, Point::new(text_x, text_y), text_style) .draw(&mut display) .unwrap(); text_x = if right.x <= 0 { 240 } else { text_x - char_w }; } // Turn off backlight and clear the display backlight.set_low(); display.clear(Rgb565::BLACK).unwrap(); ExitCode::SUCCESS }
运行
rust
cargo run