/*
 * Copyright (c) 2023, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*!****************************************************************************
 *  @file       dl_lcd.h
 *  @brief      Liquid Crystal Display (LCD) Driver Library
 *  @defgroup   LCD Liquid Crystal Display (LCD)
 *
 *  @anchor ti_dl_dl_lcd_Overview
 *  # Overview
 *
 *  The LCD Library allows full configuration of the MSPM0 LCD module.
 *  The LCD controller creates the AC segment and common voltage signals to
 *  directly drive LCD displays.
 *
 *  <hr>
 ******************************************************************************
 */
/** @addtogroup LCD
 * @{
 */
#ifndef ti_dl_dl_lcd__include
#define ti_dl_dl_lcd__include

#include <stdbool.h>
#include <stdint.h>

#include <ti/devices/msp/msp.h>
#include <ti/driverlib/dl_common.h>

#ifdef __MSPM0_HAS_LCD__

#ifdef __cplusplus
extern "C" {
#endif

/* clang-format off */

/** @addtogroup DL_LCD_INTERRUPT
 *  @{
 */
/*!
 *  @brief Interrupt raised when there is the start of a new LCD frame
 */
#define DL_LCD_INTERRUPT_FRAME_START                    (LCD_IMASK_FRMSTART_SET)

/*!
 *  @brief Interrupt raised when blinking segments are turned off
 */
#define DL_LCD_INTERRUPT_BLINKING_SEGMENTS_OFF            (LCD_IMASK_BLKOFF_SET)

/*!
 *  @brief Interrupt raised when blinking segments are turned on
 */
#define DL_LCD_INTERRUPT_BLINKING_SEGMENTS_ON              (LCD_IMASK_BLKON_SET)

/** @}*/

/** @addtogroup DL_LCD_SEGMENT_LINE
 *  @{
 */
/*!
 *  @brief LCD Pin 0
 */
#define DL_LCD_SEGMENT_LINE_0                                                (0)
/*!
 *  @brief LCD Pin 1
 */
#define DL_LCD_SEGMENT_LINE_1                                                (1)
/*!
 *  @brief LCD Pin 2
 */
#define DL_LCD_SEGMENT_LINE_2                                                (2)
/*!
 *  @brief LCD Pin 3
 */
#define DL_LCD_SEGMENT_LINE_3                                                (3)
/*!
 *  @brief LCD Pin 4
 */
#define DL_LCD_SEGMENT_LINE_4                                                (4)
/*!
 *  @brief LCD Pin 5
 */
#define DL_LCD_SEGMENT_LINE_5                                                (5)
/*!
 *  @brief LCD Pin 6
 */
#define DL_LCD_SEGMENT_LINE_6                                                (6)
/*!
 *  @brief LCD Pin 7
 */
#define DL_LCD_SEGMENT_LINE_7                                                (7)
/*!
 *  @brief LCD Pin 8
 */
#define DL_LCD_SEGMENT_LINE_8                                                (8)
/*!
 *  @brief LCD Pin 9
 */
#define DL_LCD_SEGMENT_LINE_9                                                (9)
/*!
 *  @brief LCD Pin 10
 */
#define DL_LCD_SEGMENT_LINE_10                                              (10)
/*!
 *  @brief LCD Pin 11
 */
#define DL_LCD_SEGMENT_LINE_11                                              (11)
/*!
 *  @brief LCD Pin 12
 */
#define DL_LCD_SEGMENT_LINE_12                                              (12)
/*!
 *  @brief LCD Pin 13
 */
#define DL_LCD_SEGMENT_LINE_13                                              (13)
/*!
 *  @brief LCD Pin 14
 */
#define DL_LCD_SEGMENT_LINE_14                                              (14)
/*!
 *  @brief LCD Pin 15
 */
#define DL_LCD_SEGMENT_LINE_15                                              (15)
/*!
 *  @brief LCD Pin 16
 */
#define DL_LCD_SEGMENT_LINE_16                                              (16)
/*!
 *  @brief LCD Pin 17
 */
#define DL_LCD_SEGMENT_LINE_17                                              (17)
/*!
 *  @brief LCD Pin 18
 */
#define DL_LCD_SEGMENT_LINE_18                                              (18)
/*!
 *  @brief LCD Pin 19
 */
#define DL_LCD_SEGMENT_LINE_19                                              (19)
/*!
 *  @brief LCD Pin 20
 */
#define DL_LCD_SEGMENT_LINE_20                                              (20)
/*!
 *  @brief LCD Pin 21
 */
#define DL_LCD_SEGMENT_LINE_21                                              (21)
/*!
 *  @brief LCD Pin 22
 */
#define DL_LCD_SEGMENT_LINE_22                                              (22)
/*!
 *  @brief LCD Pin 23
 */
#define DL_LCD_SEGMENT_LINE_23                                              (23)
/*!
 *  @brief LCD Pin 24
 */
#define DL_LCD_SEGMENT_LINE_24                                              (24)
/*!
 *  @brief LCD Pin 25
 */
#define DL_LCD_SEGMENT_LINE_25                                              (25)
/*!
 *  @brief LCD Pin 26
 */
#define DL_LCD_SEGMENT_LINE_26                                              (26)
/*!
 *  @brief LCD Pin 27
 */
#define DL_LCD_SEGMENT_LINE_27                                              (27)
/*!
 *  @brief LCD Pin 28
 */
#define DL_LCD_SEGMENT_LINE_28                                              (28)
/*!
 *  @brief LCD Pin 29
 */
#define DL_LCD_SEGMENT_LINE_29                                              (29)
/*!
 *  @brief LCD Pin 30
 */
#define DL_LCD_SEGMENT_LINE_30                                              (30)
/*!
 *  @brief LCD Pin 31
 */
#define DL_LCD_SEGMENT_LINE_31                                              (31)
/*!
 *  @brief LCD Pin 32
 */
#define DL_LCD_SEGMENT_LINE_32                                              (32)
/*!
 *  @brief LCD Pin 33
 */
#define DL_LCD_SEGMENT_LINE_33                                              (33)
/*!
 *  @brief LCD Pin 34
 */
#define DL_LCD_SEGMENT_LINE_34                                              (34)
/*!
 *  @brief LCD Pin 35
 */
#define DL_LCD_SEGMENT_LINE_35                                              (35)
/*!
 *  @brief LCD Pin 36
 */
#define DL_LCD_SEGMENT_LINE_36                                              (36)
/*!
 *  @brief LCD Pin 37
 */
#define DL_LCD_SEGMENT_LINE_37                                              (37)
/*!
 *  @brief LCD Pin 38
 */
#define DL_LCD_SEGMENT_LINE_38                                              (38)
/*!
 *  @brief LCD Pin 39
 */
#define DL_LCD_SEGMENT_LINE_39                                              (39)
/*!
 *  @brief LCD Pin 40
 */
#define DL_LCD_SEGMENT_LINE_40                                              (40)
/*!
 *  @brief LCD Pin 41
 */
#define DL_LCD_SEGMENT_LINE_41                                              (41)
/*!
 *  @brief LCD Pin 42
 */
#define DL_LCD_SEGMENT_LINE_42                                              (42)
/*!
 *  @brief LCD Pin 43
 */
#define DL_LCD_SEGMENT_LINE_43                                              (43)
/*!
 *  @brief LCD Pin 44
 */
#define DL_LCD_SEGMENT_LINE_44                                              (44)
/*!
 *  @brief LCD Pin 45
 */
#define DL_LCD_SEGMENT_LINE_45                                              (45)
/*!
 *  @brief LCD Pin 46
 */
#define DL_LCD_SEGMENT_LINE_46                                              (46)
/*!
 *  @brief LCD Pin 47
 */
#define DL_LCD_SEGMENT_LINE_47                                              (47)
/*!
 *  @brief LCD Pin 48
 */
#define DL_LCD_SEGMENT_LINE_48                                              (48)
/*!
 *  @brief LCD Pin 49
 */
#define DL_LCD_SEGMENT_LINE_49                                              (49)
/*!
 *  @brief LCD Pin 50
 */
#define DL_LCD_SEGMENT_LINE_50                                              (50)
/*!
 *  @brief LCD Pin 51
 */
#define DL_LCD_SEGMENT_LINE_51                                              (51)
/*!
 *  @brief LCD Pin 52
 */
#define DL_LCD_SEGMENT_LINE_52                                              (52)
/*!
 *  @brief LCD Pin 53
 */
#define DL_LCD_SEGMENT_LINE_53                                              (53)
/*!
 *  @brief LCD Pin 54
 */
#define DL_LCD_SEGMENT_LINE_54                                              (54)
/*!
 *  @brief LCD Pin 55
 */
#define DL_LCD_SEGMENT_LINE_55                                              (55)
/*!
 *  @brief LCD Pin 56
 */
#define DL_LCD_SEGMENT_LINE_56                                              (56)
/*!
 *  @brief LCD Pin 57
 */
#define DL_LCD_SEGMENT_LINE_57                                              (57)
/*!
 *  @brief LCD Pin 58
 */
#define DL_LCD_SEGMENT_LINE_58                                              (58)
/*!
 *  @brief LCD Pin 59
 */
#define DL_LCD_SEGMENT_LINE_59                                              (59)
/*!
 *  @brief LCD Pin 60
 */
#define DL_LCD_SEGMENT_LINE_60                                              (60)
/*!
 *  @brief LCD Pin 61
 */
#define DL_LCD_SEGMENT_LINE_61                                              (61)
/*!
 *  @brief LCD Pin 62
 */
#define DL_LCD_SEGMENT_LINE_62                                              (62)
/*!
 *  @brief LCD Pin 63
 */
#define DL_LCD_SEGMENT_LINE_63                                              (63)
 /** @}*/

/** @addtogroup DL_LCD_MEMORY_BIT
 *  @{
 */
/*!
 *  @brief  Bit 0 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM0
 *  1b = Pin L[2*index] is used as COM0
 */
#define DL_LCD_MEMORY_BIT_0                                (LCD_LCDM_MBIT0_MASK)

/*!
 *  @brief  Bit 1 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM1
 *  1b = Pin L[2*index] is used as COM1
 */
#define DL_LCD_MEMORY_BIT_1                                (LCD_LCDM_MBIT1_MASK)

/*!
 *  @brief  Bit 2 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM2
 *  1b = Pin L[2*index] is used as COM2
 */
#define DL_LCD_MEMORY_BIT_2                                (LCD_LCDM_MBIT2_MASK)

/*!
 *  @brief  Bit 3 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM3
 *  1b = Pin L[2*index] is used as COM3
 */
#define DL_LCD_MEMORY_BIT_3                                (LCD_LCDM_MBIT3_MASK)

/*!
 *  @brief  Bit 4 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM4
 *  1b = Pin L[2*index] is used as COM4
 */
#define DL_LCD_MEMORY_BIT_4                                (LCD_LCDM_MBIT4_MASK)

/*!
 *  @brief  Bit 5 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM5
 *  1b = Pin L[2*index] is used as COM5
 */
#define DL_LCD_MEMORY_BIT_5                                (LCD_LCDM_MBIT5_MASK)

/*!
 *  @brief  Bit 6 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM6
 *  1b = Pin L[2*index] is used as COM6
 */
#define DL_LCD_MEMORY_BIT_6                                (LCD_LCDM_MBIT6_MASK)

/*!
 *  @brief  Bit 7 inside LCD memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM7
 *  1b = Pin L[2*index] is used as COM7
 */
#define DL_LCD_MEMORY_BIT_7                                (LCD_LCDM_MBIT7_MASK)

/** @}*/

/** @addtogroup DL_LCD_BLINK_MEMORY_BIT
 *  @{
 */
/*!
 *  @brief  Bit 0 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM0
 *  1b = Pin L[2*index] is used as COM0
 */
#define DL_LCD_BLINK_MEMORY_BIT_0                         (LCD_LCDBM_MBIT0_MASK)

/*!
 *  @brief  Bit 1 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM1
 *  1b = Pin L[2*index] is used as COM1
 */
#define DL_LCD_BLINK_MEMORY_BIT_1                         (LCD_LCDBM_MBIT1_MASK)

/*!
 *  @brief  Bit 2 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM2
 *  1b = Pin L[2*index] is used as COM2
 */
#define DL_LCD_BLINK_MEMORY_BIT_2                         (LCD_LCDBM_MBIT2_MASK)

/*!
 *  @brief Bit 3 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM3
 *  1b = Pin L[2*index] is used as COM3
 */
#define DL_LCD_BLINK_MEMORY_BIT_3                         (LCD_LCDBM_MBIT3_MASK)

/*!
 *  @brief  Bit 4 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM4
 *  1b = Pin L[2*index] is used as COM4
 */
#define DL_LCD_BLINK_MEMORY_BIT_4                         (LCD_LCDBM_MBIT4_MASK)

/*!
 *  @brief  Bit 5 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM5
 *  1b = Pin L[2*index] is used as COM5
 */
#define DL_LCD_BLINK_MEMORY_BIT_5                         (LCD_LCDBM_MBIT5_MASK)

/*!
 *  @brief  Bit 6 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM6
 *  1b = Pin L[2*index] is used as COM6
 */
#define DL_LCD_BLINK_MEMORY_BIT_6                         (LCD_LCDBM_MBIT6_MASK)

/*!
 *  @brief  Bit 7 inside LCD blink memory index registers
 *
 *  If LCD L[2*index] is selected as (1) segment line: 0b = LCD segment off
 *  1b = LCD segment on (2) common line: 0b = Pin L[2*index] not used as COM7
 *  1b = Pin L[2*index] is used as COM7
 */
#define DL_LCD_BLINK_MEMORY_BIT_7                         (LCD_LCDBM_MBIT7_MASK)

/** @}*/

/*! @enum DL_LCD_FREQ_DIVIDE */
typedef enum {
    /*! Divide fLCD by 1 */
    DL_LCD_FREQ_DIVIDE_1 = LCD_LCDCTL0_LCDDIVX_DIV_BY_1,
    /*! Divide fLCD by 2 */
    DL_LCD_FREQ_DIVIDE_2 = LCD_LCDCTL0_LCDDIVX_DIV_BY_2,
    /*! Divide fLCD by 3 */
    DL_LCD_FREQ_DIVIDE_3 = LCD_LCDCTL0_LCDDIVX_DIV_BY_3,
    /*! Divide fLCD by 4 */
    DL_LCD_FREQ_DIVIDE_4 = LCD_LCDCTL0_LCDDIVX_DIV_BY_4,
    /*! Divide fLCD by 5 */
    DL_LCD_FREQ_DIVIDE_5 = LCD_LCDCTL0_LCDDIVX_DIV_BY_5,
    /*! Divide fLCD by 6 */
    DL_LCD_FREQ_DIVIDE_6 = LCD_LCDCTL0_LCDDIVX_DIV_BY_6,
    /*! Divide fLCD by 7 */
    DL_LCD_FREQ_DIVIDE_7 = LCD_LCDCTL0_LCDDIVX_DIV_BY_7,
    /*! Divide fLCD by 8 */
    DL_LCD_FREQ_DIVIDE_8 = LCD_LCDCTL0_LCDDIVX_DIV_BY_8,
    /*! Divide fLCD by 9 */
    DL_LCD_FREQ_DIVIDE_9 = LCD_LCDCTL0_LCDDIVX_DIV_BY_9,
    /*! Divide fLCD by 10 */
    DL_LCD_FREQ_DIVIDE_10 = LCD_LCDCTL0_LCDDIVX_DIV_BY_10,
    /*! Divide fLCD by 11 */
    DL_LCD_FREQ_DIVIDE_11 = LCD_LCDCTL0_LCDDIVX_DIV_BY_11,
    /*! Divide fLCD by 12 */
    DL_LCD_FREQ_DIVIDE_12 = LCD_LCDCTL0_LCDDIVX_DIV_BY_12,
    /*! Divide fLCD by 13 */
    DL_LCD_FREQ_DIVIDE_13 = LCD_LCDCTL0_LCDDIVX_DIV_BY_13,
    /*! Divide fLCD by 14 */
    DL_LCD_FREQ_DIVIDE_14 = LCD_LCDCTL0_LCDDIVX_DIV_BY_14,
    /*! Divide fLCD by 15 */
    DL_LCD_FREQ_DIVIDE_15 = LCD_LCDCTL0_LCDDIVX_DIV_BY_15,
    /*! Divide fLCD by 16 */
    DL_LCD_FREQ_DIVIDE_16 = LCD_LCDCTL0_LCDDIVX_DIV_BY_16,
    /*! Divide fLCD by 17 */
    DL_LCD_FREQ_DIVIDE_17 = LCD_LCDCTL0_LCDDIVX_DIV_BY_17,
    /*! Divide fLCD by 18 */
    DL_LCD_FREQ_DIVIDE_18 = LCD_LCDCTL0_LCDDIVX_DIV_BY_18,
    /*! Divide fLCD by 19 */
    DL_LCD_FREQ_DIVIDE_19 = LCD_LCDCTL0_LCDDIVX_DIV_BY_19,
    /*! Divide fLCD by 20 */
    DL_LCD_FREQ_DIVIDE_20 = LCD_LCDCTL0_LCDDIVX_DIV_BY_20,
    /*! Divide fLCD by 21 */
    DL_LCD_FREQ_DIVIDE_21 = LCD_LCDCTL0_LCDDIVX_DIV_BY_21,
    /*! Divide fLCD by 22 */
    DL_LCD_FREQ_DIVIDE_22 = LCD_LCDCTL0_LCDDIVX_DIV_BY_22,
    /*! Divide fLCD by 23 */
    DL_LCD_FREQ_DIVIDE_23 = LCD_LCDCTL0_LCDDIVX_DIV_BY_23,
    /*! Divide fLCD by 24 */
    DL_LCD_FREQ_DIVIDE_24 = LCD_LCDCTL0_LCDDIVX_DIV_BY_24,
    /*! Divide fLCD by 25 */
    DL_LCD_FREQ_DIVIDE_25 = LCD_LCDCTL0_LCDDIVX_DIV_BY_25,
    /*! Divide fLCD by 26 */
    DL_LCD_FREQ_DIVIDE_26 = LCD_LCDCTL0_LCDDIVX_DIV_BY_26,
    /*! Divide fLCD by 27 */
    DL_LCD_FREQ_DIVIDE_27 = LCD_LCDCTL0_LCDDIVX_DIV_BY_27,
    /*! Divide fLCD by 28 */
    DL_LCD_FREQ_DIVIDE_28 = LCD_LCDCTL0_LCDDIVX_DIV_BY_28,
    /*! Divide fLCD by 29 */
    DL_LCD_FREQ_DIVIDE_29 = LCD_LCDCTL0_LCDDIVX_DIV_BY_29,
    /*! Divide fLCD by 30 */
    DL_LCD_FREQ_DIVIDE_30 = LCD_LCDCTL0_LCDDIVX_DIV_BY_30,
    /*! Divide fLCD by 31 */
    DL_LCD_FREQ_DIVIDE_31 = LCD_LCDCTL0_LCDDIVX_DIV_BY_31,
    /*! Divide fLCD by 32 */
    DL_LCD_FREQ_DIVIDE_32 = LCD_LCDCTL0_LCDDIVX_DIV_BY_32,
} DL_LCD_FREQ_DIVIDE;

/*! @enum DL_LCD_MUX_RATE */
typedef enum {
    /*! Select LCD Mode: static */
    DL_LCD_MUX_RATE_STATIC = LCD_LCDCTL0_LCDMXX_MX_STATIC,
    /*! Select LCD Mode: 2-mux */
    DL_LCD_MUX_RATE_2 = LCD_LCDCTL0_LCDMXX_MX_2,
    /*! Select LCD Mode: 3-mux */
    DL_LCD_MUX_RATE_3 = LCD_LCDCTL0_LCDMXX_MX_3,
    /*! Select LCD Mode: 4-mux */
    DL_LCD_MUX_RATE_4 = LCD_LCDCTL0_LCDMXX_MX_4,
    /*! Select LCD Mode: 5-mux */
    DL_LCD_MUX_RATE_5 = LCD_LCDCTL0_LCDMXX_MX_5,
    /*! Select LCD Mode: 6-mux */
    DL_LCD_MUX_RATE_6 = LCD_LCDCTL0_LCDMXX_MX_6,
    /*! Select LCD Mode: 7-mux */
    DL_LCD_MUX_RATE_7 = LCD_LCDCTL0_LCDMXX_MX_7,
    /*! Select LCD Mode: 8-mux */
    DL_LCD_MUX_RATE_8 = LCD_LCDCTL0_LCDMXX_MX_8,
} DL_LCD_MUX_RATE;

/*! @enum DL_LCD_WAVEFORM_POWERMODE */
typedef enum {
    /*! Select low power LCD waveforms */
    DL_LCD_WAVEFORM_POWERMODE_LOWPOWER = LCD_LCDCTL0_LCDLP_LP_LCD,
    /*! Select standard LCD waveforms */
    DL_LCD_WAVEFORM_POWERMODE_STANDARD = LCD_LCDCTL0_LCDLP_STD_LCD,
} DL_LCD_WAVEFORM_POWERMODE;

/*! @enum DL_LCD_BLINKING_DIVIDE */
typedef enum {
    /*! Divide LCD blinking frequency by 2 */
    DL_LCD_BLINKING_DIVIDE_BY_2 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_2,
    /*! Divide LCD blinking frequency by 4 */
    DL_LCD_BLINKING_DIVIDE_BY_4 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_4,
    /*! Divide LCD blinking frequency by 8 */
    DL_LCD_BLINKING_DIVIDE_BY_8 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_8,
    /*! Divide LCD blinking frequency by 16 */
    DL_LCD_BLINKING_DIVIDE_BY_16 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_16,
    /*! Divide LCD blinking frequency by 32 */
    DL_LCD_BLINKING_DIVIDE_BY_32 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_32,
    /*! Divide LCD blinking frequency by 64 */
    DL_LCD_BLINKING_DIVIDE_BY_64 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_64,
    /*! Divide LCD blinking frequency by 128 */
    DL_LCD_BLINKING_DIVIDE_BY_128 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_128,
    /*! Divide LCD blinking frequency by 256 */
    DL_LCD_BLINKING_DIVIDE_BY_256 = LCD_LCDBLKCTL_LCDBLKPREX_DIV_BY_256,
} DL_LCD_BLINKING_DIVIDE;

/*! @enum DL_LCD_BLINKING_MODE */
typedef enum {
    /*! Blinking disabled */
    DL_LCD_BLINKING_MODE_DISABLED = LCD_LCDBLKCTL_LCDBLKMODX_BLINK_DISABLE,
    /*! Blinking of individual segments as enabled in LCDBMx */
    DL_LCD_BLINKING_MODE_INDIVIDUAL_SEGMENTS =
        LCD_LCDBLKCTL_LCDBLKMODX_BLINK_SELECED,
    /*! Blinking of all segments */
    DL_LCD_BLINKING_MODE_ALL_SEGMENTS = LCD_LCDBLKCTL_LCDBLKMODX_BLINK_ALL,
    /*! Switch between display contents stored in LCDMx and LCDMBx */
    DL_LCD_BLINKING_MODE_TOGGLE = LCD_LCDBLKCTL_LCDBLKMODX_BKINK_TOGGLE,
} DL_LCD_BLINKING_MODE;

/*! @enum DL_LCD_CHARGE_PUMP_FREQUENCY */
typedef enum {
    /*! 32.768 kHz / 1 / 8 = 4.096 kHz  */
    DL_LCD_CHARGE_PUMP_FREQUENCY_4096HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_1_BY_8,
    /*! 32.768 kHz / 2 / 8 = 2.048 kHz  */
    DL_LCD_CHARGE_PUMP_FREQUENCY_2048HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_2_BY_8,
    /*! 32.768 kHz / 3 / 8 = 1.365 kHz  */
    DL_LCD_CHARGE_PUMP_FREQUENCY_1365HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_3_BY_8,
    /*! 32.768 kHz / 4 / 8 = 1.024 kHz  */
    DL_LCD_CHARGE_PUMP_FREQUENCY_1024HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_4_BY_8,
    /*! 32.768 kHz / 5 / 8 = 819 Hz     */
    DL_LCD_CHARGE_PUMP_FREQUENCY_819HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_5_BY_8,
    /*! 32.768 kHz / 6 / 8 = 682 Hz     */
    DL_LCD_CHARGE_PUMP_FREQUENCY_682HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_6_BY_8,
    /*! 32.768 kHz / 7 / 8 = 585 Hz     */
    DL_LCD_CHARGE_PUMP_FREQUENCY_585HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_7_BY_8,
    /*! 32.768 kHz / 8 / 8 = 512 Hz     */
    DL_LCD_CHARGE_PUMP_FREQUENCY_512HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_8_BY_8,
    /*! 32.768 kHz / 9 / 8 = 455 Hz     */
    DL_LCD_CHARGE_PUMP_FREQUENCY_455HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_9_BY_8,
    /*! 32.768 kHz / 10 / 8 = 409 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_409HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_10_BY_8,
    /*! 32.768 kHz / 11 / 8 = 372 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_372HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_11_BY_8,
    /*! 32.768 kHz / 12 / 8 = 341 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_341HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_12_BY_8,
    /*! 32.768 kHz / 13 / 8 = 315 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_315HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_13_BY_8,
    /*! 32.768 kHz / 14 / 8 = 292 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_292HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_14_BY_8,
    /*! 32.768 kHz / 15 / 8 = 273 Hz    */
    DL_LCD_CHARGE_PUMP_FREQUENCY_273HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_15_BY_8,
    /*! 32.768 kHz / 16 / 8 = 256 Hz   */
    DL_LCD_CHARGE_PUMP_FREQUENCY_256HZ = LCD_LCDVCTL_LCDCPFSELX_DIV_BY_16_BY_8,
} DL_LCD_CHARGE_PUMP_FREQUENCY;

/*! @enum DL_LCD_VREF_INTERNAL */
typedef enum {
    /*! 2.60 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_60V = LCD_LCDVCTL_VLCDX_SEL_2P60V,
    /*! 2.66 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_66V = LCD_LCDVCTL_VLCDX_SEL_2P66V,
    /*! 2.72 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_72V = LCD_LCDVCTL_VLCDX_SEL_2P72V,
    /*! 2.78 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_78V = LCD_LCDVCTL_VLCDX_SEL_2P78V,
    /*! 2.84 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_84V = LCD_LCDVCTL_VLCDX_SEL_2P84V,
    /*! 2.90 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_90V = LCD_LCDVCTL_VLCDX_SEL_2P90V,
    /*! 2.96 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_2_96V = LCD_LCDVCTL_VLCDX_SEL_2P96V,
    /*! 3.02 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_02V = LCD_LCDVCTL_VLCDX_SEL_3P02V,
    /*! 3.08 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_08V = LCD_LCDVCTL_VLCDX_SEL_3P08V,
    /*! 3.14 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_14V = LCD_LCDVCTL_VLCDX_SEL_3P14V,
    /*! 3.20 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_20V = LCD_LCDVCTL_VLCDX_SEL_3P20V,
    /*! 3.26 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_26V = LCD_LCDVCTL_VLCDX_SEL_3P26V,
    /*! 3.32 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_32V = LCD_LCDVCTL_VLCDX_SEL_3P32V,
    /*! 3.38 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_38V = LCD_LCDVCTL_VLCDX_SEL_3P38V,
    /*! 3.44 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_44V = LCD_LCDVCTL_VLCDX_SEL_3P44V,
    /*! 3.50 V internal reference voltage select on R13  */
    DL_LCD_VREF_INTERNAL_3_50V = LCD_LCDVCTL_VLCDX_SEL_3P50V,
} DL_LCD_VREF_INTERNAL;

/*! @enum DL_LCD_R33_SOURCE */
typedef enum {
    /*! R33 is supplied from charge pump */
    DL_LCD_R33_SOURCE_EXTERNAL = LCD_LCDVCTL_LCDSELVDD_SEL_EXT_SUPPLY,
    /*! R33 is supplied from AVDD internally */
    DL_LCD_R33_SOURCE_INTERNAL = LCD_LCDVCTL_LCDSELVDD_SEL_AVDD,
} DL_LCD_R33_SOURCE;

/*! @enum DL_LCD_POWER_MODE */
typedef enum {
    /*! Low power resistor ladder generates bias voltage for the LCD */
    DL_LCD_POWER_MODE_LOW = LCD_LCDVCTL_LCD_HP_LP_LP_MODE,
    /*! Higher power resistor ladder generates bias voltage for the LCD */
    DL_LCD_POWER_MODE_HIGH = LCD_LCDVCTL_LCD_HP_LP_HP_MODE,
} DL_LCD_POWER_MODE;

/*! @enum DL_LCD_BIAS_VOLTAGE_SOURCE */
typedef enum {
    /*! Bias voltage sourced from R33 pin */
    DL_LCD_BIAS_VOLTAGE_SOURCE_R33 = LCD_LCDVCTL_VLCDSEL_VDD_R33_SEL_R33,
    /*! Bias voltage sourced from internal supply voltage AVDD */
    DL_LCD_BIAS_VOLTAGE_SOURCE_AVDD = LCD_LCDVCTL_VLCDSEL_VDD_R33_SEL_AVDD,
} DL_LCD_BIAS_VOLTAGE_SOURCE;

/*! @enum DL_LCD_BIAS */
typedef enum {
    /*! For 5-mux to 8-mux modes only. 1/3 bias */
    DL_LCD_BIAS_ONE_THIRD = LCD_LCDVCTL_LCDBIASSEL_ONE_BY_3_BIAS,
    /*! For 5-mux to 8-mux modes only. 1/4 bias */
    DL_LCD_BIAS_ONE_FOURTH = LCD_LCDVCTL_LCDBIASSEL_ONE_BY_4_BIAS,
} DL_LCD_BIAS;

/*! @enum DL_LCD_REFERENCE_MODE */
typedef enum {
    /*! R13 voltage in static mode */
    DL_LCD_REFERENCE_MODE_STATIC = LCD_LCDVCTL_LCDREFMODE_STATIC_MODE,
    /*! R13 voltage in switched mode */
    DL_LCD_REFERENCE_MODE_SWITCHED = LCD_LCDVCTL_LCDREFMODE_SWITCHED_MODE,
} DL_LCD_REFERENCE_MODE;

/*! @enum DL_LCD_DISP */
typedef enum {
    /*! Display content of LCD memory registers LCDMx */
    DL_LCD_DISPLAY_REGISTERS_MEMORY = LCD_LCDMEMCTL_LCDDISP_SEL_LCD_MEM_REGS,
    /*! Display content of LCD blinking memory registers LCDBMx */
    DL_LCD_DISPLAY_REGISTERS_BLINKING_MEMORY =
        LCD_LCDMEMCTL_LCDDISP_SEL_BLNK_MEM_REGS,
} DL_LCD_DISP;

/*! @enum DL_LCD_EVENT_LINE_MODE */
typedef enum {
    /*! The interrupt or event line is disabled. */
    DL_LCD_EVENT_LINE_MODE_DISABLED = LCD_EVT_MODE_INT0_CFG_DISABLE,
    /*! The interrupt/event line is in sw mode. Software must clear the RIS. */
    DL_LCD_EVENT_LINE_MODE_SOFTWARE = LCD_EVT_MODE_INT0_CFG_SOFTWARE,
    /*! The interrupt/event line is in hw mode. The hardware clears RIS flag. */
    DL_LCD_EVENT_LINE_MODE_HARDWARE = LCD_EVT_MODE_INT0_CFG_HARDWARE,
} DL_LCD_EVENT_LINE_MODE;

/*! @enum DL_LCD_IIDX */
typedef enum {
    /*! LCD interrupt index for no interrupt pending */
    DL_LCD_IIDX_NO_INT = LCD_IIDX_STAT_NO_INTR,
    /*! LCD interrupt index when start of new frame interrupt */
    DL_LCD_IIDX_FRAME_START = LCD_IIDX_STAT_FRAME_START,
    /*! LCD interrupt index when blinking segments off */
    DL_LCD_IIDX_BLINKING_SEGMENTS_OFF = LCD_IIDX_STAT_BLK_OFF,
    /*! LCD interrupt index when blinking segments on */
    DL_LCD_IIDX_BLINKING_SEGMENTS_ON = LCD_IIDX_STAT_BLK_ON,
} DL_LCD_IIDX;

/*! @enum DL_LCD_MEMORY */
typedef enum {
    /*! Index to access LCD memory register 0 */
    DL_LCD_MEMORY_0 = 0,
    /*! Index to access LCD memory register 1 */
    DL_LCD_MEMORY_1 = 1,
    /*! Index to access LCD memory register 2 */
    DL_LCD_MEMORY_2 = 2,
    /*! Index to access LCD memory register 3 */
    DL_LCD_MEMORY_3 = 3,
    /*! Index to access LCD memory register 4 */
    DL_LCD_MEMORY_4 = 4,
    /*! Index to access LCD memory register 5 */
    DL_LCD_MEMORY_5 = 5,
    /*! Index to access LCD memory register 6 */
    DL_LCD_MEMORY_6 = 6,
    /*! Index to access LCD memory register 7 */
    DL_LCD_MEMORY_7 = 7,
    /*! Index to access LCD memory register 8 */
    DL_LCD_MEMORY_8 = 8,
    /*! Index to access LCD memory register 9 */
    DL_LCD_MEMORY_9 = 9,
    /*! Index to access LCD memory register 10 */
    DL_LCD_MEMORY_10 = 10,
    /*! Index to access LCD memory register 11 */
    DL_LCD_MEMORY_11 = 11,
    /*! Index to access LCD memory register 12 */
    DL_LCD_MEMORY_12 = 12,
    /*! Index to access LCD memory register 13 */
    DL_LCD_MEMORY_13 = 13,
    /*! Index to access LCD memory register 14 */
    DL_LCD_MEMORY_14 = 14,
    /*! Index to access LCD memory register 15 */
    DL_LCD_MEMORY_15 = 15,
    /*! Index to access LCD memory register 16 */
    DL_LCD_MEMORY_16 = 16,
    /*! Index to access LCD memory register 17 */
    DL_LCD_MEMORY_17 = 17,
    /*! Index to access LCD memory register 18 */
    DL_LCD_MEMORY_18 = 18,
    /*! Index to access LCD memory register 19 */
    DL_LCD_MEMORY_19 = 19,
    /*! Index to access LCD memory register 20 */
    DL_LCD_MEMORY_20 = 20,
    /*! Index to access LCD memory register 21 */
    DL_LCD_MEMORY_21 = 21,
    /*! Index to access LCD memory register 22 */
    DL_LCD_MEMORY_22 = 22,
    /*! Index to access LCD memory register 23 */
    DL_LCD_MEMORY_23 = 23,
    /*! Index to access LCD memory register 24 */
    DL_LCD_MEMORY_24 = 24,
    /*! Index to access LCD memory register 25 */
    DL_LCD_MEMORY_25 = 25,
    /*! Index to access LCD memory register 26 */
    DL_LCD_MEMORY_26 = 26,
    /*! Index to access LCD memory register 27 */
    DL_LCD_MEMORY_27 = 27,
    /*! Index to access LCD memory register 28 */
    DL_LCD_MEMORY_28 = 28,
    /*! Index to access LCD memory register 29 */
    DL_LCD_MEMORY_29 = 29,
    /*! Index to access LCD memory register 30 */
    DL_LCD_MEMORY_30 = 30,
    /*! Index to access LCD memory register 31 */
    DL_LCD_MEMORY_31 = 31,
    /*! Index to access LCD memory register 32 */
    DL_LCD_MEMORY_32 = 32,
    /*! Index to access LCD memory register 33 */
    DL_LCD_MEMORY_33 = 33,
    /*! Index to access LCD memory register 34 */
    DL_LCD_MEMORY_34 = 34,
    /*! Index to access LCD memory register 35 */
    DL_LCD_MEMORY_35 = 35,
    /*! Index to access LCD memory register 36 */
    DL_LCD_MEMORY_36 = 36,
    /*! Index to access LCD memory register 37 */
    DL_LCD_MEMORY_37 = 37,
    /*! Index to access LCD memory register 38 */
    DL_LCD_MEMORY_38 = 38,
    /*! Index to access LCD memory register 39 */
    DL_LCD_MEMORY_39 = 39,
    /*! Index to access LCD memory register 40 */
    DL_LCD_MEMORY_40 = 40,
    /*! Index to access LCD memory register 41 */
    DL_LCD_MEMORY_41 = 41,
    /*! Index to access LCD memory register 42 */
    DL_LCD_MEMORY_42 = 42,
    /*! Index to access LCD memory register 43 */
    DL_LCD_MEMORY_43 = 43,
    /*! Index to access LCD memory register 44 */
    DL_LCD_MEMORY_44 = 44,
    /*! Index to access LCD memory register 45 */
    DL_LCD_MEMORY_45 = 45,
    /*! Index to access LCD memory register 46 */
    DL_LCD_MEMORY_46 = 46,
    /*! Index to access LCD memory register 47 */
    DL_LCD_MEMORY_47 = 47,
    /*! Index to access LCD memory register 48 */
    DL_LCD_MEMORY_48 = 48,
    /*! Index to access LCD memory register 49 */
    DL_LCD_MEMORY_49 = 49,
    /*! Index to access LCD memory register 50 */
    DL_LCD_MEMORY_50 = 50,
    /*! Index to access LCD memory register 51 */
    DL_LCD_MEMORY_51 = 51,
    /*! Index to access LCD memory register 52 */
    DL_LCD_MEMORY_52 = 52,
    /*! Index to access LCD memory register 53*/
    DL_LCD_MEMORY_53 = 53,
    /*! Index to access LCD memory register 54 */
    DL_LCD_MEMORY_54 = 54,
    /*! Index to access LCD memory register 55 */
    DL_LCD_MEMORY_55 = 55,
    /*! Index to access LCD memory register 56 */
    DL_LCD_MEMORY_56 = 56,
    /*! Index to access LCD memory register 57 */
    DL_LCD_MEMORY_57 = 57,
    /*! Index to access LCD memory register 58 */
    DL_LCD_MEMORY_58 = 58,
    /*! Index to access LCD memory register 59 */
    DL_LCD_MEMORY_59 = 59,
    /*! Index to access LCD memory register 60 */
    DL_LCD_MEMORY_60 = 60,
    /*! Index to access LCD memory register 61 */
    DL_LCD_MEMORY_61 = 61,
    /*! Index to access LCD memory register 62 */
    DL_LCD_MEMORY_62 = 62,
    /*! Index to access LCD memory register 63 */
    DL_LCD_MEMORY_63 = 63,
} DL_LCD_MEMORY;

/*! @enum DL_LCD_BLINKING_MEMORY */
typedef enum {
    /*! Index to access LCD blink memory register 0 */
    DL_LCD_BLINKING_MEMORY_0 = 0,
    /*! Index to access LCD blink memory register 1 */
    DL_LCD_BLINKING_MEMORY_1 = 1,
    /*! Index to access LCD blink memory register 2 */
    DL_LCD_BLINKING_MEMORY_2 = 2,
    /*! Index to access LCD blink memory register 3 */
    DL_LCD_BLINKING_MEMORY_3 = 3,
    /*! Index to access LCD blink memory register 4 */
    DL_LCD_BLINKING_MEMORY_4 = 4,
    /*! Index to access LCD blink memory register 5 */
    DL_LCD_BLINKING_MEMORY_5 = 5,
    /*! Index to access LCD blink memory register 6 */
    DL_LCD_BLINKING_MEMORY_6 = 6,
    /*! Index to access LCD blink memory register 7 */
    DL_LCD_BLINKING_MEMORY_7 = 7,
    /*! Index to access LCD blink memory register 8 */
    DL_LCD_BLINKING_MEMORY_8 = 8,
    /*! Index to access LCD blink memory register 9 */
    DL_LCD_BLINKING_MEMORY_9 = 9,
    /*! Index to access LCD blink memory register 10 */
    DL_LCD_BLINKING_MEMORY_10 = 10,
    /*! Index to access LCD blink memory register 11 */
    DL_LCD_BLINKING_MEMORY_11 = 11,
    /*! Index to access LCD blink memory register 12 */
    DL_LCD_BLINKING_MEMORY_12 = 12,
    /*! Index to access LCD blink memory register 13 */
    DL_LCD_BLINKING_MEMORY_13 = 13,
    /*! Index to access LCD blink memory register 14 */
    DL_LCD_BLINKING_MEMORY_14 = 14,
    /*! Index to access LCD blink memory register 15 */
    DL_LCD_BLINKING_MEMORY_15 = 15,
    /*! Index to access LCD blink memory register 16 */
    DL_LCD_BLINKING_MEMORY_16 = 16,
    /*! Index to access LCD blink memory register 17 */
    DL_LCD_BLINKING_MEMORY_17 = 17,
    /*! Index to access LCD blink memory register 18 */
    DL_LCD_BLINKING_MEMORY_18 = 18,
    /*! Index to access LCD blink memory register 19 */
    DL_LCD_BLINKING_MEMORY_19 = 19,
    /*! Index to access LCD blink memory register 20 */
    DL_LCD_BLINKING_MEMORY_20 = 20,
    /*! Index to access LCD blink memory register 21 */
    DL_LCD_BLINKING_MEMORY_21 = 21,
    /*! Index to access LCD blink memory register 22 */
    DL_LCD_BLINKING_MEMORY_22 = 22,
    /*! Index to access LCD blink memory register 23 */
    DL_LCD_BLINKING_MEMORY_23 = 23,
    /*! Index to access LCD blink memory register 24 */
    DL_LCD_BLINKING_MEMORY_24 = 24,
    /*! Index to access LCD blink memory register 25 */
    DL_LCD_BLINKING_MEMORY_25 = 25,
    /*! Index to access LCD blink memory register 26 */
    DL_LCD_BLINKING_MEMORY_26 = 26,
    /*! Index to access LCD blink memory register 27 */
    DL_LCD_BLINKING_MEMORY_27 = 27,
    /*! Index to access LCD blink memory register 28 */
    DL_LCD_BLINKING_MEMORY_28 = 28,
    /*! Index to access LCD blink memory register 29 */
    DL_LCD_BLINKING_MEMORY_29 = 29,
    /*! Index to access LCD blink memory register 30*/
    DL_LCD_BLINKING_MEMORY_30 = 30,
    /*! Index to access LCD blink memory register 31 */
    DL_LCD_BLINKING_MEMORY_31 = 31,
} DL_LCD_BLINKING_MEMORY;

/*! @enum DL_LCD_COM */
typedef enum {
    /*! Index to access COM 0 */
    DL_LCD_COM_0 = 0x01,
    /*! Index to access COM 1 */
    DL_LCD_COM_1 = 0x02,
    /*! Index to access COM 2 */
    DL_LCD_COM_2 = 0x04,
    /*! Index to access COM 3 */
    DL_LCD_COM_3 = 0x08,
    /*! Index to access COM 4 */
    DL_LCD_COM_4 = 0x10,
    /*! Index to access COM 5 */
    DL_LCD_COM_5 = 0x20,
    /*! Index to access COM 6 */
    DL_LCD_COM_6 = 0x40,
    /*! Index to access COM 7 */
    DL_LCD_COM_7 = 0x80,
} DL_LCD_COM;

/*! @enum DL_LCD_VREFGEN_CYCLES */
typedef enum {
    /*! Turn on VREF generation circuitry for 16 clock cycles */
    DL_LCD_VREFGEN_CYCLES_16 = LCD_LCDVREFCFG_ONTIME_ONTIME16,
    /*! Turn on VREF generation circuitry for 32 clock cycles */
    DL_LCD_VREFGEN_CYCLES_32 = LCD_LCDVREFCFG_ONTIME_ONTIME32,
    /*! Turn on VREF generation circuitry for 128 clock cycles */
    DL_LCD_VREFGEN_CYCLES_128 = LCD_LCDVREFCFG_ONTIME_ONTIME128,
    /*! Turn on VREF generation circuitry for 256 clock cycles */
    DL_LCD_VREFGEN_CYCLES_256 = LCD_LCDVREFCFG_ONTIME_ONTIME256,
} DL_LCD_VREFGEN_CYCLES;

/**
 * @brief Configuration struct for @ref DL_LCD_init
 */
typedef struct {
    /*! The frequency divider to set. One of @ref DL_LCD_FREQ_DIVIDE */
    DL_LCD_FREQ_DIVIDE frequencyDivider;
    /*! The mux rate. One of @ref DL_LCD_MUX_RATE. */
    DL_LCD_MUX_RATE muxRate;
    /*! Select waveforms power mode. One of @ref DL_LCD_WAVEFORM_POWERMODE */
    DL_LCD_WAVEFORM_POWERMODE lowPowerWaveform;
} DL_LCD_Config;

/**
 *  @brief Initialize the LCD peripheral
 *
 *  Initializes all the common configurable options for the LCD peripheral. Any
 *  other custom configuration can be done after calling this API. The LCD is
 *  not enabled in this API.
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] config   Configuration for LCD peripheral
 */
void DL_LCD_init(LCD_Regs *lcd, const DL_LCD_Config *config);

/**
 *  @brief Enable a pin as LCD function
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] pin      Pin to set as LCD function
 *                      One of @ref DL_LCD_SEGMENT_LINE
 *  @note               This function will disable power to the LCD module.
 *                      If needed, enable the module after by calling
 *                      @ref DL_LCD_enable
 */

void DL_LCD_setPinAsLCDFunction(LCD_Regs *lcd, uint32_t pin);

/**
 *  @brief Enable a pin as port function
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] pin      Pin to set as port function.
 *                      One of @ref DL_LCD_SEGMENT_LINE
 *  @note               This function will disable power to the LCD module.
 *                      If needed, enable the module after by calling
 *                      @ref DL_LCD_enable
 */
void DL_LCD_setPinAsPortFunction(LCD_Regs *lcd, uint8_t pin);

/**
 *  @brief Enable an LCD function pin as COM
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] pin      Pin to set as common.
 *                      One of @ref DL_LCD_SEGMENT_LINE
 *  @param[in] com      The selected COM number for the common line.
 *                      One of @ref DL_LCD_COM
 */
void DL_LCD_setPinAsCommon(LCD_Regs *lcd, uint8_t pin, uint32_t com);

/**
 *  @brief Enable an LCD function pin as Segment
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] pin      Pin to set as segment line.
 *                      One of @ref DL_LCD_SEGMENT_LINE
 */
void DL_LCD_setPinAsSegment(LCD_Regs *lcd, uint8_t pin);

/**
 * @brief Enables the Peripheral Write Enable (PWREN) register for the LCD
 *
 *  Before any peripheral registers can be configured by software, the
 *  peripheral itself must be enabled by writing the ENABLE bit together with
 *  the appropriate KEY value to the peripheral's PWREN register.
 *
 *  @note For power savings, please refer to @ref DL_LCD_enable
 *
 *  @param[in] lcd  Pointer to the register overlay for the peripheral
 *
 */
__STATIC_INLINE void DL_LCD_enablePower(LCD_Regs *lcd)
{
    lcd->PWREN |= (LCD_PWREN_KEY_UNLOCK_W | LCD_PWREN_ENABLE_ENABLE);
}

/**
 * @brief Disables the Peripheral Write Enable (PWREN) register for the LCD
 *
 *  When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
 *  accessible for read/write operations.
 *
 *  @note This API does not provide large power savings. For power savings,
 *  please refer to @ref DL_LCD_enable
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disablePower(LCD_Regs *lcd)
{
    lcd->PWREN = (LCD_PWREN_KEY_UNLOCK_W | LCD_PWREN_ENABLE_DISABLE);
}

/**
 * @brief Returns if the Peripheral Write Enable (PWREN) register for the LCD
 *        is enabled
 *
 *  Before any peripheral registers can be configured by software, the
 *  peripheral itself must be enabled by writing the ENABLE bit together with
 *  the appropriate KEY value to the peripheral's PWREN register.
 *
 *  When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
 *  accessible for read/write operations.
 *
 *  @param[in]  lcd  Pointer to the register overlay for the peripheral
 *
 *  @return     If power module on LCD is enabled
 *
 * @return true if peripheral register access is enabled
 * @return false if peripheral register access is disabled
 */
__STATIC_INLINE bool DL_LCD_isPowerEnabled(const LCD_Regs *lcd)
{
    return ((lcd->PWREN & LCD_PWREN_ENABLE_MASK) ==
            LCD_PWREN_ENABLE_ENABLE);
}

/**
 *  @brief Resets LCD peripheral
 *
 *  @param[in] lcd  Pointer to the register overlay for the peripheral
 *
 */
__STATIC_INLINE void DL_LCD_reset(LCD_Regs *lcd)
{
    lcd->RSTCTL = (LCD_RSTCTL_KEY_UNLOCK_W | LCD_RSTCTL_RESETSTKYCLR_CLR |
            LCD_RSTCTL_RESETASSERT_ASSERT);
}

/**
 *  @brief Checks if LCD peripheral was reset
 *
 *  @param[in]  lcd  Pointer to the register overlay for the peripheral
 *
 *  @return     If peripheral was reset
 *
 *  @retval     true if peripheral was reset since this bit was last cleared by
 *              RESETSTKYCLR in the RSTCTL register
 *  @retval     false if peripheral was not reset since the last bit clear
 */
__STATIC_INLINE bool DL_LCD_isReset(const LCD_Regs *lcd)
{
    return ((lcd->STAT & LCD_STAT_RESETSTKY_MASK) ==
            LCD_STAT_RESETSTKY_RESET);
}

/**
 *  @brief Get the event line mode
 *
 *  @param[in]  lcd  Pointer to the register overlay for the peripheral
 *
 *  @return     event line mode
 *
 *  @retval     One of @ref DL_LCD_EVENT_LINE_MODE
 */
__STATIC_INLINE DL_LCD_EVENT_LINE_MODE DL_LCD_getEventLineMode(const LCD_Regs *lcd)
{
    uint32_t eventLineMode = (lcd->EVT_MODE & LCD_EVT_MODE_INT0_CFG_MASK);

    return (DL_LCD_EVENT_LINE_MODE)(eventLineMode);
}

/**
 *  @brief Gets the highest priority pending interrupt
 *
 *  Accesses and reads the IIDX register to obtain the highest currently
 *  pending interrupt. A read clears the corresponding interrupt flag in RIS
 *  and MIS.
 *
 *  @param[in]  lcd  pointer to the register overlay of the peripheral
 *
 *  @return     The highest priority pending interrupt
 *
 *  @retval     One of @ref DL_LCD_IIDX
 */
__STATIC_INLINE DL_LCD_IIDX DL_LCD_getPendingInterrupt(const LCD_Regs *lcd)
{
    return ((DL_LCD_IIDX) lcd->INT_EVENT0.IIDX);
}

/**
 *  @brief Enable LCD interrupts
 *
 *  @param[in] lcd              Pointer to the register overlay for the
 *                              peripheral
 *  @param[in] interruptMask    Bit mask of interrupts to enable. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 */
__STATIC_INLINE void DL_LCD_enableInterrupt(
    LCD_Regs *lcd, uint32_t interruptMask)
{
    lcd->INT_EVENT0.IMASK |= interruptMask;
}

/**
 *  @brief Disable LCD interrupts
 *
 *  @param[in] lcd              Pointer to the register overlay for the
 *                              peripheral
 *  @param[in] interruptMask    Bit mask of interrupts to disable. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 */
__STATIC_INLINE void DL_LCD_disableInterrupt(
    LCD_Regs *lcd, uint32_t interruptMask)
{
    lcd->INT_EVENT0.IMASK &= ~(interruptMask);
}

/**
 *  @brief Check which LCD interrupts are enabled
 *
 *  @param[in]  lcd             Pointer to the register overlay for the
 *                              peripheral
 *  @param[in]  interruptMask   Bit mask of interrupts to check. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 *
 *  @return     Which of the requested LCD interrupts are enabled
 *
 *  @retval     Bitwise OR of @ref DL_LCD_INTERRUPT values
 */
__STATIC_INLINE uint32_t DL_LCD_getEnabledInterrupts(
    const LCD_Regs *lcd, uint32_t interruptMask)
{
    return (lcd->INT_EVENT0.IMASK & interruptMask);
}

/**
 *  @brief Check interrupt flag of any LCD interrupt
 *
 *  Checks if any of the LCD interrupts are pending. Interrupts do not have to
 *  be previously enabled.
 *
 *  @param[in]  lcd             Pointer to the register overlay for the
 *                              peripheral
 *  @param[in]  interruptMask   Bit mask of interrupts to check. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 *
 *  @return     Which of the requested LCD interrupts are pending
 *
 *  @retval     Bitwise OR of @ref DL_LCD_INTERRUPT values
 */
__STATIC_INLINE uint32_t DL_LCD_getRawInterruptStatus(
    const LCD_Regs *lcd, uint32_t interruptMask)
{
    return (lcd->INT_EVENT0.RIS & interruptMask);
}

/**
 *  @brief Check interrupt flag of enabled LCD interrupts
 *
 *  Checks if any of the LCD interrupts that were previously enabled are
 *  pending.
 *
 *  @param[in]  lcd             Pointer to the register overlay for the
 *                              peripheral
 *  @param[in]  interruptMask   Bit mask of interrupts to check. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 *
 *  @return     Which of the requested LCD interrupts are pending
 *
 *  @retval     Bitwise OR of @ref DL_LCD_INTERRUPT values
 *
 *  @sa         DL_LCD_enableInterrupt
 */
__STATIC_INLINE uint32_t DL_LCD_getEnabledInterruptStatus(
    const LCD_Regs *lcd, uint32_t interruptMask)
{
    return (lcd->INT_EVENT0.MIS & interruptMask);
}

/**
 *  @brief Set LCD interrupts
 *
 *  @param[in] lcd              Pointer to the register overlay for the
 *                              peripheral
 *  @param[in] interruptMask    Bit mask of interrupts to set. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 */
__STATIC_INLINE void DL_LCD_setInterrupts(
    LCD_Regs *lcd, uint32_t interruptMask)
{
    lcd->INT_EVENT0.ISET = interruptMask;
}

/**
 *  @brief Clear pending LCD interrupts
 *
 *  @param[in] lcd              Pointer to the register overlay for the
 *                              peripheral
 *  @param[in] interruptMask    Bit mask of interrupts to clear. Bitwise OR of
 *                              @ref DL_LCD_INTERRUPT.
 */
__STATIC_INLINE void DL_LCD_clearInterruptStatus(
    LCD_Regs *lcd, uint32_t interruptMask)
{
    lcd->INT_EVENT0.ICLR = interruptMask;
}

/**
 *  @brief Enable external synchronization
 *
 *  @param[in] lcd  Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_enableExternalSync(LCD_Regs *lcd)
{
    lcd->LCDCTL0 |= LCD_LCDCTL0_LCDSYNCEXT_LCD_EXT_SYNC_ON;
}

/**
 *  @brief Disable external synchronization
 *
 *  @param[in] lcd  Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disableExternalSync(LCD_Regs *lcd)
{
    lcd->LCDCTL0 &= ~(LCD_LCDCTL0_LCDSYNCEXT_MASK);
}

/**
 *  @brief Checks if external synchronization is enabled
 *
 *  @param[in]  lcd  Pointer to the register overlay for the peripheral
 *
 *  @return     If external synchronization is enabled
 *
 *  @retval     true if external synchronization enabled
 *  @retval     false if external synchronization is disabled
 */
__STATIC_INLINE bool DL_LCD_isExternalSyncEnabled(const LCD_Regs *lcd)
{
    return ((lcd->LCDCTL0 & LCD_LCDCTL0_LCDSYNCEXT_MASK) ==
            LCD_LCDCTL0_LCDSYNCEXT_LCD_EXT_SYNC_ON);
}

/**
 *  @brief Set the LCD frequency divider.
 *
 *  fLCD = fSOURCE / ((LCDDIVx + 1) × Value[LCDMXx])
 *
 *  @param[in]  lcd     Pointer to the register overlay for the peripheral
 *  @param[in]  fDiv    The frequency divider to set.
 *                      One of @ref DL_LCD_FREQ_DIVIDE
 *
 *  @pre        The LCD module must be off (LCDCTL0.LCDON == 0) before setting
 *              this configuration.
 */
__STATIC_INLINE void DL_LCD_setFreqDiv(
    LCD_Regs *lcd, DL_LCD_FREQ_DIVIDE fDiv)
{
    DL_Common_updateReg(
        &lcd->LCDCTL0, (uint32_t) fDiv, LCD_LCDCTL0_LCDDIVX_MASK);
}

/**
 *  @brief Get the LCD frequency divider
 *
 *  @param[in]  lcd     Pointer to the register overlay for the peripheral
 *
 *  @return     The current frequency divider
 *
 *  @retval     One of @ref DL_LCD_FREQ_DIVIDE
 */
__STATIC_INLINE DL_LCD_FREQ_DIVIDE DL_LCD_getFreqDiv(const LCD_Regs *lcd)
{
    uint32_t fDiv = (lcd->LCDCTL0 & LCD_LCDCTL0_LCDDIVX_MASK);

    return (DL_LCD_FREQ_DIVIDE)(fDiv);
}

/**
 *  @brief Set the LCD mux rate
 *
 *  @param[in]  lcd        Pointer to the register overlay for the peripheral
 *  @param[in]  muxRate    The mux rate to set. One of @ref DL_LCD_MUX_RATE
 *
 *
 *  @pre        The LCD module must be off (LCDCTL0.LCDON == 0) before setting
 *              this configuration. The LCD module can be disabled by calling
 *              DL_LCD_disableModule.
 *
 */
__STATIC_INLINE void DL_LCD_setMuxRate(
    LCD_Regs *lcd, DL_LCD_MUX_RATE muxRate)
{
    DL_Common_updateReg(
        &lcd->LCDCTL0, (uint32_t) muxRate, LCD_LCDCTL0_LCDMXX_MASK);
}

/**
 *  @brief Get the LCD mux rate
 *
 *  @param[in]  lcd     Pointer to the register overlay for the peripheral
 *
 *  @return     The mux rate
 *
 *  @retval     One of @ref DL_LCD_MUX_RATE
 */
__STATIC_INLINE DL_LCD_MUX_RATE DL_LCD_getMuxRate(const LCD_Regs *lcd)
{
    uint32_t muxRate = (lcd->LCDCTL0 & LCD_LCDCTL0_LCDMXX_MASK);

    return (DL_LCD_MUX_RATE)(muxRate);
}

/**
 * @brief Turns LCD segments on
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_turnSegmentsOn(LCD_Regs *lcd)
{
    lcd->LCDCTL0 |= LCD_LCDCTL0_LCDSON_LCD_SEG_ON;
}

/**
 * @brief Turns LCD segments off
 *
 * Can be used to flash LCD applications by turning off segment lines
 * and leaving LCD timing generator and R33 enabled.
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_turnSegmentsOff(LCD_Regs *lcd)
{
    lcd->LCDCTL0 &= ~(LCD_LCDCTL0_LCDSON_MASK);
}

/**
 *  @brief Set the waveform power mode
 *
 *  @param[in]  lcd                 Pointer to the register overlay for the
 *                                  peripheral
 *  @param[in]  waveformPowerMode   The power mode for LCD waveforms.
 *                                  One of @ref DL_LCD_WAVEFORM_POWERMODE
 *
 *  @pre        The LCD module must be in 1/3 bias mode (LCDBIASSEL == 0)
 *              before setting this configuration.
 */
__STATIC_INLINE void DL_LCD_setWaveformPowerMode(
    LCD_Regs *lcd, DL_LCD_WAVEFORM_POWERMODE waveformPowerMode)
{
    DL_Common_updateReg(
        &lcd->LCDCTL0, (uint32_t) waveformPowerMode, LCD_LCDCTL0_LCDLP_MASK);
}

/**
 *  @brief Get the waveform power mode
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The waveform power mode
 *
 *  @retval     One of @ref DL_LCD_WAVEFORM_POWERMODE
 */
__STATIC_INLINE DL_LCD_WAVEFORM_POWERMODE DL_LCD_getWaveformPowerMode(
    const LCD_Regs *lcd)
{
    uint32_t waveformPowerMode = (lcd->LCDCTL0 & LCD_LCDCTL0_LCDLP_MASK);

    return (DL_LCD_WAVEFORM_POWERMODE)(waveformPowerMode);
}

/**
 * @brief Enables the LCD module
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_enable(LCD_Regs *lcd)
{
    lcd->LCDCTL0 |= LCD_LCDCTL0_LCDON_LCD_MOD_ENABLE;
}

/**
 * @brief Disables the LCD module
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disable(LCD_Regs *lcd)
{
    lcd->LCDCTL0 &= ~(LCD_LCDCTL0_LCDON_MASK);
}

/**
 *  @brief Set the blinking frequency divider and blinking mode
 *
 *  @param[in] lcd          Pointer to the register overlay for the peripheral
 *  @param[in] blinkFreqDiv The blinking frequency divider to set.
 *                          One of @ref DL_LCD_BLINKING_DIVIDE
 *  @param[in] blinkMode    The blinking mode to select.
 *                          One of @ref DL_LCD_BLINKING_MODE
 */
__STATIC_INLINE void DL_LCD_setBlinkingControl(
    LCD_Regs *lcd, DL_LCD_BLINKING_DIVIDE blinkFreqDiv,
    DL_LCD_BLINKING_MODE blinkMode)
{
    DL_Common_updateReg(&lcd->LCDBLKCTL, (uint32_t) blinkFreqDiv |
        (uint32_t) blinkMode, LCD_LCDBLKCTL_LCDBLKPREX_MASK |
        LCD_LCDBLKCTL_LCDBLKMODX_MASK);
}

/**
 *  @brief Get the blinking frequency divider
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The current blinking frequency divider
 *
 *  @retval     One of @ref DL_LCD_BLINKING_DIVIDE
 */
__STATIC_INLINE DL_LCD_BLINKING_DIVIDE DL_LCD_getBlinkingFreqDiv(const LCD_Regs *lcd)
{
    uint32_t blinkFreqDiv = (lcd->LCDBLKCTL & LCD_LCDBLKCTL_LCDBLKPREX_MASK);

    return (DL_LCD_BLINKING_DIVIDE)(blinkFreqDiv);
}

/**
 *  @brief Get the blinking mode
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The current blinking mode
 *
 *  @retval     One of @ref DL_LCD_BLINKING_MODE
 */
__STATIC_INLINE DL_LCD_BLINKING_MODE DL_LCD_getBlinkingMode(const LCD_Regs *lcd)
{
    uint32_t blinkMode = (lcd->LCDBLKCTL & LCD_LCDBLKCTL_LCDBLKMODX_MASK);

    return (DL_LCD_BLINKING_MODE)(blinkMode);
}

/**
 *  @brief Clear LCD blinking memory
 *
 *  Clears all blinking memory registers LCDBMx.
 *  The bit is automatically reset when blinking memory cleared.
 *
 *  @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_clearAllBlinkingMemoryRegs(LCD_Regs *lcd)
{
    DL_Common_updateReg(&lcd->LCDMEMCTL,
        LCD_LCDMEMCTL_LCDCLRBM_CLR_BLNK_MEM_REGS, LCD_LCDMEMCTL_LCDCLRBM_MASK);
}

/**
 *  @brief Clear LCD memory
 *
 *  Clears all memory registers LCDMx.
 *  The bit is automatically reset when LCD memory cleared.
 *
 *  @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_clearAllMemoryRegs(LCD_Regs *lcd)
{
    DL_Common_updateReg(&lcd->LCDMEMCTL, LCD_LCDMEMCTL_LCDCLRM_CLR_LCD_MEM_REGS,
        LCD_LCDMEMCTL_LCDCLRM_MASK);
}

/**
 *  @brief Select LCD memory registers for display
 *
 *  @param[in]  lcd     Pointer to the register overlay for the peripheral
 *  @param[in]  dispSel The memory registers to select. One of @ref DL_LCD_DISP
 *
 *  @pre        LCDDISP can only be set by software when LCDBLKMODx is disabled.
 *              Bit cleared/cannot be changed by software when
 *              LCDBLKMODx == DL_LCD_BLINKING_MODE_INDIVIDUAL_SEGMENTS,
 *              DL_LCD_BLINKING_MODE_ALL_SEGMENTS or if a mux mode = 5 selected.
 */
__STATIC_INLINE void DL_LCD_selectMemRegsForDisplay(
    LCD_Regs *lcd, DL_LCD_DISP dispSel)
{
    DL_Common_updateReg(&lcd->LCDMEMCTL, (uint32_t) dispSel,
        LCD_LCDMEMCTL_LCDDISP_MASK);
}

/**
 *  @brief Get the LCD memory registers selected for display
 *
 *  When LCDBLKMODx = DL_LCD_BLINKING_MODE_TOGGLE, this bit reflects the
 *  currently displayed memory but cannot be changed by software.
 *  When returning to LCDBLKMODx is disabled, bit is cleared.
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     LCD memory registers selected for display
 *
 *  @retval     One of @ref DL_LCD_DISP
 */
__STATIC_INLINE DL_LCD_DISP DL_LCD_getSelectedMemRegsForDisplay(const LCD_Regs *lcd)
{
    uint32_t dispSel = (lcd->LCDMEMCTL & LCD_LCDMEMCTL_LCDDISP_MASK);

    return (DL_LCD_DISP)(dispSel);
}

/**
 * @brief Enables VBOOST on LCD module
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_enableVBOOST(LCD_Regs *lcd)
{
    lcd->LCDVCTL |= LCD_LCDVCTL_LCDVBSTEN_ENABLE;
}

/**
 * @brief Disables VBOOST on LCD module
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disableVBOOST(LCD_Regs *lcd)
{
    lcd->LCDVCTL &= ~(LCD_LCDVCTL_LCDVBSTEN_MASK);
}

/**
 *  @brief Set charge pump frequency
 *
 *  @param[in] lcd              Pointer to the register overlay for the
 *                              peripheral
 *  @param[in] chargePumpFreq   The charge pump frequency to select.
 *                              One of @ref DL_LCD_CHARGE_PUMP_FREQUENCY
 *
 */
__STATIC_INLINE void DL_LCD_setChargePumpFreq(
    LCD_Regs *lcd, DL_LCD_CHARGE_PUMP_FREQUENCY chargePumpFreq)
{
    DL_Common_updateReg(&lcd->LCDVCTL, (uint32_t) chargePumpFreq,
        LCD_LCDVCTL_LCDCPFSELX_MASK);
}

/**
 *  @brief Get the charge pump frequency
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The current charge pump frequency
 *
 *  @retval     One of @ref DL_LCD_CHARGE_PUMP_FREQUENCY
 */
__STATIC_INLINE DL_LCD_CHARGE_PUMP_FREQUENCY DL_LCD_getChargePumpFreq(
    const LCD_Regs *lcd)
{
    uint32_t chargePumpFreq = (lcd->LCDVCTL & LCD_LCDVCTL_LCDCPFSELX_MASK);

    return (DL_LCD_CHARGE_PUMP_FREQUENCY)(chargePumpFreq);
}

/**
 *  @brief Set internal reference voltage
 *
 *  @param[in] lcd          Pointer to the register overlay for the peripheral
 *  @param[in] vrefInternal The internal reference voltage to select.
 *                          One of @ref DL_LCD_VREF_INTERNAL
 *
 */
__STATIC_INLINE void DL_LCD_setVREFInternal(
    LCD_Regs *lcd, DL_LCD_VREF_INTERNAL vrefInternal)
{
    DL_Common_updateReg(&lcd->LCDVCTL, (uint32_t) vrefInternal,
        LCD_LCDVCTL_VLCDX_MASK);
}

/**
 *  @brief Get the internal reference voltage
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The current internal reference voltage
 *
 *  @retval     One of @ref DL_LCD_VREF_INTERNAL
 */
__STATIC_INLINE DL_LCD_VREF_INTERNAL DL_LCD_getVREFInternal(const LCD_Regs *lcd)
{
    uint32_t vrefInternal = (lcd->LCDVCTL & LCD_LCDVCTL_VLCDX_MASK);

    return (DL_LCD_VREF_INTERNAL)(vrefInternal);
}

/**
 * @brief Enables charge pump
 *
 * @param   lcd    Pointer to the register overlay for the peripheral
 *
 * @pre     VLCD must be generated internally (VLCDEXT = 0) and VLCD > 0 or
 *          VLCDREFx > 0 in order to use this configuration.
 */
__STATIC_INLINE void DL_LCD_enableChargePump(LCD_Regs *lcd)
{
    lcd->LCDVCTL |= LCD_LCDVCTL_LCDCPEN_CP_ENABLE;
}

/**
 * @brief Disables charge pump
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disableChargePump(LCD_Regs *lcd)
{
    lcd->LCDVCTL &= ~(LCD_LCDVCTL_LCDCPEN_MASK);
}

/**
 * @brief Enables internal reference voltage
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 *
 */
__STATIC_INLINE void DL_LCD_enableVREFInternal(LCD_Regs *lcd)
{
    lcd->LCDVCTL |= LCD_LCDVCTL_LCDREFEN_INT_REF_ENABLE;
}

/**
 * @brief Disables internal reference voltage
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disableVREFInternal(LCD_Regs *lcd)
{
    lcd->LCDVCTL &= ~(LCD_LCDVCTL_LCDREFEN_MASK);
}

/**
 *  @brief Set source for R33
 *
 *  @param[in] lcd          Pointer to the register overlay for the peripheral
 *  @param[in] r33Source    The internal reference voltage to select.
 *                          One of @ref DL_LCD_R33_SOURCE
 *
 */
__STATIC_INLINE void DL_LCD_setR33source(
    LCD_Regs *lcd, DL_LCD_R33_SOURCE r33Source)
{
    DL_Common_updateReg(&lcd->LCDVCTL, (uint32_t) r33Source,
        LCD_LCDVCTL_LCDSELVDD_MASK);
}

/**
 *  @brief Get the source for R33
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The current source for R33
 *
 *  @retval     One of @ref DL_LCD_R33_SOURCE
 */
__STATIC_INLINE DL_LCD_R33_SOURCE DL_LCD_getR33Source(const LCD_Regs *lcd)
{
    uint32_t r33Source = (lcd->LCDVCTL & LCD_LCDVCTL_LCDSELVDD_MASK);

    return (DL_LCD_R33_SOURCE)(r33Source);
}

/**
 *  @brief Select internal bias power mode
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  powerMode   The power mode to use for generating bias voltage
 *                          for LCD. One of @ref DL_LCD_POWER_MODE
 *
 *  @pre    The user must first enable the internal bias voltage resistor
 *          divider by calling @ref DL_LCD_enableInternalBias
 */
__STATIC_INLINE void DL_LCD_setInternalBiasPowerMode(
    LCD_Regs *lcd, DL_LCD_POWER_MODE powerMode)
{
    DL_Common_updateReg(&lcd->LCDVCTL, (uint32_t) powerMode,
        LCD_LCDVCTL_LCD_HP_LP_MASK);
}

/**
 *  @brief Get power mode
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The power mode
 *
 *  @retval     One of @ref DL_LCD_POWER_MODE
 */
__STATIC_INLINE DL_LCD_POWER_MODE DL_LCD_getPowerMode(const LCD_Regs *lcd)
{
    uint32_t powerMode = (lcd->LCDVCTL & LCD_LCDVCTL_LCDSELVDD_MASK);

    return (DL_LCD_POWER_MODE)(powerMode);
}

/**
 *  @brief Set bias voltage source
 *
 *  @param[in]  lcd                 Pointer to the register overlay for the
 *                                  peripheral
 *  @param[in]  biasVoltageSource   The bias voltage source.
 *                                  One of @ref DL_LCD_BIAS_VOLTAGE_SOURCE
 *
 *  @pre        The user must first enable the internal bias voltage resistor
                divider by calling @ref DL_LCD_enableInternalBias
 */
__STATIC_INLINE void DL_LCD_setBiasVoltageSource(
    LCD_Regs *lcd, DL_LCD_BIAS_VOLTAGE_SOURCE biasVoltageSource)
{
    DL_Common_updateReg(&lcd->LCDVCTL, (uint32_t) biasVoltageSource,
        LCD_LCDVCTL_VLCDSEL_VDD_R33_MASK);
}

/**
 *  @brief Get bias voltage source
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The bias voltage source
 *
 *  @retval     One of @ref DL_LCD_BIAS_VOLTAGE_SOURCE
 */
__STATIC_INLINE DL_LCD_BIAS_VOLTAGE_SOURCE DL_LCD_getBiasVoltageSource(
    const LCD_Regs *lcd)
{
    uint32_t biasVoltageSource = (
        lcd->LCDVCTL & LCD_LCDVCTL_VLCDSEL_VDD_R33_MASK);

    return (DL_LCD_BIAS_VOLTAGE_SOURCE)(biasVoltageSource);
}

/**
 * @brief Enables internal bias voltage resistor divider
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 *
 */
__STATIC_INLINE void DL_LCD_enableInternalBias(LCD_Regs *lcd)
{
    lcd->LCDVCTL |= LCD_LCDVCTL_LCDINTBIASEN_INT_BIAS_ENABLE;
}

/**
 * @brief Disables internal bias voltage resistor divider
 *
 * @param lcd   Pointer to the register overlay for the peripheral
 */
__STATIC_INLINE void DL_LCD_disableInternalBias(LCD_Regs *lcd)
{
    lcd->LCDVCTL &= ~(LCD_LCDVCTL_LCDINTBIASEN_MASK);
}

/**
 *  @brief Select LCD bias
 *
 *  @param[in]  lcd     Pointer to the register overlay for the peripheral
 *  @param[in]  biasSel The bias. One of @ref DL_LCD_BIAS
 *
 *  @note       This bit (LCDBIASSEL) is ignored in static mode and for 2-mux,
 *              3-mux, and 4-mux LCD modes
 */
__STATIC_INLINE void DL_LCD_setBias(
    LCD_Regs *lcd, DL_LCD_BIAS biasSel)
{
    DL_Common_updateReg(
        &lcd->LCDVCTL, (uint32_t) biasSel, LCD_LCDVCTL_LCDBIASSEL_MASK);
}

/**
 *  @brief Get bias for LCD
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     The bias for the LCD
 *
 *  @retval     One of @ref DL_LCD_BIAS
 */
__STATIC_INLINE DL_LCD_BIAS DL_LCD_getBias(const LCD_Regs *lcd)
{
    uint32_t biasSel = (lcd->LCDVCTL & LCD_LCDVCTL_LCDBIASSEL_MASK);

    return (DL_LCD_BIAS)(biasSel);
}

/**
 *  @brief Set reference mode for R13 voltage
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] refMode  Ref mode. One of @ref DL_LCD_REFERENCE_MODE
 *
 */
__STATIC_INLINE void DL_LCD_setRefMode(
    LCD_Regs *lcd, DL_LCD_REFERENCE_MODE refMode)
{
    DL_Common_updateReg(
        &lcd->LCDVCTL, (uint32_t) refMode, LCD_LCDVCTL_LCDREFMODE_MASK);
}

/**
 *  @brief Get reference mode for R13 voltage
 *
 *  @param[in]  lcd Pointer to the register overlay for the peripheral
 *
 *  @return     Voltage reference mode
 *
 *  @retval     One of @ref DL_LCD_REFERENCE_MODE
 */
__STATIC_INLINE DL_LCD_REFERENCE_MODE DL_LCD_getRefMode(const LCD_Regs *lcd)
{
    uint32_t refMode = (lcd->LCDVCTL & LCD_LCDVCTL_LCDREFMODE_MASK);

    return (DL_LCD_REFERENCE_MODE)(refMode);
}

/**
 *  @brief Write to bits in LCD memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_MEMORY.
 *  @param[in]  mask        Registers to set in LCDMx register.
 *                          Bitwise OR of @ref DL_LCD_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_writeMemory(
    LCD_Regs *lcd, DL_LCD_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDM[(uint32_t) memIndex] = mask;
}

/**
 *  @brief Set bits in LCD memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_MEMORY.
 *  @param[in]  mask        Registers to set in LCDMx register.
 *                          Bitwise OR of @ref DL_LCD_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_setMemory(
    LCD_Regs *lcd, DL_LCD_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDM[(uint32_t) memIndex] |= mask;
}

/**
 *  @brief Toggle bits in LCD memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_MEMORY.
 *  @param[in]  mask        Registers to set in LCDMx register.
 *                          Bitwise OR of @ref DL_LCD_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_toggleMemory(
    LCD_Regs *lcd, DL_LCD_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDM[(uint32_t) memIndex] ^= mask;
}

/**
 *  @brief Clear bits in LCD memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_MEMORY.
 *  @param[in]  mask        Registers to set in LCDMx register.
 *                          Bitwise OR of @ref DL_LCD_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_clearMemory(
    LCD_Regs *lcd, DL_LCD_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDM[(uint32_t) memIndex] &= ~(mask);
}

/**
 *  @brief Get bits in LCD memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to read from.
 *
 *  @retval     32 bit value of register
 *
 *  @sa         DL_LCD_MEMORY_BIT
 */
__STATIC_INLINE uint32_t DL_LCD_getMemory(
    const LCD_Regs *lcd, DL_LCD_MEMORY memIndex)
{
    return lcd -> LCDM[(uint32_t) memIndex];
}

/**
 *  @brief Write to bits in LCD blinking memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_BLINKING_MEMORY.
 *  @param[in]  mask        Registers to set in LCDBMx register.
 *                          Bitwise OR of @ref DL_LCD_BLINK_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_writeBlinkingMemory(
    LCD_Regs *lcd, DL_LCD_BLINKING_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDBM[(uint32_t) memIndex] = mask;
}

/**
 *  @brief Set bits in LCD blinking memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_BLINKING_MEMORY.
 *  @param[in]  mask        Registers to set in LCDBMx register.
 *                          Bitwise OR of @ref DL_LCD_BLINK_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_setBlinkingMemory(
    LCD_Regs *lcd, DL_LCD_BLINKING_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDBM[(uint32_t) memIndex] |= mask;
}

/**
 *  @brief Toggle bits in LCD blinking memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_BLINKING_MEMORY.
 *  @param[in]  mask        Registers to set in LCDBMx register.
 *                          Bitwise OR of @ref DL_LCD_BLINK_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_toggleBlinkingMemory(
    LCD_Regs *lcd, DL_LCD_BLINKING_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDBM[(uint32_t) memIndex] ^= mask;
}

/**
 *  @brief Clear bits in LCD blinking memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to write to.
 *                          One of @ref DL_LCD_BLINKING_MEMORY.
 *  @param[in]  mask        Registers to set in LCDBMx register.
 *                          Bitwise OR of @ref DL_LCD_BLINK_MEMORY_BIT.
 */
__STATIC_INLINE void DL_LCD_clearBlinkingMemory(
    LCD_Regs *lcd, DL_LCD_BLINKING_MEMORY memIndex, uint32_t mask)
{
    lcd -> LCDBM[(uint32_t) memIndex] &= ~(mask);
}

/**
 *  @brief Get bits in LCD blinking memory index register
 *
 *  @param[in]  lcd         Pointer to the register overlay for the peripheral
 *  @param[in]  memIndex    Index of LCDMx register to read from.
 *
 *  @retval     32 bit value of register
 *
 *  @sa         DL_LCD_BLINK_MEMORY_BIT
 */
__STATIC_INLINE uint32_t DL_LCD_getBlinkingMemory(
    const LCD_Regs *lcd, DL_LCD_BLINKING_MEMORY memIndex)
{
    return lcd -> LCDBM[(uint32_t) memIndex];
}

/**
 *  @brief Set number of cycles to enable voltage generation circuitry
 *
 *  @param[in] lcd      Pointer to the register overlay for the peripheral
 *  @param[in] cycles   The number of cycles to enable voltage generation circuitry.
 *                      One of @ref DL_LCD_VREFGEN_CYCLES.
 */
__STATIC_INLINE void DL_LCD_setVrefOnTimeCycles(
    LCD_Regs *lcd, DL_LCD_VREFGEN_CYCLES cycles)
{
    DL_Common_updateReg(&lcd->LCDVREFCFG, (uint32_t) cycles,
        LCD_LCDVREFCFG_ONTIME_MASK);
}

/**
 *  @brief Get the number of cycles set to enable voltage generation circuitry
 *
 *  @param[in]  lcd  Pointer to the register overlay for the peripheral
 *
 *  @return     The number of cycles
 *
 *  @retval     One of @ref DL_LCD_VREFGEN_CYCLES
 */
__STATIC_INLINE DL_LCD_VREFGEN_CYCLES DL_LCD_getVrefOnTimeCycles(const LCD_Regs *lcd)
{
    uint32_t cycles = (lcd->LCDVREFCFG & LCD_LCDVREFCFG_ONTIME_MASK);

    return (DL_LCD_VREFGEN_CYCLES)(cycles);
}

#ifdef __cplusplus
}
#endif

#endif /* __MSPM0_HAS_LCD__ */

#endif /* ti_dl_dl_lcd__include */
/** @}*/
