Grove LCD Library

Grove_LCD_RGB_Backlight.cpp

Committer:
DavidElmoRoss
Date:
2020-12-31
Revision:
3:3946b6e87adc
Parent:
0:253885b1f364

File content as of revision 3:3946b6e87adc:

#include "mbed.h"
#include "Grove_LCD_RGB_Backlight.h"
char _displayfunction;
char _displaycontrol;

Grove_LCD_RGB_Backlight::Grove_LCD_RGB_Backlight(PinName sda, PinName scl):i2c(sda, scl)
{
    this->init();
}

/*This function is used to turn on the display on the LCD.  It sends the 
hexadecimal code for the display on setting to the device in order to 
turn on the display*/

void Grove_LCD_RGB_Backlight::displayOn() 
{
    _displaycontrol |= LCD_DISPLAYON;
    this->sendCommand(LCD_DISPLAYCONTROL | _displaycontrol);
}

/*This function is used to clear display on the LCD.  It sends the 
hexadecimal code for the clear instruction to the device in order to 
clear the display*/
void Grove_LCD_RGB_Backlight::clear()
{
    this->sendCommand(LCD_CLEARDISPLAY);        
    wait_us(2000);         
}


/*This function is used to set the backlight color of the dispaly.  
It writes the provided r, g, and b values to the registers for the red
value, the green value, and the blue value respectively.*/
void Grove_LCD_RGB_Backlight::setRGB(char r, char g, char b)
{
   
    this->setReg(RED_REG, r);
    this->setReg(GREEN_REG, g);
    this->setReg(BLUE_REG, b);  
    
}

/*This function is used to write to one of the registers for the backlight
of the LCD display.  The function takes in the address of which register to
write to and the value to be written to that register and then sends it to the
LCD display via the mbed I2C library*/
void Grove_LCD_RGB_Backlight::setReg(char addr, char val)
{
    char data[2];
    data[0] = addr;
    data[1] = val;
    i2c.write(RGB_ADDRESS, data, 2);
}

/*This function is used to write to the LCD screen.  It takes in a string of
characters and writes them to the 0x40 register of the display.*/
void Grove_LCD_RGB_Backlight::print(char *str)
{   
    char data[2];
    data[0] = 0x40;
    while(*str)
    {
            data[1] = *str;
            i2c.write(LCD_ADDRESS, data, 2);
            str++;
            
    }


}
void Grove_LCD_RGB_Backlight::write(char data1)
{
    char data[2];
    data[0]=0x40;
    data[1]=(data1 >>4)+0x30;
    i2c.write(LCD_ADDRESS,data,2);
    data[1]=(data1&0x0f)+0x30;
    i2c.write(LCD_ADDRESS,data,2);  
}

void Grove_LCD_RGB_Backlight::writech(char data2)
{
 char data[2];
 data[0]=0x40;
 data[1]=data2;
 i2c.write(LCD_ADDRESS,data,2);   
    
}

/*This function sets where on the screen the text will be written next.  It 
takes in two values which indicate the row and column on the display that 
the cursor should be moved to*/
void Grove_LCD_RGB_Backlight::locate(char col, char row)
{
    if(row == 0)
    {
        col = col | 0x80;
    }
    else
    {   
        col = col | 0xc0;
    }
 
    char data[2];
    data[0] = 0x80;
    data[1] = col;
    i2c.write(LCD_ADDRESS, data, 2);
}

/*This function sends an instruction to the LCD display using the
 built in instruction codes from the device  datasheet using the mbed
 I2C library*/
void Grove_LCD_RGB_Backlight::sendCommand(char value)
{
    char data[2] = {0x80, value};
    i2c.write(LCD_ADDRESS, data, 2);
}

void Grove_LCD_RGB_Backlight::init() 
{   
    //Initialize displayfunction parameter for setting up LCD display
   _displayfunction |= LCD_2LINE;
   _displayfunction |= LCD_5x10DOTS;
 
   //Wait for more than 30 ms after power rises above 4.5V per the data sheet
    wait_ms(50);


    // Send first function set command. Wait longer that 39 us per the data sheet
    sendCommand(LCD_FUNCTIONSET | _displayfunction);
    wait_us(45);  
    
    // turn the display on
    displayOn();

    // clear the display
    clear();
    
    // Initialize backlight
    setReg(0, 0);
    setReg(1, 0);
    setReg(0x08, 0xAA);   
   
}