IICLCD_LOWCOST

Revision:
0:dbd7c46a32da
Child:
1:83adfb305748
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LiquidCrystal_I2C.h	Wed Mar 18 03:36:40 2015 +0000
@@ -0,0 +1,447 @@
+
+//Header //
+
+// 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
+
+// flags for backlight control
+#define LCD_BACKLIGHT 0x08
+#define LCD_NOBACKLIGHT 0x00
+
+#define En 4 //B00000100  // Enable bit
+#define Rw 2 //B00000010  // Read/Write bit
+#define Rs 1 //B00000001  // Register select bit
+
+
+
+//public 
+
+  void LiquidCrystal_I2Cbegin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
+  void LiquidCrystal_I2Cclear();
+  void LiquidCrystal_I2Chome();
+  void LiquidCrystal_I2CnoDisplay();
+  void LiquidCrystal_I2Cdisplay();
+  void LiquidCrystal_I2CnoBlink();
+  void LiquidCrystal_I2Cblink();
+  void LiquidCrystal_I2CnoCursor();
+  void LiquidCrystal_I2Ccursor();
+  void LiquidCrystal_I2CscrollDisplayLeft();
+  void LiquidCrystal_I2CscrollDisplayRight();
+  void LiquidCrystal_I2CprintLeft();
+  void LiquidCrystal_I2CprintRight();
+  void LiquidCrystal_I2CleftToRight();
+  void LiquidCrystal_I2CrightToLeft();
+  void LiquidCrystal_I2CshiftIncrement();
+  void LiquidCrystal_I2CshiftDecrement();
+  void LiquidCrystal_I2CnoBacklight();
+  void LiquidCrystal_I2Cbacklight();
+  void LiquidCrystal_I2Cautoscroll();
+  void LiquidCrystal_I2CnoAutoscroll(); 
+  void LiquidCrystal_I2CcreateChar(uint8_t, uint8_t[]);
+  void LiquidCrystal_I2CsetCursor(uint8_t, uint8_t); 
+  void LiquidCrystal_I2Cwrite(uint8_t);
+  void LiquidCrystal_I2Ccommand(uint8_t);
+  void LiquidCrystal_I2Cinit();
+
+//private
+  void init_priv();
+  void send(uint8_t, uint8_t);
+  void write4bits(uint8_t);
+  void expanderWrite(uint8_t);
+  void pulseEnable(uint8_t);
+
+//YWROBOT
+//last updated on 21/12/2011
+//Tim Starling Fix the reset bug (Thanks Tim)
+//wiki doc http://www.dfrobot.com/wiki/index.php?title=I2C/TWI_LCD1602_Module_(SKU:_DFR0063)
+//Support Forum: http://www.dfrobot.com/forum/
+//Compatible with the Arduino IDE 1.0
+//Library version:1.1
+
+I2C Wire(PTC11, PTC10); //SDA , SCL
+
+// When the display powers up, it is configured as follows:
+//
+// 1. Display clear
+// 2. Function set: 
+//    DL = 1; 8-bit interface data 
+//    N = 0; 1-line display 
+//    F = 0; 5x8 dot character font 
+// 3. Display on/off control: 
+//    D = 0; Display off 
+//    C = 0; Cursor off 
+//    B = 0; Blinking off 
+// 4. Entry mode set: 
+//    I/D = 1; Increment by 1
+//    S = 0; No shift 
+//
+// Note, however, that resetting the Arduino doesn't reset the LCD, so we
+// can't assume that its in that state when a sketch starts (and the
+// LiquidCrystal constructor is called).
+
+
+
+
+
+
+  uint8_t _Addr;
+  uint8_t _displayfunction;
+  uint8_t _displaycontrol;
+  uint8_t _displaymode;
+  uint8_t _numlines;
+  uint8_t _cols;
+  uint8_t _rows;
+  uint8_t _backlightval;
+
+
+void delay(int msec)
+{
+   wait_ms(msec); 
+} 
+   
+void delayMicroseconds(int microsec)
+{
+  wait_us(microsec);      
+}    
+
+
+
+void LiquidCrystal_I2C_SETUP(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows)
+{
+  _Addr = lcd_Addr;
+  _cols = lcd_cols;
+  _rows = lcd_rows;
+  _backlightval = LCD_NOBACKLIGHT;
+}
+
+
+
+
+void LiquidCrystal_I2Cinit(){
+    init_priv();
+    
+}
+
+
+
+
+void init_priv()
+{
+   // Wire.begin();
+    _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
+    LiquidCrystal_I2Cbegin(_cols, _rows); 
+    
+     
+}
+
+void LiquidCrystal_I2Cbegin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
+    if (lines > 1) {
+        _displayfunction |= LCD_2LINE;
+    }
+    _numlines = lines;
+
+    // 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
+    delay(50); 
+  
+    // Now we pull both RS and R/W low to begin commands
+    expanderWrite(_backlightval);   // reset expanderand turn backlight off (Bit 8 =1)
+    delay(1000);
+
+    //put the LCD into 4 bit mode
+    // this is according to the hitachi HD44780 datasheet
+    // figure 24, pg 46
+    
+      // we start in 8bit mode, try to set 4 bit mode
+   write4bits(0x03 << 4);
+   delayMicroseconds(4500); // wait min 4.1ms
+   
+   // second try
+   write4bits(0x03 << 4);
+   delayMicroseconds(4500); // wait min 4.1ms
+   
+   // third go!
+   write4bits(0x03 << 4); 
+   delayMicroseconds(150);
+   
+   // finally, set to 4-bit interface
+   write4bits(0x02 << 4); 
+
+
+    // set # lines, font size, etc.
+    LiquidCrystal_I2Ccommand(LCD_FUNCTIONSET | _displayfunction);  
+    
+    // turn the display on with no cursor or blinking default
+    _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
+    LiquidCrystal_I2Cdisplay();
+    
+    // clear it off
+    LiquidCrystal_I2Cclear();
+    
+    // Initialize to default text direction (for roman languages)
+    _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
+    
+    // set the entry mode
+    LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
+    
+    LiquidCrystal_I2Chome();
+  
+}
+
+/********** high level commands, for the user! */
+void LiquidCrystal_I2Cclear(){
+    LiquidCrystal_I2Ccommand(LCD_CLEARDISPLAY);// clear display, set cursor position to zero
+    delayMicroseconds(2000);  // this command takes a long time!
+}
+
+void LiquidCrystal_I2Chome(){
+    LiquidCrystal_I2Ccommand(LCD_RETURNHOME);  // set cursor position to zero
+    delayMicroseconds(2000);  // this command takes a long time!
+}
+
+void LiquidCrystal_I2CsetCursor(uint8_t col, uint8_t row){
+    int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
+    if ( row > _numlines ) {
+        row = _numlines-1;    // we count rows starting w/0
+    }
+    LiquidCrystal_I2Ccommand(LCD_SETDDRAMADDR | (col + row_offsets[row]));
+}
+
+// Turn the display on/off (quickly)
+void LiquidCrystal_I2CnoDisplay() {
+    _displaycontrol &= ~LCD_DISPLAYON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2Cdisplay() {
+    _displaycontrol |= LCD_DISPLAYON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// Turns the underline cursor on/off
+void LiquidCrystal_I2CnoCursor() {
+    _displaycontrol &= ~LCD_CURSORON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2Ccursor() {
+    _displaycontrol |= LCD_CURSORON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// Turn on and off the blinking cursor
+void LiquidCrystal_I2CnoBlink() {
+    _displaycontrol &= ~LCD_BLINKON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+void LiquidCrystal_I2Cblink() {
+    _displaycontrol |= LCD_BLINKON;
+    LiquidCrystal_I2Ccommand(LCD_DISPLAYCONTROL | _displaycontrol);
+}
+
+// These commands scroll the display without changing the RAM
+void LiquidCrystal_I2CscrollDisplayLeft(void) {
+    LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
+}
+void LiquidCrystal_I2CscrollDisplayRight(void) {
+    LiquidCrystal_I2Ccommand(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
+}
+
+// This is for text that flows Left to Right
+void LiquidCrystal_I2CleftToRight(void) {
+    _displaymode |= LCD_ENTRYLEFT;
+    LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This is for text that flows Right to Left
+void LiquidCrystal_I2CrightToLeft(void) {
+    _displaymode &= ~LCD_ENTRYLEFT;
+    LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This will 'right justify' text from the cursor
+void LiquidCrystal_I2Cautoscroll(void) {
+    _displaymode |= LCD_ENTRYSHIFTINCREMENT;
+    LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
+}
+
+// This will 'left justify' text from the cursor
+void LiquidCrystal_I2CnoAutoscroll(void) {
+    _displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
+    LiquidCrystal_I2Ccommand(LCD_ENTRYMODESET | _displaymode);
+}
+
+// Allows us to fill the first 8 CGRAM locations
+// with custom characters
+void LiquidCrystal_I2CcreateChar(uint8_t location, uint8_t charmap[]) {
+    location &= 0x7; // we only have 8 locations 0-7
+    LiquidCrystal_I2Ccommand(LCD_SETCGRAMADDR | (location << 3));
+    for (int i=0; i<8; i++) {
+        //write(charmap[i]);
+        send(charmap[i], Rs);
+    }
+}
+
+// Turn the (optional) backlight off/on
+void LiquidCrystal_I2CnoBacklight(void) {
+    _backlightval=LCD_NOBACKLIGHT;
+    expanderWrite(0);
+}
+
+void LiquidCrystal_I2Cbacklight(void) {
+    _backlightval=LCD_BACKLIGHT;
+    expanderWrite(0);
+}
+
+
+
+/*********** mid level commands, for sending data/cmds */
+
+inline void LiquidCrystal_I2Ccommand(uint8_t value) {
+    send(value, 0);
+}
+
+
+/************ low level data pushing commands **********/
+
+// write either command or data
+void send(uint8_t value, uint8_t mode) {
+    uint8_t highnib=value&0xf0;
+    uint8_t lownib=(value<<4)&0xf0;
+    write4bits((highnib)|mode);
+    write4bits((lownib)|mode); 
+}
+
+void write4bits(uint8_t value) {
+    expanderWrite(value);
+    pulseEnable(value);
+}
+
+void expanderWrite(uint8_t _data)
+{     
+
+/*                                   
+    Wire.beginTransmission(_Addr);
+    printIIC((int)(_data) | _backlightval);
+    Wire.endTransmission();   
+    
+    */
+  char data[2]; 
+  data[0]= _data | _backlightval;
+ // data[1]=val;
+  char result=Wire.write(_Addr<<1,data,1);     
+    
+}
+
+void pulseEnable(uint8_t _data){
+    expanderWrite(_data | En);  // En high
+    delayMicroseconds(1);       // enable pulse must be >450ns
+    
+    expanderWrite(_data & ~En); // En low
+    delayMicroseconds(50);      // commands need > 37us to settle
+} 
+
+
+// Alias functions
+
+void LiquidCrystal_I2Ccursor_on(){
+    LiquidCrystal_I2Ccursor();
+}
+
+void LiquidCrystal_I2Ccursor_off(){
+    LiquidCrystal_I2CnoCursor();
+}
+
+void LiquidCrystal_I2Cblink_on(){
+    LiquidCrystal_I2Cblink();
+}
+
+void LiquidCrystal_I2Cblink_off(){
+    LiquidCrystal_I2CnoBlink();
+}
+
+void LiquidCrystal_I2Cload_custom_character(uint8_t char_num, uint8_t *rows){
+        LiquidCrystal_I2CcreateChar(char_num, rows);
+}
+
+void LiquidCrystal_I2CsetBacklight(uint8_t new_val){
+    if(new_val){
+        LiquidCrystal_I2Cbacklight();        // turn backlight on
+    }else{
+        LiquidCrystal_I2CnoBacklight();      // turn backlight off
+    }
+}
+/*
+void LiquidCrystal_I2Cprintstr(const char c[]){
+    //This function is not identical to the function used for "real" I2C displays
+    //it's here so the user sketch doesn't have to be changed 
+    //print(c);
+    send(c, Rs);
+    
+}
+*/
+
+void LCDI2C4Bit_printIn( char value[] ) 
+{
+  for ( char *p = value; *p != 0; p++ )
+  {
+    //LCDI2C4Bit_print(*p);
+    send(*p, Rs);
+  }
+}
+
+    
+ /*   
+ize_t LiquidCrystal_I2C::write(uint8_t value) {
+    send(value, Rs);
+    return 0;
+}
+
+#else
+#include "WProgram.h"
+
+#define printIIC(args)  Wire.send(args)
+inline void LiquidCrystal_I2C::write(uint8_t value) {
+    send(value, Rs);
+}  
+    */
+    
\ No newline at end of file