diff --git a/src/character.rs b/src/character.rs new file mode 100644 index 0000000..ef968ee --- /dev/null +++ b/src/character.rs @@ -0,0 +1,40 @@ +use core::iter::once; + +use embedded_hal::delay::DelayNs; + +use crate::{bus::DataBus, charset::CharsetWithFallback, error::Result, memory_map::DisplayMemoryMap, HD44780}; + +pub struct CharacterDefinition { + pub pattern: [u8; 10], + pub cursor: u8, + + // /// Since lines 12 to 16 are not used for display, + // /// they can be used for general data RAM. + // pub data: Option<[u8; 5]>, +} + +impl HD44780 +where + B: DataBus, + M: DisplayMemoryMap, + C: CharsetWithFallback, +{ + pub fn define_custom_character( + &mut self, + code: u8, + def: &CharacterDefinition, + delay: &mut D, + ) -> Result<(), B::Error> { + self.write_command(0b01000000 | (code & 0b11) << 4, delay)?; + delay.delay_us(100); + + let lines = def.pattern.iter().cloned().chain(once(def.cursor)); + for line in lines { + self.write_byte(line, delay)?; + } + + // Change back to DDRAM + self.set_cursor_pos(0, delay)?; + Ok(()) + } +} diff --git a/src/lib.rs b/src/lib.rs index c28dd35..33200d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,6 +17,8 @@ pub mod entry_mode; use entry_mode::{CursorMode, EntryMode}; +pub mod character; + pub mod display_mode; pub mod display_size;