diff options
| -rw-r--r-- | docs/feature_st7565.md | 4 | ||||
| -rw-r--r-- | drivers/lcd/st7565.c | 16 | ||||
| -rw-r--r-- | drivers/lcd/st7565.h | 4 | 
3 files changed, 24 insertions, 0 deletions
| diff --git a/docs/feature_st7565.md b/docs/feature_st7565.md index 7db0f9ac4a..de3e44d8e9 100644 --- a/docs/feature_st7565.md +++ b/docs/feature_st7565.md @@ -262,6 +262,10 @@ void st7565_task(void);  // Called at the start of st7565_task, weak function overridable by the user  void st7565_task_user(void); +// Inverts the display +// Returns true if the screen was or is inverted +bool st7565_invert(bool invert); +  // Returns the maximum number of characters that will fit on a line  uint8_t st7565_max_chars(void); diff --git a/drivers/lcd/st7565.c b/drivers/lcd/st7565.c index ee2661a5eb..49b13c00f1 100644 --- a/drivers/lcd/st7565.c +++ b/drivers/lcd/st7565.c @@ -31,6 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #define DISPLAY_ALL_ON 0xA5  #define DISPLAY_ALL_ON_RESUME 0xA4  #define NORMAL_DISPLAY 0xA6 +#define INVERT_DISPLAY 0xA7  #define DISPLAY_ON 0xAF  #define DISPLAY_OFF 0xAE  #define NOP 0xE3 @@ -72,6 +73,7 @@ uint8_t *          st7565_cursor;  ST7565_BLOCK_TYPE  st7565_dirty       = 0;  bool               st7565_initialized = false;  bool               st7565_active      = false; +bool               st7565_inverted    = false;  display_rotation_t st7565_rotation    = DISPLAY_ROTATION_0;  #if ST7565_TIMEOUT > 0  uint32_t st7565_timeout; @@ -429,6 +431,20 @@ __attribute__((weak)) void st7565_off_user(void) {}  bool st7565_is_on(void) { return st7565_active; } +bool st7565_invert(bool invert) { +    if (!st7565_initialized) { +        return st7565_inverted; +    } + +    if (invert != st7565_inverted) { +        spi_start(ST7565_SS_PIN, false, 0, ST7565_SPI_CLK_DIVISOR); +        st7565_send_cmd(invert ? INVERT_DISPLAY : NORMAL_DISPLAY); +        spi_stop(); +        st7565_inverted = invert; +    } +    return st7565_inverted; +} +  uint8_t st7565_max_chars(void) { return ST7565_DISPLAY_WIDTH / ST7565_FONT_WIDTH; }  uint8_t st7565_max_lines(void) { return ST7565_DISPLAY_HEIGHT / ST7565_FONT_HEIGHT; } diff --git a/drivers/lcd/st7565.h b/drivers/lcd/st7565.h index 53cfc9a810..d453dbe6da 100644 --- a/drivers/lcd/st7565.h +++ b/drivers/lcd/st7565.h @@ -202,6 +202,10 @@ void st7565_task(void);  // Called at the start of st7565_task, weak function overridable by the user  void st7565_task_user(void); +// Inverts the display +// Returns true if the screen was or is inverted +bool st7565_invert(bool invert); +  // Returns the maximum number of characters that will fit on a line  uint8_t st7565_max_chars(void); | 
