7 releases

✓ Uses Rust 2018 edition

0.2.5 Jun 15, 2019
0.2.4 Mar 2, 2019
0.2.3 Feb 11, 2019
0.2.2 Jan 3, 2019
0.1.0 Apr 30, 2018

#5 in Embedded development

Download history 90/week @ 2019-03-02 62/week @ 2019-03-09 154/week @ 2019-03-16 146/week @ 2019-03-23 115/week @ 2019-03-30 94/week @ 2019-04-06 85/week @ 2019-04-13 73/week @ 2019-04-20 123/week @ 2019-04-27 120/week @ 2019-05-04 118/week @ 2019-05-11 47/week @ 2019-05-18 96/week @ 2019-05-25 42/week @ 2019-06-01 54/week @ 2019-06-08

405 downloads per month
Used in 6 crates

MIT/Apache

2MB
874 lines

SSD1306 driver

Build Status

CRIUS display showing the Rust logo

I2C and SPI (4 wire) driver for the SSD1306 OLED display.

See the announcement blog post for more information.

Documentation

Examples

From examples/image_i2c.rs:

#![no_std]
#![no_main]

extern crate cortex_m;
extern crate cortex_m_rt as rt;
extern crate panic_semihosting;
extern crate stm32f1xx_hal as hal;

use cortex_m_rt::ExceptionFrame;
use cortex_m_rt::{entry, exception};
use embedded_graphics::image::Image1BPP;
use embedded_graphics::prelude::*;
use hal::i2c::{BlockingI2c, DutyCycle, Mode};
use hal::prelude::*;
use hal::stm32;
use ssd1306::prelude::*;
use ssd1306::Builder;

#[entry]
fn main() -> ! {
    let dp = stm32::Peripherals::take().unwrap();
    let mut flash = dp.FLASH.constrain();
    let mut rcc = dp.RCC.constrain();
    let clocks = rcc.cfgr.freeze(&mut flash.acr);
    let mut afio = dp.AFIO.constrain(&mut rcc.apb2);
    let mut gpiob = dp.GPIOB.split(&mut rcc.apb2);

    let scl = gpiob.pb8.into_alternate_open_drain(&mut gpiob.crh);
    let sda = gpiob.pb9.into_alternate_open_drain(&mut gpiob.crh);

    let i2c = BlockingI2c::i2c1(
        dp.I2C1,
        (scl, sda),
        &mut afio.mapr,
        Mode::Fast {
            frequency: 400_000,
            duty_cycle: DutyCycle::Ratio2to1,
        },
        clocks,
        &mut rcc.apb1,
        1000,
        10,
        1000,
        1000,
    );

    let mut disp: GraphicsMode<_> = Builder::new().connect_i2c(i2c).into();

    disp.init().unwrap();
    disp.flush().unwrap();

    let im = Image1BPP::new(include_bytes!("./rust.raw"), 64, 64).translate(Coord::new(32, 0));

    disp.draw(im.into_iter());
    disp.flush().unwrap();

    loop {}
}

#[exception]
fn HardFault(ef: &ExceptionFrame) -> ! {
    panic!("{:#?}", ef);
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies