lcd 0.2.0

Hitachi HD44780-compatible LCD screen support for embedded development CircleCI Codecov


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.


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 {

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

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

// initialization
lcd.init(FunctionLine::Line2, FunctionDots::Dots5x8);
lcd.entry_mode(EntryModeDirection::EntryRight, EntryModeShift::NoShift);

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


Licensed under either of

at your option.


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.