【rust/树莓派】使用rppal&embedded-graphics控制st7789 LCD屏幕

说在前面

  • 树莓派版本: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模块,包含杜邦线

准备工作

  • 树莓派相关见上篇文章
  • 安装rust
    这里直接在树莓派系统上安装的rust,未使用交叉编译等手段。

开始

  • 相关依赖包

    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"
  • 代码

    rust 复制代码
    use 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

结果

相关推荐
漫路在线23 分钟前
JS逆向-某易云音乐下载器
开发语言·javascript·爬虫·python
小辉懂编程1 小时前
C语言:51单片机实现数码管依次循环显示【1~F】课堂练习
c语言·开发语言·51单片机
醍醐三叶2 小时前
C++类与对象--2 对象的初始化和清理
开发语言·c++
Magnum Lehar3 小时前
3d游戏引擎EngineTest的系统实现3
java·开发语言·游戏引擎
就叫飞六吧3 小时前
Spring Security 集成指南:避免 CORS 跨域问题
java·后端·spring
Mcworld8573 小时前
java集合
java·开发语言·windows
成功人chen某3 小时前
配置VScodePython环境Python was not found;
开发语言·python
海绵宝宝贾克斯儿4 小时前
C++中如何实现一个单例模式?
开发语言·c++·单例模式
史迪仔01124 小时前
[python] Python单例模式:__new__与线程安全解析
开发语言·python·单例模式
冼紫菜4 小时前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos