Crate lcd [] [src]

Library that implements low-level protocol to the Hitachi HD44780-compatible LCD device.

Provides high-level API to the Hitachi HD44780-compatible LCD device. Uses 4-bit mode by default (only uses 4 data pins) plus two control pins (R/S and EN). R/W pin is not used and should be wired for "write" (low-level, 0).

The implementation is completely stateless. Client is free to reuse the same Display object or to create one every time access to LCD is required.

Display also implements core::fmt::Write trait, so it could be used as a target of write! macro.

This library does not depend on std crate and could be used in bare metal embedded development.

Examples

#![no_std]
use core::fmt::Write; // for write!
use lcd::*;

// implement HAL...
struct HW {
    // any data needed to access low-level peripherals
}

// implement `Hardware` trait to give access to LCD pins
impl Hardware for HW {
    fn rs(&self, bit: bool) {
        // should set R/S pin on LCD screen
    }
    fn enable(&self, bit: bool) {
        // should set EN pin on LCD screen
    }
    fn data(&self, data: u8) {
        // should set data bits to the LCD screen (only lowest 4 bits are used in 4-bit mode).
    }

    // optionally, override the following function to switch to 8-bit mode
    fn mode(&self) -> lcd::FunctionMode {
        lcd::FunctionMode::Bit8
    }
}

// implement `Delay` trait to allow library to sleep for the given amount of time
impl Delay for HW {
    fn delay_us(&self, delay_usec: u32) {
        // should sleep for the given amount of microseconds
    }
}

// optionally, implement `InputCapableHardware` to enable polling busy flag instead of delay
impl InputCapableHardware for HW {
    fn rw(&self, bit: bool) {
        // configure pins for input _before_ setting R/W to 1
        // configure pins for output _after_ setting R/W to 0
    }
    fn read_data(&self) -> u8 {
        0 // read data from the port
    }
}

// create HAL and LCD instances
let hw = HW { /* ... */ };
let mut lcd = Display::new(&hw);

// initialization
lcd.init(FunctionLine::Line2, FunctionDots::Dots5x8);
lcd.display(
    DisplayMode::DisplayOn,
    DisplayCursor::CursorOff,
    DisplayBlink::BlinkOff);
lcd.entry_mode(EntryModeDirection::EntryRight, EntryModeShift::NoShift);

// print something
write!(&mut lcd, "Hello, my number today is {: >4}", 42).unwrap();

See lcd-example-bluepill for the working example for the Blue Pill development board.

Structs

Display

Object implementing HD44780 protocol. Stateless (could be created as many times as needed).

Enums

Command
Direction
DisplayBlink
DisplayCursor
DisplayMode
EntryModeDirection
EntryModeShift
FunctionDots
FunctionLine
FunctionMode
Scroll

Traits

Delay
Hardware
InputCapableHardware