7 unstable releases
0.4.1 | Jan 3, 2022 |
---|---|
0.4.0 | Jan 3, 2022 |
0.4.0-alpha.0 | Feb 15, 2021 |
0.3.0 | Sep 27, 2017 |
0.1.1 | Sep 11, 2017 |
#781 in Embedded development
33 downloads per month
Used in lcd-pcf8574
22KB
300 lines
lcd
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
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(&mut self, bit: bool) {
// should set R/S pin on LCD screen
}
fn enable(&mut self, bit: bool) {
// should set EN pin on LCD screen
}
fn data(&mut 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
}
// optionally, implement the following three functions to enable polling busy flag instead of delay
fn can_read(&self) -> bool {
true
}
fn rw(&mut 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(&mut self) -> u8 {
0 // read data from the port
}
}
// implement `Delay` trait to allow library to sleep for the given amount of time
impl Delay for HW {
fn delay_us(&mut self, delay_usec: u32) {
// should sleep 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.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.
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
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.