Skip to content

Instantly share code, notes, and snippets.

@technobly
Last active August 29, 2015 13:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save technobly/8721005 to your computer and use it in GitHub Desktop.
Save technobly/8721005 to your computer and use it in GitHub Desktop.
GROVE LCD RGB Library For Spark Core
//-----------------------------------------------
// GROVE LCD RGB Library For Spark Core
//===============================================
// http://www.seeedstudio.com/wiki/Grove_-_LCD_RGB_Backlight
// https://github.com/Seeed-Studio/Grove_LCD_RGB_Backlight
//-----------------------------------------------
// Technobly / BDub - Jan 30th, 2014
//===============================================
#include "application.h"
/* ===================================== rgb_lcd.h ========================================== */
/*
rgb_lcd.h
2013 Copyright (c) Seeed Technology Inc. All right reserved.
Author:Loovee
2013-9-18
add rgb backlight fucnction @ 2013-10-15
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//#ifndef __RGB_LCD_H__
//#define __RGB_LCD_H__
//#include <inttypes.h>
//#include "Print.h"
// Device I2C Arress
#define LCD_ADDRESS (0x7c>>1)
#define RGB_ADDRESS (0xc4>>1)
// color define
#define WHITE 0
#define RED 1
#define GREEN 2
#define BLUE 3
#define REG_RED 0x04 // pwm2
#define REG_GREEN 0x03 // pwm1
#define REG_BLUE 0x02 // pwm0
#define REG_MODE1 0x00
#define REG_MODE2 0x01
#define REG_OUTPUT 0x08
// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80
// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00
// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
class rgb_lcd : public Print
{
public:
rgb_lcd();
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
void clear();
void home();
void noDisplay();
void display();
void noBlink();
void blink();
void noCursor();
void cursor();
void scrollDisplayLeft();
void scrollDisplayRight();
void leftToRight();
void rightToLeft();
void autoscroll();
void noAutoscroll();
void createChar(uint8_t, uint8_t[]);
void setCursor(uint8_t, uint8_t);
virtual size_t write(uint8_t);
void command(uint8_t);
// color control
void setRGB(unsigned char r, unsigned char g, unsigned char b); // set rgb
void setPWM(unsigned char color, unsigned char pwm){setReg(color, pwm);} // set pwm
void setColor(unsigned char color);
void setColorAll(){setRGB(0, 0, 0);}
void setColorWhite(){setRGB(255, 255, 255);}
using Print::write;
private:
void send(uint8_t, uint8_t);
void setReg(unsigned char addr, unsigned char dta);
uint8_t _displayfunction;
uint8_t _displaycontrol;
uint8_t _displaymode;
uint8_t _initialized;
uint8_t _numlines,_currline;
};
/* ===================================== rgb_lcd.cpp ========================================== */
/*
rgb_lcd.cpp
2013 Copyright (c) Seeed Technology Inc. All right reserved.
Author:Loovee
2013-9-18
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//#include <Arduino.h>
//#include <stdio.h>
//#include <string.h>
//#include <inttypes.h>
//#include <Wire.h>
//#include "rgb_lcd.h"
void i2c_send_byte(unsigned char dta)
{
Wire.beginTransmission(LCD_ADDRESS); // transmit to device #4
Wire.write(dta); // sends five bytes
Wire.endTransmission(); // stop transmitting
}
void i2c_send_byteS(unsigned char *dta, unsigned char len)
{
Wire.beginTransmission(LCD_ADDRESS); // transmit to device #4
for(int i=0; i<len; i++)
{
Wire.write(dta[i]);
}
Wire.endTransmission(); // stop transmitting
}
rgb_lcd::rgb_lcd()
{
}
void rgb_lcd::begin(uint8_t cols, uint8_t lines, uint8_t dotsize)
{
Wire.begin();
if (lines > 1) {
_displayfunction |= LCD_2LINE;
}
_numlines = lines;
_currline = 0;
// for some 1 line displays you can select a 10 pixel high font
if ((dotsize != 0) && (lines == 1)) {
_displayfunction |= LCD_5x10DOTS;
}
// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
// according to datasheet, we need at least 40ms after power rises above 2.7V
// before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
delayMicroseconds(50000);
// this is according to the hitachi HD44780 datasheet
// page 45 figure 23
// Send function set command sequence
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(4500); // wait more than 4.1ms
// second try
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(150);
// third go
command(LCD_FUNCTIONSET | _displayfunction);
// finally, set # lines, font size, etc.
command(LCD_FUNCTIONSET | _displayfunction);
// turn the display on with no cursor or blinking default
_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
display();
// clear it off
clear();
// Initialize to default text direction (for romance languages)
_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
// set the entry mode
command(LCD_ENTRYMODESET | _displaymode);
// backlight init
setReg(0, 0);
setReg(1, 0);
setReg(0x08, 0xAA); // all led control by pwm
setColorWhite();
}
/********** high level commands, for the user! */
void rgb_lcd::clear()
{
command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
delayMicroseconds(2000); // this command takes a long time!
}
void rgb_lcd::home()
{
command(LCD_RETURNHOME); // set cursor position to zero
delayMicroseconds(2000); // this command takes a long time!
}
void rgb_lcd::setCursor(uint8_t col, uint8_t row)
{
col = (row == 0 ? col|0x80 : col|0xc0);
unsigned char dta[2] = {0x80, col};
i2c_send_byteS(dta, 2);
}
// Turn the display on/off (quickly)
void rgb_lcd::noDisplay()
{
_displaycontrol &= ~LCD_DISPLAYON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void rgb_lcd::display() {
_displaycontrol |= LCD_DISPLAYON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// Turns the underline cursor on/off
void rgb_lcd::noCursor()
{
_displaycontrol &= ~LCD_CURSORON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void rgb_lcd::cursor() {
_displaycontrol |= LCD_CURSORON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// Turn on and off the blinking cursor
void rgb_lcd::noBlink()
{
_displaycontrol &= ~LCD_BLINKON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void rgb_lcd::blink()
{
_displaycontrol |= LCD_BLINKON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// These commands scroll the display without changing the RAM
void rgb_lcd::scrollDisplayLeft(void)
{
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
}
void rgb_lcd::scrollDisplayRight(void)
{
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
}
// This is for text that flows Left to Right
void rgb_lcd::leftToRight(void)
{
_displaymode |= LCD_ENTRYLEFT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This is for text that flows Right to Left
void rgb_lcd::rightToLeft(void)
{
_displaymode &= ~LCD_ENTRYLEFT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This will 'right justify' text from the cursor
void rgb_lcd::autoscroll(void)
{
_displaymode |= LCD_ENTRYSHIFTINCREMENT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This will 'left justify' text from the cursor
void rgb_lcd::noAutoscroll(void)
{
_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
command(LCD_ENTRYMODESET | _displaymode);
}
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void rgb_lcd::createChar(uint8_t location, uint8_t charmap[])
{
location &= 0x7; // we only have 8 locations 0-7
command(LCD_SETCGRAMADDR | (location << 3));
unsigned char dta[9];
dta[0] = 0x40;
for(int i=0; i<8; i++)
{
dta[i+1] = charmap[i];
}
i2c_send_byteS(dta, 9);
}
/*********** mid level commands, for sending data/cmds */
// send command
inline void rgb_lcd::command(uint8_t value)
{
unsigned char dta[2] = {0x80, value};
i2c_send_byteS(dta, 2);
}
// send data
inline size_t rgb_lcd::write(uint8_t value)
{
unsigned char dta[2] = {0x40, value};
i2c_send_byteS(dta, 2);
return 1; // assume sucess
}
void rgb_lcd::setReg(unsigned char addr, unsigned char dta)
{
Wire.beginTransmission(RGB_ADDRESS); // transmit to device #4
Wire.write(addr);
Wire.write(dta);
Wire.endTransmission(); // stop transmitting
}
void rgb_lcd::setRGB(unsigned char r, unsigned char g, unsigned char b)
{
setReg(REG_RED, r);
setReg(REG_GREEN, g);
setReg(REG_BLUE, b);
}
const unsigned char color_define[4][3] =
{
{255, 255, 255}, // white
{255, 0, 0}, // red
{0, 255, 0}, // green
{0, 0, 255}, // blue
};
void rgb_lcd::setColor(unsigned char color)
{
if(color > 3)return ;
setRGB(color_define[color][0], color_define[color][1], color_define[color][2]);
}
/* ===================================== application.cpp ====================================== */
/*
Hello World.ino
2013 Copyright (c) Seeed Technology Inc. All right reserved.
Author:Loovee
2013-9-18
Grove - Serial LCD RGB Backlight demo.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//#include <Wire.h>
//#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 0;
const int colorG = 255; // R + B == Cyan
const int colorB = 255;
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
// Print a message to the LCD.
lcd.print("Hello, Sparky!");
delay(1000);
}
void loop()
{
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
delay(100);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment