This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

how to interface 102x64 dot matrix lcd using ccs 6 with msp430f5529??

Other Parts Discussed in Thread: ENERGIA, MSP430F5529, MSP430WARE

i dont know how to interface it but i need to.....please provide any info about this issue even if the inter face is in energia....

  • Hi Amarnath,

    What kind of interface does the display have SPI, UART, I2C etc..? You need to check the datasheet or user manual of the LCD for detailed info about the interface with the controller.

    Regards,
    Gautam
  • You can simply use the ready-made SPI library for MSP430 to implement the same. Also, let me again stress on the fact that LCD datasheet will guide you in what & how data has to be sent to the display.

    Regards,
    Gautam
  • thanks gautam

    i have gone through the datasheet of "dogs102-6 102x64 lcd"( )

    i have also studied the schematics of my msp430f5529 experiment board ..( )

    you have provided me valuable input and i have learned a lot as a student...... but i am sorry to say that i am facing the following problems:

    1. i dont know how to use the spi library .

    2.  i was going through the net & i found a few header files for interfacing my lcd with msp one of them was " HAL_dogs102-6.h" and also "HAL_dogs102-6"

    i tried to copy paste it in the ccs folder where the header file are located (ie "include folder") but there were lots of them....so i dont know where . but still i tried to paste and succeeded in making it identify the functions .but yet it showed errors. the contents of the .h and .c are given below

    /*******************************************************************************
     *
     *  HAL_Dogs102x6.h
     *
     *  Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
     *
     *  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.
     *
     ******************************************************************************/
    
    #ifndef HAL_DOGS102X6_H
    #define HAL_DOGS102X6_H
    
    #include <stdint.h>
    
    // Screen size
    #define DOGS102x6_X_SIZE   102         // Display Size in dots: X-Axis
    #define DOGS102x6_Y_SIZE    64         // Display Size in dots: Y-Axis
    
    // Screen printing styles
    #define DOGS102x6_DRAW_NORMAL   0x00   // Display dark pixels on a light background
    #define DOGS102x6_DRAW_INVERT   0x01   // Display light pixels on a dark background
    
    // Screen printing mode
    #define DOGS102x6_DRAW_IMMEDIATE  0x01  // Display update done immediately
    #define DOGS102x6_DRAW_ON_REFRESH 0x00  // Display update done only with refresh
    
    extern uint8_t dogs102x6Memory[];      // Provide direct access to the frame buffer
    
    extern void Dogs102x6_init(void);
    extern void Dogs102x6_backlightInit(void);
    extern void Dogs102x6_disable(void);
    extern void Dogs102x6_refresh(uint8_t mode);
    extern void Dogs102x6_writeCommand(uint8_t* sCmd, uint8_t i);
    extern void Dogs102x6_writeData(uint8_t* sData, uint8_t i);
    extern void Dogs102x6_setAddress(uint8_t pa, uint8_t ca);
    extern uint8_t Dogs102x6_getContrast(void);
    extern uint8_t Dogs102x6_getBacklight(void);
    extern void Dogs102x6_setContrast(uint8_t newContrast);
    extern void Dogs102x6_setBacklight(uint8_t brightness);
    extern void Dogs102x6_setInverseDisplay(void);
    extern void Dogs102x6_clearInverseDisplay(void);
    extern void Dogs102x6_scrollLine(uint8_t lines);
    extern void Dogs102x6_setAllPixelsOn(void);
    extern void Dogs102x6_clearAllPixelsOn(void);
    extern void Dogs102x6_clearScreen(void);
    extern void Dogs102x6_charDraw(uint8_t row, uint8_t col, uint16_t f, uint8_t style);
    extern void Dogs102x6_charDrawXY(uint8_t x, uint8_t y, uint16_t f, uint8_t style);
    extern void Dogs102x6_stringDraw(uint8_t row, uint8_t col, char *word, uint8_t style);
    extern void Dogs102x6_stringDrawXY(uint8_t x, uint8_t y, char *word, uint8_t style);
    extern void Dogs102x6_clearRow(uint8_t row);
    extern void Dogs102x6_pixelDraw(uint8_t x, uint8_t y, uint8_t style);
    extern void Dogs102x6_horizontalLineDraw(uint8_t x1, uint8_t x2, uint8_t y, uint8_t style);
    extern void Dogs102x6_verticalLineDraw(uint8_t y1, uint8_t y2, uint8_t x, uint8_t style);
    extern void Dogs102x6_lineDraw(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t style);
    extern void Dogs102x6_circleDraw(uint8_t x, uint8_t y, uint8_t radius, uint8_t style);
    extern void Dogs102x6_imageDraw(const uint8_t IMAGE[], uint8_t row, uint8_t col);
    extern void Dogs102x6_clearImage(uint8_t height, uint8_t width, uint8_t row, uint8_t col);
    
    #endif /* HAL_DOGS102x6_H */

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx         

    and this is the .c file

    /*******************************************************************************
     *
     *  HAL_Dogs102x6.c - Driver for the DOGS 102x6 display
     *
     *  Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
     *
     *  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       HAL_Dogs102x6.c
     * @addtogroup HAL_Dogs102x6
     * @{
     ******************************************************************************/
    #include "msp430.h"
    #include "HAL_Buttons.h"
    #include "HAL_Dogs102x6.h"
    
    // Macros
    #ifndef abs
    #    define abs(n)     (((n) < 0) ? -(n) : (n))
    #endif
    
    // For all commands, CD signal must = 0
    #define SET_COLUMN_ADDRESS_MSB        0x10  //Set SRAM col. addr. before write, last 4 bits =
                                                // ca4-ca7
    #define SET_COLUMN_ADDRESS_LSB        0x00  //Set SRAM col. addr. before write, last 4 bits =
                                                // ca0-ca3
    #define SET_POWER_CONTROL             0x2F  //Set Power control - booster, regulator, and follower
                                                // on
    #define SET_SCROLL_LINE               0x40  //Scroll image up by SL rows (SL = last 5 bits),
                                                // range:0-63
    #define SET_PAGE_ADDRESS              0xB0  //Set SRAM page addr (pa = last 4 bits), range:0-8
    #define SET_VLCD_RESISTOR_RATIO       0x27  //Set internal resistor ratio Rb/Ra to adjust contrast
    #define SET_ELECTRONIC_VOLUME_MSB     0x81  //Set Electronic Volume "PM" to adjust contrast
    #define SET_ELECTRONIC_VOLUME_LSB     0x0F  //Set Electronic Volume "PM" to adjust contrast (PM =
                                                // last 5 bits)
    #define SET_ALL_PIXEL_ON              0xA4  //Disable all pixel on (last bit 1 to turn on all pixels
                                                // - does not affect memory)
    #define SET_INVERSE_DISPLAY           0xA6  //Inverse display off (last bit 1 to invert display -
                                                // does not affect memory)
    #define SET_DISPLAY_ENABLE            0xAF  //Enable display (exit sleep mode & restore power)
    #define SET_SEG_DIRECTION             0xA1  //Mirror SEG (column) mapping (set bit0 to mirror
                                                // display)
    #define SET_COM_DIRECTION             0xC8  //Mirror COM (row) mapping (set bit3 to mirror display)
    #define SYSTEM_RESET                  0xE2  //Reset the system. Control regs reset, memory not
                                                // affected
    #define NOP                           0xE3  //No operation
    #define SET_LCD_BIAS_RATIO            0xA2  //Set voltage bias ratio (BR = bit0)
    #define SET_CURSOR_UPDATE_MODE        0xE0  //Column address will increment with write operation
                                                // (but no wrap around)
    #define RESET_CURSOR_UPDATE_MODE      0xEE  //Return cursor to column address from before cursor
                                                // update mode was set
    #define SET_ADV_PROGRAM_CONTROL0_MSB  0xFA  //Set temp. compensation curve to -0.11%/C
    #define SET_ADV_PROGRAM_CONTROL0_LSB  0x90
    
    // Pins from MSP430 connected to LCD
    #define CD              BIT6
    #define CS              BIT4
    #define RST             BIT7
    #define BACKLT          BIT6
    #define SPI_SIMO        BIT1
    #define SPI_CLK         BIT3
    
    // Ports
    #define CD_RST_DIR      P5DIR
    #define CD_RST_OUT      P5OUT
    #define CS_BACKLT_DIR   P7DIR
    #define CS_BACKLT_OUT   P7OUT
    #define CS_BACKLT_SEL   P7SEL
    #define SPI_SEL         P4SEL
    #define SPI_DIR         P4DIR
    
    // Font lookup table
    static const uint8_t FONT6x8[] = {
        /* 6x8 font, each line is a character each byte is a one pixel wide column
         * of that character. MSB is the top pixel of the column, LSB is the bottom
         * pixel of the column. 0 = pixel off. 1 = pixel on. */
    
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // space
        0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, // !
        0x00, 0xE0, 0x00, 0xE0, 0x00, 0x00, // "
        0x28, 0xFE, 0x28, 0xFE, 0x28, 0x00, // #
        0x24, 0x54, 0xFE, 0x54, 0x48, 0x00, // $
        0xC4, 0xC8, 0x10, 0x26, 0x46, 0x00, // %
        0x6C, 0x92, 0x6A, 0x04, 0x0A, 0x00, // &
        0x00, 0x10, 0xE0, 0xC0, 0x00, 0x00, // '
        0x00, 0x38, 0x44, 0x82, 0x00, 0x00, // (
        0x00, 0x82, 0x44, 0x38, 0x00, 0x00, // )
        0x54, 0x38, 0xFE, 0x38, 0x54, 0x00, // *
        0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, // +
        0x00, 0x02, 0x1C, 0x18, 0x00, 0x00, // ,
        0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
        0x00, 0x00, 0x06, 0x06, 0x00, 0x00, // .
        0x04, 0x08, 0x10, 0x20, 0x40, 0x00, // /
        //96 Bytes
        0x7C, 0x8A, 0x92, 0xA2, 0x7C, 0x00, // 0
        0x00, 0x42, 0xFE, 0x02, 0x00, 0x00, // 1
        0x42, 0x86, 0x8A, 0x92, 0x62, 0x00, // 2
        0x84, 0x82, 0x92, 0xB2, 0xCC, 0x00, // 3
        0x18, 0x28, 0x48, 0xFE, 0x08, 0x00, // 4
        0xE4, 0xA2, 0xA2, 0xA2, 0x9C, 0x00, // 5
        0x3C, 0x52, 0x92, 0x92, 0x0C, 0x00, // 6
        0x82, 0x84, 0x88, 0x90, 0xE0, 0x00, // 7
        0x6C, 0x92, 0x92, 0x92, 0x6C, 0x00, // 8
        0x60, 0x92, 0x92, 0x94, 0x78, 0x00, // 9
        0x00, 0x00, 0x28, 0x00, 0x00, 0x00, // :
        0x00, 0x00, 0x02, 0x2C, 0x00, 0x00, // ;
        0x00, 0x10, 0x28, 0x44, 0x82, 0x00, // <
        0x28, 0x28, 0x28, 0x28, 0x28, 0x00, // =
        0x00, 0x82, 0x44, 0x28, 0x10, 0x00, // >
        0x40, 0x80, 0x8A, 0x90, 0x60, 0x00, // ?
        //96*2 = 192 Bytes
        0x7C, 0x82, 0xBA, 0x9A, 0x72, 0x00, // @
        0x3E, 0x48, 0x88, 0x48, 0x3E, 0x00, // A
        0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00, // B
        0x7C, 0x82, 0x82, 0x82, 0x44, 0x00, // C
        0xFE, 0x82, 0x82, 0x82, 0x7C, 0x00, // D
        0xFE, 0x92, 0x92, 0x92, 0x82, 0x00, // E
        0xFE, 0x90, 0x90, 0x90, 0x80, 0x00, // F
        0x7C, 0x82, 0x92, 0x92, 0x5E, 0x00, // G
        0xFE, 0x10, 0x10, 0x10, 0xFE, 0x00, // H
        0x00, 0x82, 0xFE, 0x82, 0x00, 0x00, // I
        0x04, 0x02, 0x82, 0xFC, 0x80, 0x00, // J
        0xFE, 0x10, 0x28, 0x44, 0x82, 0x00, // K
        0xFE, 0x02, 0x02, 0x02, 0x02, 0x00, // L
        0xFE, 0x40, 0x38, 0x40, 0xFE, 0x00, // M
        0xFE, 0x20, 0x10, 0x08, 0xFE, 0x00, // N
        0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00, // O
        //96*3 = 288 Bytes
        0xFE, 0x90, 0x90, 0x90, 0x60, 0x00, // P
        0x7C, 0x82, 0x8A, 0x84, 0x7A, 0x00, // Q
        0xFE, 0x90, 0x98, 0x94, 0x62, 0x00, // R
        0x64, 0x92, 0x92, 0x92, 0x4C, 0x00, // S
        0x80, 0x80, 0xFE, 0x80, 0x80, 0x00, // T
        0xFC, 0x02, 0x02, 0x02, 0xFC, 0x00, // U
        0xF8, 0x04, 0x02, 0x04, 0xF8, 0x00, // V
        0xFC, 0x02, 0x1C, 0x02, 0xFC, 0x00, // W
        0xC6, 0x28, 0x10, 0x28, 0xC6, 0x00, // X
        0xC0, 0x20, 0x1E, 0x20, 0xC0, 0x00, // Y
        0x86, 0x8A, 0x92, 0xA2, 0xC2, 0x00, // Z
        0x00, 0xFE, 0x82, 0x82, 0x82, 0x00, // [
        0x40, 0x20, 0x10, 0x08, 0x04, 0x00, // '\'
        0x00, 0x82, 0x82, 0x82, 0xFE, 0x00, // ]
        0x20, 0x40, 0x80, 0x40, 0x20, 0x00, // ^
        0x01, 0x01, 0x01, 0x01, 0x01, 0x00, // _
        //96*4 = 384 Bytes
        0x00, 0xC0, 0xE0, 0x10, 0x00, 0x00, // `
        0x04, 0x2A, 0x2A, 0x2A, 0x1E, 0x00, // a
        0xFE, 0x14, 0x22, 0x22, 0x1C, 0x00, // b
        0x1C, 0x22, 0x22, 0x22, 0x14, 0x00, // c
        0x1C, 0x22, 0x22, 0x14, 0xFE, 0x00, // d
        0x1C, 0x2A, 0x2A, 0x2A, 0x18, 0x00, // e
        0x00, 0x10, 0x7E, 0x90, 0x40, 0x00, // f
        0x18, 0x25, 0x25, 0x25, 0x3E, 0x00, // g
        0xFE, 0x10, 0x20, 0x20, 0x1E, 0x00, // h
        0x00, 0x22, 0xBE, 0x02, 0x00, 0x00, // i
        0x00, 0x04, 0x02, 0x02, 0xBC, 0x00, // j
        0x00, 0xFE, 0x08, 0x14, 0x22, 0x00, // k
        0x00, 0x82, 0xFE, 0x02, 0x00, 0x00, // l
        0x3E, 0x20, 0x1E, 0x20, 0x1E, 0x00, // m
        0x3E, 0x10, 0x20, 0x20, 0x1E, 0x00, // n
        0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, // o
        //96*5 = 480 Bytes
        0x3F, 0x18, 0x24, 0x24, 0x18, 0x00, // p
        0x18, 0x24, 0x24, 0x18, 0x3F, 0x00, // q
        0x3E, 0x10, 0x20, 0x20, 0x10, 0x00, // r
        0x12, 0x2A, 0x2A, 0x2A, 0x24, 0x00, // s
        0x20, 0x20, 0xFC, 0x22, 0x24, 0x00, // t
        0x3C, 0x02, 0x02, 0x04, 0x3E, 0x00, // u
        0x38, 0x04, 0x02, 0x04, 0x38, 0x00, // v
        0x3C, 0x02, 0x0C, 0x02, 0x3C, 0x00, // w
        0x22, 0x14, 0x08, 0x14, 0x22, 0x00, // x
        0x32, 0x09, 0x09, 0x09, 0x3E, 0x00, // y
        0x22, 0x26, 0x2A, 0x32, 0x22, 0x00, // z
        0x00, 0x10, 0x6C, 0x82, 0x00, 0x00, // {
        0x00, 0x00, 0xEE, 0x00, 0x00, 0x00, // |
        0x00, 0x82, 0x6C, 0x10, 0x00, 0x00, // }
        0x40, 0x80, 0x40, 0x20, 0x40, 0x00, // ~
        0x00, 0x60, 0x90, 0x90, 0x60, 0x00, // degrees symbol
        //96*6 = 576 Bytes
        //Special Characters ** NON-ASCII **
        0x00, 0x00, 0xFE, 0x82, 0x82, 0x82, // [
        0x82, 0x82, 0x82, 0xFE, 0x00, 0x00  //  ]
    };
    
    // Variables
    
    // Store a copy of the lcd memory (8x102) = 816 bytes
    // Since we cannot read from the lcd memory, this is a way to keep track of
    // what is stored there Two additional byes are used for driver-
    // internal purposes
    uint8_t dogs102x6Memory[816 + 2];
    
    uint8_t currentPage = 0, currentColumn = 0;
    
    uint8_t backlight  = 8;
    uint8_t contrast = 0x0F;
    uint8_t drawmode = DOGS102x6_DRAW_IMMEDIATE;
    
    // Dog102-6 Initialization Commands
    uint8_t Dogs102x6_initMacro[] = {
        SET_SCROLL_LINE,
        SET_SEG_DIRECTION,
        SET_COM_DIRECTION,
        SET_ALL_PIXEL_ON,
        SET_INVERSE_DISPLAY,
        SET_LCD_BIAS_RATIO,
        SET_POWER_CONTROL,
        SET_VLCD_RESISTOR_RATIO,
        SET_ELECTRONIC_VOLUME_MSB,
        SET_ELECTRONIC_VOLUME_LSB,
        SET_ADV_PROGRAM_CONTROL0_MSB,
        SET_ADV_PROGRAM_CONTROL0_LSB,
        SET_DISPLAY_ENABLE,
        SET_PAGE_ADDRESS,
        SET_COLUMN_ADDRESS_MSB,
        SET_COLUMN_ADDRESS_LSB
    };
    
    /***************************************************************************//**
     * @brief   Initialize LCD
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_init(void)
    {
        // Port initialization for LCD operation
        CD_RST_DIR |= RST;
        // Reset is active low
        CD_RST_OUT &= RST;
        // Reset is active low
        CD_RST_OUT |= RST;
        // Chip select for LCD
        CS_BACKLT_DIR |= CS;
        // CS is active low
        CS_BACKLT_OUT &= ~CS;
        // Command/Data for LCD
        CD_RST_DIR |= CD;
        // CD Low for command
        CD_RST_OUT &= ~CD;
    
        // P4.1 option select SIMO
        SPI_SEL |= SPI_SIMO;
        SPI_DIR |= SPI_SIMO;
        // P4.3 option select CLK
        SPI_SEL |= SPI_CLK;
        SPI_DIR |= SPI_CLK;
    
        // Initialize USCI_B1 for SPI Master operation
        // Put state machine in reset
        UCB1CTL1 |= UCSWRST;
        //3-pin, 8-bit SPI master
        UCB1CTL0 = UCCKPH + UCMSB + UCMST + UCMODE_0 + UCSYNC;
        // Clock phase - data captured first edge, change second edge
        // MSB
        // Use SMCLK, keep RESET
        UCB1CTL1 = UCSSEL_2 + UCSWRST;
        UCB1BR0 = 0x02;
        UCB1BR1 = 0;
        // Release USCI state machine
        UCB1CTL1 &= ~UCSWRST;
        UCB1IFG &= ~UCRXIFG;
    
        Dogs102x6_writeCommand(Dogs102x6_initMacro, 13);
    
        // Deselect chip
        CS_BACKLT_OUT |= CS;
    
        dogs102x6Memory[0] = 102;
        dogs102x6Memory[1] = 8;
    }
    
    /***************************************************************************//**
     * @brief   Initialize Backlight
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_backlightInit(void)
    {
        // Turn on Backlight
        CS_BACKLT_DIR |= BACKLT;
        CS_BACKLT_OUT |= BACKLT;
        // Uses PWM to control brightness
        CS_BACKLT_SEL |= BACKLT;
    
        // start at full brightness (8)
        TB0CCTL4 = OUTMOD_7;
        TB0CCR4 = TB0CCR0 >> 1;
    
        TB0CCR0 = 50;
        TB0CTL = TBSSEL_1 + MC_1;
    }
    
    /***************************************************************************//**
     * @brief  Set function for the backlight PWM's duty cycle
     *
     * @param  BackLightLevel The target backlight duty cycle - valued 0~11.
     *
     * @return none
     ******************************************************************************/
    
    void Dogs102x6_setBacklight(uint8_t brightness)
    {
        unsigned int dutyCycle = 0, i, dummy;
    
        if (brightness > 0)
        {
            TB0CCTL4 = OUTMOD_7;
            dummy = (TB0CCR0 >> 4);
    
            dutyCycle = 12;
            for (i = 0; i < brightness; i++)
                dutyCycle += dummy;
    
            TB0CCR4 = dutyCycle;
    
            //If the backlight was previously turned off, turn it on.
            if (!backlight)
                TB0CTL |= MC0;
        }
        else
        {
            TB0CCTL4 = 0;
            TB0CTL &= ~MC0;
        }
        backlight = brightness;
    }
    
    /***************************************************************************//**
     * @brief   Disable display
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_disable(void)
    {
        uint8_t cmd[1] = { SYSTEM_RESET };
    
        Dogs102x6_writeCommand(cmd, 1);
        cmd[0] = SET_DISPLAY_ENABLE & 0xFE;
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /***************************************************************************//**
     * @brief   Sends commands to LCD via 3 wire SPI
     * @param   sCmd Pointer to the commands to be written to the LCD
     * @param   i Number of commands to be written to the LCD
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_writeCommand(uint8_t *sCmd, uint8_t i)
    {
        // Store current GIE state
        uint16_t gie = __get_SR_register() & GIE;
    
        // Make this operation atomic
        __disable_interrupt();
    
        // CS Low
        P7OUT &= ~CS;
    
        // CD Low
        P5OUT &= ~CD;
        while (i)
        {
            // USCI_B1 TX buffer ready?
            while (!(UCB1IFG & UCTXIFG)) ;
    
            // Transmit data
            UCB1TXBUF = *sCmd;
    
            // Increment the pointer on the array
            sCmd++;
    
            // Decrement the Byte counter
            i--;
        }
    
        // Wait for all TX/RX to finish
        while (UCB1STAT & UCBUSY) ;
    
        // Dummy read to empty RX buffer and clear any overrun conditions
        UCB1RXBUF;
    
        // CS High
        P7OUT |= CS;
    
        // Restore original GIE state
        __bis_SR_register(gie);
    }
    
    /***************************************************************************//**
     * @brief   Sends Data to LCD via 3 wire SPI
     * @param   sData Pointer to the Data to be written to the LCD
     * @param   i Number of data bytes to be written to the LCD
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_writeData(uint8_t *sData, uint8_t i)
    {
        // Store current GIE state
        uint16_t gie = __get_SR_register() & GIE;
    
        // Make this operation atomic
        __disable_interrupt();
    
        if (drawmode == DOGS102x6_DRAW_ON_REFRESH) 
        {
          while (i)
          {
              dogs102x6Memory[2 + (currentPage * 102) + currentColumn] = (uint8_t)*sData++;
              currentColumn++;
      
              // Boundary check
              if (currentColumn > 101)
              {
                  currentColumn = 101;
              }
              
              // Decrement the Byte counter
              i--;
          }
        } 
        else 
        {
        
          // CS Low
          P7OUT &= ~CS;
          //CD High
          P5OUT |= CD;
      
          while (i)
          {
              dogs102x6Memory[2 + (currentPage * 102) + currentColumn] = (uint8_t)*sData;
              currentColumn++;
      
              // Boundary check
              if (currentColumn > 101)
              {
                  currentColumn = 101;
              }
      
              // USCI_B1 TX buffer ready?
              while (!(UCB1IFG & UCTXIFG)) ;
      
              // Transmit data and increment pointer
              UCB1TXBUF = *sData++;
      
              // Decrement the Byte counter
              i--;
          }
      
          // Wait for all TX/RX to finish
          while (UCB1STAT & UCBUSY) ;
      
          // Dummy read to empty RX buffer and clear any overrun conditions
          UCB1RXBUF;
      
          // CS High
          P7OUT |= CS;
        }
        
        // Restore original GIE state
        __bis_SR_register(gie);
    }
    
    /***************************************************************************//**
     * @brief   Gets the current contrast level
     * @param   None
     * @return  Contrast level
     ******************************************************************************/
    
    uint8_t Dogs102x6_getContrast(void)
    {
        return contrast;
    }
    
    /***************************************************************************//**
     * @brief   Gets the current backlight level
     * @param   None
     * @return  Backlight level
     ******************************************************************************/
    
    uint8_t Dogs102x6_getBacklight(void)
    {
        return backlight;
    }
    
    /***************************************************************************//**
     * @brief   Sets Address of the LCD RAM memory
     *
     *          (0,0) is the upper left corner of screen.
     * @param   pa Page Address of the LCD RAM memory to be written (0 - 7)
     * @param   ca Column Address of the LCD RAM memory to be written (0 - 101)
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_setAddress(uint8_t pa, uint8_t ca)
    {
        uint8_t cmd[1];
        
        // Page boundary check
        if (pa > 7)
        {
            pa = 7;
        }
    
        // Column boundary check
        if (ca > 101)
        {
            ca = 101;
        }
    
        // Page Address Command = Page Address Initial Command + Page Address
        cmd[0] = SET_PAGE_ADDRESS + (7 - pa);
        uint8_t H = 0x00;
        uint8_t L = 0x00;
        uint8_t ColumnAddress[] = { SET_COLUMN_ADDRESS_MSB, SET_COLUMN_ADDRESS_LSB };
    
        currentPage = pa;
        currentColumn = ca;
    
        if (drawmode == DOGS102x6_DRAW_ON_REFRESH) return; // exit if drawmode on refresh
    
        // Separate Command Address to low and high
        L = (ca & 0x0F);
        H = (ca & 0xF0);
        H = (H >> 4);
        // Column Address CommandLSB = Column Address Initial Command
        //                             + Column Address bits 0..3
        ColumnAddress[0] = SET_COLUMN_ADDRESS_LSB + L;
        // Column Address CommandMSB = Column Address Initial Command
        //                             + Column Address bits 4..7
        ColumnAddress[1] = SET_COLUMN_ADDRESS_MSB + H;
    
        // Set page address
        Dogs102x6_writeCommand(cmd, 1);
        // Set column address
        Dogs102x6_writeCommand(ColumnAddress, 2);
    }
    
    /***************************************************************************//**
     * @brief   Sets the contrast
     * @param   contrast Contrast level (0~31, where 31 is darkest setting)
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_setContrast(uint8_t newContrast)
    {
        uint8_t cmd[2];
    
        cmd[0] = SET_ELECTRONIC_VOLUME_MSB;
    
        //check if parameter is in range
        if (newContrast > 0x1F)
            cmd[1] = 0x1F;
        else
            cmd[1] = newContrast;
    
        contrast = cmd[1];
    
        Dogs102x6_writeCommand(cmd, 2);
    
        // Save new contrast to initMacro
        Dogs102x6_initMacro[8] = newContrast;
    }
    
    /***************************************************************************//**
     * @brief   Inverts the screen (pixels on/off) - does not affect LCD memory.
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_setInverseDisplay(void)
    {
        uint8_t cmd[] = {SET_INVERSE_DISPLAY + 0x01};
    
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /***************************************************************************//**
     * @brief   Uninverts the screen (pixels on/off) - does not affect LCD memory.
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_clearInverseDisplay(void)
    {
        uint8_t cmd[] = {SET_INVERSE_DISPLAY};
    
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /***************************************************************************//**
     * @brief   Scrolls image down a number of lines. The scrolling wraps around the screen.
     * @param   lines number of lines to scroll (0~63)
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_scrollLine(uint8_t lines)
    {
        uint8_t cmd[] = {SET_SCROLL_LINE};
    
        //check if parameter is in range
        if (lines > 0x1F)
        {
            cmd[0] |= 0x1F;
        }
        else
        {
            cmd[0] |= lines;
        }
    
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /***************************************************************************//**
     * @brief   Sets all Pixels on
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_setAllPixelsOn(void)
    {
        uint8_t cmd[] = {SET_ALL_PIXEL_ON + 0x01};
    
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /***************************************************************************//**
     * @brief   Returns pixels to normal functioning
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_clearAllPixelsOn(void)
    {
        uint8_t cmd[] = {SET_ALL_PIXEL_ON};
    
        Dogs102x6_writeCommand(cmd, 1);
    }
    
    /****************************DRAWING FUNCTIONS*********************************/
    
    /***************************************************************************//**
     * @brief   Sets All pixels Off (in memory as well)
     * @param   None
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_clearScreen(void)
    {
        uint8_t LcdData[] = {0x00};
        uint8_t p, c;
    
        // 8 total pages in LCD controller memory
        for (p = 0; p < 8; p++)
        {
            Dogs102x6_setAddress(p, 0);
            // 102 total columns in LCD controller memory
            for (c = 0; c < 102; c++)
            {
                Dogs102x6_writeData(LcdData, 1);
            }
        }
    }
    
    /***************************************************************************//**
     * @brief   Writes a character from FONT6x8[] array to the LCD at (row,col).
     *
     *          (0,0) is the upper left corner of screen.
     * @param   row Page Address (0 - 7) (there are 8 pages on the screen, each is 8 pixels tall)
     * @param   col Column Address (there are 102 columns on the screen)
     * @param   f Pointer to the character to be written to the LCD
     * @param   style The style of the text
     *                - NORMAL = 0 = dark letters with light background
     *                - INVERT = 1 = light letters with dark background
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_charDraw(uint8_t row, uint8_t col, uint16_t f, uint8_t style)
    {
        // Each Character consists of 6 Columns on 1 Page
        // Each Page presents 8 pixels vertically (top = MSB)
        uint8_t b;
        uint16_t h;
        uint8_t inverted_char[6];
    
        // Row boundary check
        if (row > 7)
        {
            row = 7;
        }
    
        // Column boundary check
        if (col > 101)
        {
            col = 101;
        }
    
        // handle characters not in our table
        if (f < 32 || f > 129)
        {
            // replace the invalid character with a '.'
            f = '.';
        }
    
        // subtract 32 because FONT6x8[0] is "space" which is ascii 32,
        // multiply by 6 because each character is columns wide
        h = (f - 32) * 6;
    
        Dogs102x6_setAddress(row, col);
        if (style == DOGS102x6_DRAW_NORMAL)
        {
            // write character
            Dogs102x6_writeData((uint8_t *)FONT6x8 + h, 6);
        }
        else
        {
            for (b = 0; b < 6; b++)
            {
                // invert the character
                inverted_char[b] = FONT6x8[h + b] ^ 0xFF;
            }
            // write inverted character
            Dogs102x6_writeData(inverted_char, 6);
        }
    }
    
    /***************************************************************************//**
     * @brief   Writes a character from FONT6x8[] array to the LCD at (x,y).
     *
     *          (0,0) is the upper left corner of screen.
     * @param   x Horizontal coordinate (0 - 102)
     * @param   y Vertical coordinate (0 - 63)
     * @param   f Pointer to the character to be written to the LCD
     * @param   style The style of the text
     *                - NORMAL = 0 = dark letters with light background
     *                - INVERT = 1 = light letters with dark background
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_charDrawXY(uint8_t x, uint8_t y, uint16_t f, uint8_t style)
    {
        // Each Character consists of 6 Columns 8 pixels tall
        uint8_t b, row;
        uint16_t h;
        uint8_t desired_char[12];
    
        // make sure we won't be writing off the screen
        if (x >= 102)
        {
            x = 101;
        }
        if (y >= 64)
        {
            y = 63;
        }
    
        // handle characters not in our table
        if (f < 32 || f > 129)
        {
            // replace the invalid character with a '.'
            f = '.';
        }
    
        // subtract 32 because FONT6x8[0] is 'space' which is ascii 32,
        // multiply by 6 because each character is 6 columns wide
        h = (f - 32) * 6;
    
        // Check if there is a remainder
        row = y >> 3;                        // identical to: row = y / 8;
    
        if (style == DOGS102x6_DRAW_NORMAL)
        {
            for (b = 0; b < 6; b++)
            {
                desired_char[b] =
                    (FONT6x8[h + b] >> (y % 8)) | dogs102x6Memory[2 + (row * 102) + x + b];
                desired_char[b + 6] =
                    FONT6x8[h + b] << (8 - y % 8) | dogs102x6Memory[2 + ((row + 1) * 102) + x + b];
            }
        }
        else
        {
            for (b = 0; b < 6; b++)
            {
                desired_char[b] = (FONT6x8[h + b] ^ 0xFF) >> (y & 0x07);         // identical to: (y % 8);
                desired_char[b + 6] = (FONT6x8[h + b] ^ 0xFF) << (8 - y & 0x07); // identical to: y % 8);
            }
        }
        Dogs102x6_setAddress(row, x);
        // write first line of character
        Dogs102x6_writeData(desired_char, 6);
        Dogs102x6_setAddress(row + 1, x);
        // write second line of character
        Dogs102x6_writeData(desired_char + 6, 6);
    }
    
    /***************************************************************************//**
     * @brief   Writes a String to the LCD at (row,col).
     *
     *          (0,0) is the upper left corner of screen.
     * @param   row Page Address (there are 8 pages on the screen, each is 8 pixels
     *          tall) (0 - 7)
     * @param   col Column Address (there are 102 columns on the screen) (0 - 101)
     * @param   word[] Pointer to the String to be written to the LCD
     * @param   style The style of the text
     *                - NORMAL = 0 = dark letters with light background
     *                - INVERT = 1 = light letters with dark background
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_stringDraw(uint8_t row, uint8_t col, char *word, uint8_t style)
    {
        // Each Character consists of 6 Columns on 1 Page
        // Each Page presents 8 pixels vertically (top = MSB)
        uint8_t a = 0;
    
        // Row boundary check
        if (row > 7)
        {
            row = 7;
        }
    
        // Column boundary check
        if (col > 101)
        {
            col = 101;
        }
    
        while (word[a] != 0)
        {
            // check for line feed '/n'
            if (word[a] != 0x0A)
            {
                //check for carriage return '/r' (ignore if found)
                if (word[a] != 0x0D)
                {
                    //Draw a character
                    Dogs102x6_charDraw(row, col, word[a], style);
    
                    //Update location
                    col += 6;
    
                    //Text wrapping
                    if (col >= 102)
                    {
                        col = 0;
                        if (row < 7)
                            row++;
                        else
                            row = 0;
                    }
                }
            }
            // handle line feed character
            else
            {
                if (row < 7)
                    row++;
                else
                    row = 0;
                col = 0;
            }
            a++;
        }
    }
    
    /***************************************************************************//**
     * @brief   Writes a String to the LCD at (x,y).
     *
     *          (0,0) is the upper left corner of screen.
     * @param   x Horizontal coordinate
     * @param   y Vertical coordinate
     * @param   word[] Pointer to the String to be written to the LCD
     * @param   style The style of the text
     *                - NORMAL = 0 = dark letters with light background
     *                - INVERT = 1 = light letters with dark background
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_stringDrawXY(uint8_t x, uint8_t y, char *word, uint8_t style)
    {
        /* Each Character consists of 6 Columns on 1 Page
         * Each Page presents 8 pixels vertically (top = MSB)*/
        uint8_t a = 0;
    
        while (word[a] != 0)
        {
            // Draw a character
            Dogs102x6_charDrawXY(x, y, word[a], style);
    
            // Update location
            x += 6;
    
            // Text wrapping
            if (x >= 102)
            {
                x = 0;
                if (y + 8 < 64)
                    y += 8;
                else
                    y = 0;
            }
            a++;
        }
    }
    
    /***************************************************************************//**
     * @brief   Clears one row/page (in memory as well).
     *
     *          Row 0 is at the top of the screen.
     * @param   row The row to be cleared (0~7)
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_clearRow(uint8_t row)
    {
        uint8_t cmd[] = {0};
        uint8_t a = 0;
    
        // Check row boundary
        if (row > 7)
        {
            row = 7;
        }
    
        Dogs102x6_setAddress(row, 0);
        for (a = 0; a < 102; a++)
        {
            Dogs102x6_writeData(cmd, 1);
    //        dogs102x6Memory[2 + (row * 102) + a] = 0x00;   // this is already done in writeData
        }
    }
    
    /***************************************************************************//**
     * @brief  Draws a pixel at (x,y).
     *
     *          (0,0) is the upper left corner of screen.
     * @param  x x-coordinate of the point
     * @param  y y-coordinate of the point
     * @param   style The style of the pixel
     *                - NORMAL = 0 = dark pixel
     *                - INVERT = 1 = inverts pixel
     * @return None
     ******************************************************************************/
    
    void Dogs102x6_pixelDraw(uint8_t x, uint8_t y, uint8_t style)
    {
        uint8_t p, temp;
    
        //make sure we won't be writing off the screen
        if (x > 101)
        {
            x = 101;
        }
    
        if (y > 63)
        {
            y = 63;
        }
    
        //determine the page
        p = y >> 3;                        // identical to: p = y / 8;
    
        //determine height of pixel within the page
        temp = 0x80 >> (y & 0x07);         // identical to: temp = 0x80 >> (y % 8);
    
        //update our array
        if (style == DOGS102x6_DRAW_NORMAL)
            dogs102x6Memory[2 + (p * 102) + x] |= temp;
        else
            dogs102x6Memory[2 + (p * 102) + x] &= ~temp;
    
        Dogs102x6_setAddress(p, x);
    
        //draw pixel
        Dogs102x6_writeData(dogs102x6Memory + (2 + (p * 102) + x), 1);
    }
    
    /***************************************************************************//**
     * @brief   Draws a horizontal line on the LCD.
     *
     *          (0,0) is the upper left corner of screen.
     * @param   x1 The horizontal line starting pixel coordinate (0~101)
     * @param   x2 The horizontal line ending pixel coordinate (0~101)
     * @param   y  The height of the line (pixel row, not page) (0~63)
     * @param   style The style of the line
     *                - NORMAL = 0 = dark line, overwrites
     *                - INVERT = 1 = inverts color on line
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_horizontalLineDraw(uint8_t x1, uint8_t x2, uint8_t y, uint8_t style)
    {
        uint8_t temp = 0, p, a;
    
        //make sure we won't be writing off the screen
        if (x1 > 101)
        {
            x1 = 101;
        }
    
        if (x2 > 101)
        {
            x2 = 101;
        }
    
        if (y > 63)
        {
            y = 63;
        }
    
        //swap coordinates if x1 is past x2
        if (x1 > x2)
        {
            temp = x1;
            x1 = x2;
            x2 = temp;
        }
    
        //determine the page
        p = y >> 3;                        // identical to: p = y / 8;
        //determine height of line within the page
        temp = 0x80 >> (y & 0x07);         // identical to: temp = 0x80 >> (y % 8);
    
        a = x1;
        while (a <= x2)
        {
            if (style == DOGS102x6_DRAW_NORMAL)
            {
                //draws a dark line through everything
                dogs102x6Memory[2 + (p * 102) + a] |= temp;
            }
            else
            {
                //draws a light line through everything
                dogs102x6Memory[2 + (p * 102) + a] &= ~temp;
            }
    
            a++;
        }
    
        Dogs102x6_setAddress(p, x1);
    
        //draw the line
        Dogs102x6_writeData(dogs102x6Memory + (2 + (p * 102) + x1), x2 - x1 + 1);
    }
    
    /***************************************************************************//**
     * @brief   Draws a vertical line on the LCD.
     *
     *          (0,0) is the upper left corner of screen.
     * @param   y1 The vertical line starting pixel coordinate (0~63)
     * @param   y2 The vertical line ending pixel coordinate (0~63)
     * @param   x  The column of line (0~101)
     * @param   style The style of the line
     *                - NORMAL = 0 = dark line, overwrites
     *                - INVERT = 1 = inverts color on line
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_verticalLineDraw(uint8_t y1, uint8_t y2, uint8_t x, uint8_t style)
    {
        uint8_t temp1 = 0, temp2 = 0, p1, p2, a;
    
        //make sure we won't be writing off the screen
        if (y1 > 63)
        {
            y1 = 63;
        }
    
        if (y2 > 63)
        {
            y2 = 63;
        }
    
        if (x > 101)
        {
            x = 101;
        }
    
        //swap coordinates if y1 is past y2
        if (y1 > y2)
        {
            temp1 = y1;
            y1 = y2;
            y2 = temp1;
        }
    
        //determine the first page of line
        p1 = y1 >> 3;                        // identical to: p1 = y1 / 8;
        //determine the last page of line
        p2 = y2 >> 3;                        // identical to: p2 = y2 / 8;
    
        //mask for last page of line
        temp2 = 8 - (y2 & 0x07);            // identical to: temp2 = 8 - (y2 % 8);
        temp2--;
        temp2 = 0xFF << temp2;
    
        //mask for first page of line
        // Length that spans across multiple pages
        if (p1 != p2)
        {
            // Check if there is an offset
            if (y1 > 0)
            {
                temp1 = 0xFF00 >> (y1 & 0x07);         // identical to: temp1 = 0xFF00 >> (y1 % 8);
                temp1 = temp1 ^ 0xFF;
            }
            // If there is no offset, set all bits for lower mask
            else
            {
                temp1 = 0xFF;
            }
        }
        // Short length that only spans one page
        else
        {
            // Clear lower page bits
            temp1 = 0;
    
            // mask off y1 from top page bits
            a = y1 - (p1 * 8);
            a = 0xFF00 >> a;
            temp2 = temp2 ^ a;
        }
    
        // Prepare for first page of line
        if (style == DOGS102x6_DRAW_NORMAL)
        {
            dogs102x6Memory[2 + (p1 * 102) + x] |= temp1;
        }
        else
        {
            dogs102x6Memory[2 + (p1 * 102) + x] &= ~temp1;
        }
    
        // Set starting address for first page
        Dogs102x6_setAddress(p1, x);
        //draw first page of line
        Dogs102x6_writeData(dogs102x6Memory + (2 + (p1 * 102) + x), 1);
    
        a = p1 + 1;
        while (a < p2)
        {
            if (style == DOGS102x6_DRAW_NORMAL)
            {
                //draws a dark line through everything
                dogs102x6Memory[2 + (a * 102) + x] = 0xFF;
            }
            else
            {
                //draws a light line through everything
                dogs102x6Memory[2 + (a * 102) + x] &= 0x00;
            }
            Dogs102x6_setAddress(a, x);
            // draw middle of line
            Dogs102x6_writeData(dogs102x6Memory + (2 + (a * 102) + x), 1);
            a++;
        }
    
        // Prepare for last page of line
        if (style == DOGS102x6_DRAW_NORMAL)
        {
            dogs102x6Memory[2 + (p2 * 102) + x] |= temp2;
        }
        else
        {
            dogs102x6Memory[2 + (p2 * 102) + x] &= ~temp2;
        }
    
        Dogs102x6_setAddress(p2, x);
        //draw last page of line
        Dogs102x6_writeData(dogs102x6Memory + (2 + (p2 * 102) + x), 1);
    }
    
    /***************************************************************************//**
     * @brief  Draws a line from (x1,y1) to (x2,y2).
     *
     *         Uses Bresenham's line algorithm.
     *         (0,0) is the upper left corner of screen.
     * @param  x1   x-coordinate of the first point
     * @param  y    y-coordinate of the first point
     * @param  x2   x-coordinate of the second point
     * @param  y2   y-coordinate of the second point
     * @param   style The style of the line
     *                - NORMAL = 0 = dark line, overwrites
     *                - INVERT = 1 = inverts color on line
     * @return None
     ******************************************************************************/
    
    void Dogs102x6_lineDraw(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t style)
    {
        int8_t x, y, deltay, deltax, d;
        int8_t x_dir, y_dir;
    
        //make sure we won't be writing off the screen
        if (y1 > 63)
        {
            y1 = 63;
        }
    
        if (y2 > 63)
        {
            y2 = 63;
        }
    
        if (x1 > 101)
        {
            x1 = 101;
        }
    
        if (x2 > 101)
        {
            x2 = 101;
        }
    
        // Check if vertical line. Use more efficient vertical line function
        if (x1 == x2)
        {
            Dogs102x6_verticalLineDraw(y1, y2, x1, style);
        }
        // Check if horizontal line. Use more efficient horizontal line function
        else if (y1 == y2)
        {
            Dogs102x6_horizontalLineDraw(x1, x2, y1, style);
        }
        // else it is a diagonal line
        else
        {
            if (x1 > x2)
            {
                x_dir = -1;
            }
            else
            {
                x_dir = 1;
            }
    
            if (y1 > y2)
            {
                y_dir = -1;
            }
            else
            {
                y_dir = 1;
            }
    
            x = x1;
            y = y1;
            deltay = abs(y2 - y1);
            deltax = abs(x2 - x1);
    
            if (deltax >= deltay)
            {
                d = (deltay << 1) - deltax;
                while (x != x2)
                {
                    Dogs102x6_pixelDraw(x, y,  style);
                    if (d < 0)
                        d += (deltay << 1);
                    else
                    {
                        d += ((deltay - deltax) << 1);
                        y += y_dir;
                    }
                    x += x_dir;
                }
            }
            else
            {
                d = (deltax << 1) - deltay;
                while (y != y2)
                {
                    Dogs102x6_pixelDraw(x, y, style);
                    if (d < 0)
                        d += (deltax << 1);
                    else
                    {
                        d += ((deltax - deltay) << 1);
                        x += x_dir;
                    }
                    y += y_dir;
                }
            }
        }
    }
    
    /***************************************************************************//**
     * @brief   Draw a circle of Radius with center at (x,y).
     *
     *          Uses Bresenham's circle algorithm.
     *          (0,0) is the upper left corner of screen.
     * @param   x   x-coordinate of the circle's center point
     * @param   y   y-coordinate of the circle's center point
     * @param   radius  Radius of the circle
     * @param   style The style of the circle
     *                - NORMAL = 0 = dark line, overwrites
     *                - INVERT = 1 = inverts color on line
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_circleDraw(uint8_t x, uint8_t y, uint8_t radius, uint8_t style)
    {
        int8_t xx, yy, ddF_x, ddF_y, f;
    
        ddF_x = 0;
        ddF_y = -(2 * radius);
        f = 1 - radius;
    
        xx = 0;
        yy = radius;
        Dogs102x6_pixelDraw(x + xx, y + yy, style);
        Dogs102x6_pixelDraw(x + xx, y - yy, style);
        Dogs102x6_pixelDraw(x - xx, y + yy, style);
        Dogs102x6_pixelDraw(x - xx, y - yy, style);
        Dogs102x6_pixelDraw(x + yy, y + xx, style);
        Dogs102x6_pixelDraw(x + yy, y - xx, style);
        Dogs102x6_pixelDraw(x - yy, y + xx, style);
        Dogs102x6_pixelDraw(x - yy, y - xx, style);
        while (xx < yy)
        {
            if (f >= 0)
            {
                yy--;
                ddF_y += 2;
                f += ddF_y;
            }
            xx++;
            ddF_x += 2;
            f += ddF_x + 1;
            Dogs102x6_pixelDraw(x + xx, y + yy, style);
            Dogs102x6_pixelDraw(x + xx, y - yy, style);
            Dogs102x6_pixelDraw(x - xx, y + yy, style);
            Dogs102x6_pixelDraw(x - xx, y - yy, style);
            Dogs102x6_pixelDraw(x + yy, y + xx, style);
            Dogs102x6_pixelDraw(x + yy, y - xx, style);
            Dogs102x6_pixelDraw(x - yy, y + xx, style);
            Dogs102x6_pixelDraw(x - yy, y - xx, style);
        }
    }
    
    /***************************************************************************//**
     * @brief   Loads an image of size = height * width, starting at (row,col).
     *          The first two bytes of the image should contain the width in pixels
     *          and the height in rows (height in rows = height in pixels/8)
     *
     *          (0,0) is the upper left corner of screen.
     * @param   image[] The image to be loaded.
     * @param   height  The number of rows in the image. Size = Rows * Columns.
     * @param   width   The number of columns in the image. Size = Rows * Columns.
     * @param   row     row of the image's starting location
     * @param   col     column of the image's starting location
     * @return None
     ******************************************************************************/
    
    void Dogs102x6_imageDraw(const uint8_t IMAGE[], uint8_t row, uint8_t col)
    {
        // height in rows (row = 8 pixels), width in columns
        uint8_t a, height, width;
    
        width = IMAGE[0];
        height = IMAGE[1];
        for (a = 0; a < height; a++)
        {
            Dogs102x6_setAddress(row + a, col);
            // Draw a row of the image
            Dogs102x6_writeData((uint8_t*)IMAGE + 2 + a * width, width);
        }
    }
    
    /***************************************************************************//**
     * @brief   Clears an area of size = height * width, starting at (row,col).
     *
     *          (0,0) is the upper left corner of screen.
     * @param   height  The number of rows in the image. Size = Rows * Columns.
     * @param   width   The number of columns in the image. Size = Rows * Columns.
     * @param   row row of the image's starting location
     * @param   col column of the image's starting location
     * @return None
     ******************************************************************************/
    
    void Dogs102x6_clearImage(uint8_t height, uint8_t width, uint8_t row, uint8_t col)
    {
        uint8_t a, b;
        uint8_t cmd[] = {0x00};
    
        for (a = 0; a < height; a++)
        {
            Dogs102x6_setAddress(row + a, col);
            for (b = 0; b < width; b++)
            {
                // clear a byte
                Dogs102x6_writeData(cmd, 1);
            }
        }
    }
    
    /***************************************************************************//**
     * @brief   Disable refresh
     * @param   mode:  0:on update request 1:immediate (default)
    
     * @return  None
     ******************************************************************************/
    
    void Dogs102x6_refresh(uint8_t mode)
    {
      //uint8_t savedmode = drawmode;
      drawmode = DOGS102x6_DRAW_IMMEDIATE;
      Dogs102x6_imageDraw(dogs102x6Memory, 0, 0);
      //drawmode = savedmode;
      drawmode = mode;
    }
    
    /***************************************************************************//**
     * @}
     ******************************************************************************/



    i am very new to ti microcontrollers but we are in a contest where we HAVE to use only ti components....before this i used arduino.....now i can use energia but the

    lcd screen library there is for 16x2 ...

     

    already you have provided me a alot of of help.....i'll be forever indebted if u help us just give enough help to display "hello world".on the screen

     

    thank you

    Amarnath De

  • What kind of errors do you get? Also, if you've never used MSP430 before... then I would like you to quickly go through the sample codes right from "Blinking of LED"

    which will help you understand the structure of MSP projects. Else it would be very complicated for you to understand.

    Download MSP430Ware & go through this link:

    Regards,

    Gautam

  • sir i have msp430f5529 EXPERIMENT board....not launchpad.....i have succesfully interfaced my lcd with my board using ccs v6 by including the header file in my project .... but due to a change of plans i have decided to use enegia and the problem is that the lcd provided in the board is a dogs 102x64 lcd and the lcd is connected inernally with pins some of which are not mentioned in "pins_energia.h"file how will i add those new pins in the file????
  • Ohh.. Now I get it. I've personally not used Energia and hence won't be able to comment whether we can customize the above file. But generally the .h header files are editable... why don't you try customizing the header file as per your needs?

    Regards,
    Gautam
  • I too am working with the EA DOGS102W-6 display, however using a TM4C MCU, specifically TM4C123GXL. Does anyone know if the code provided for the MSP430 would be compatible for a TM4C? Or rather, are there parts of the code that would have to be modified? I have been struggling through an adaptation of some Atmel code provided by EA and getting stuck. Thanks!