【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

结果

相关推荐
陌小呆^O^3 分钟前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
计算机毕设指导69 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study10 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
时光の尘25 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
paopaokaka_luck26 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭39 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师39 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者43 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟1 小时前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel