diff --git a/Source/Display.cpp b/Source/Display.cpp index 531e40c..b458339 100644 --- a/Source/Display.cpp +++ b/Source/Display.cpp @@ -10,6 +10,8 @@ #include "STM32G071KBT6.hpp" #include "Display.hpp" +/// address for character generator ram +#define CMD_CGRAM_ADDR 0x40u #define pulse_delay() for(uint32_t i = 0UL; i < 1UL; i++); #define PIN_RS LL_GPIO_PIN_4 #define PIN_RW LL_GPIO_PIN_5 @@ -147,6 +149,32 @@ namespace ElektronischeLast lcd_cmd(0x80u | line | (position & 0x7F)); } + /// \brief switch display on/off and set cursor mode + /// \param[in] display \ref eDisplay_t + /// \param[in] cursor \ref eCursor_t + /// \param[in] blink \ref eCursorBlink_t + void Display::lcd_set_display(eDisplay_t display, eCursor_t cursor, eCursorBlink_t blink) + { + lcd_cmd(0x08u | display | cursor | blink); + } + + /// \brief set user defined character in display ram + /// \details e.g. https://maxpromer.github.io/LCD-Character-Creator/ to generate character data + /// \param[in] character \ref eUserDefinedCharakter_t + /// \param[in] character_data pixel-data of character (8-Byte) + void Display::lcd_set_user_chars(Display::UserDefinedCharakter_t character, const uint8_t character_data[]) + { + lcd_cmd((uint8_t)character | CMD_CGRAM_ADDR); + for(uint8_t idx = 0u; idx < 8u; idx++) + { + while(!ready_for_data()) + { + run(); + } + lcd_data(character_data[idx]); + } + } + void Display::print(const char* const string) { strncpy(this->string, string, sizeof(this->string)); diff --git a/Source/Display.hpp b/Source/Display.hpp index dccefe8..a96e2f8 100644 --- a/Source/Display.hpp +++ b/Source/Display.hpp @@ -70,6 +70,27 @@ namespace ElektronischeLast Line2 = 0x40, //!< Select second display line } Line_t; + /// \brief Display State + typedef enum + { + eDisplayOff = 0, //!< Display off + eDispalyOn = 4 //!< Display on + } eDisplay_t; + + /// \brief Cursor State + typedef enum + { + eCursorOff = 0, //!< Cursor off + eCursorOn = 2 //!< Cursor on + } eCursor_t; + + /// \brief Cursor blink mode + typedef enum + { + eCursorBlinkOff = 0, //!< no Cursor blink + eCursorBlinkOn = 1 //!< Cursor blink + } eCursorBlink_t; + typedef enum { StateIdle, @@ -92,8 +113,10 @@ namespace ElektronischeLast void run(void); void set_backlight(bool on); void set_cursor(Line_t line, std::uint32_t position); + void lcd_set_display(eDisplay_t display, eCursor_t cursor, eCursorBlink_t blink); void print(const char* const string); bool ready_for_data(void); + void lcd_set_user_chars(Display::UserDefinedCharakter_t character, const uint8_t character_data[]); private: State_t current_state; State_t next_state;