Create Library

Files at this revision

API Documentation at this revision

Comitter:
qynx
Date:
Mon Dec 07 20:58:00 2020 +0000
Child:
1:3ea320ddd830
Commit message:
Create Library

Changed in this revision

MCC0G42005A6W.cpp Show annotated file Show diff for this revision Revisions of this file
MCC0G42005A6W.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCC0G42005A6W.cpp	Mon Dec 07 20:58:00 2020 +0000
@@ -0,0 +1,226 @@
+#include "mbed.h"
+#include <stdarg.h>
+#include "MCC0G42005A6W.h"
+
+// Note on I2C pull up resistors  These should not be too low otherwise the display will
+// not pull the SDA line low enough to register an ACK.  Suggest 10K.
+// based on  Text LCD module "SB1602E" class library  @author  Tedd OKANO, Masato YAMANISHI & Toyomasa Watarai
+
+
+LCD_COG::LCD_COG( PinName I2C_sda, PinName I2C_scl, const char *init_message ) : i2c_p( new I2C( I2C_sda, I2C_scl ) ), i2c( *i2c_p ), charsInLine( MaxCharsInALine )
+{
+    init( init_message );
+
+}
+
+LCD_COG::LCD_COG( I2C &i2c_, const char *init_message ) : i2c_p( NULL ), i2c( i2c_ ), charsInLine( MaxCharsInALine )
+{
+    init( init_message );
+}
+
+LCD_COG::~LCD_COG()
+{
+    if ( NULL != i2c_p )
+        delete  i2c_p;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::init( const char *init_message )
+{
+
+    const char init_seq0[]  = {
+
+        0x3A,    // 8-Bit data length extension Bit RE=1; REV=0                                send_command(0x3a); // 8bit, 4line, IS=0, RE=1
+        // 0x09,    // 4 line display //??????
+        TOPVIEW, // Bottom view       view bottom view(0x06), top view (0x05)  BOTTOMVIEW
+        0x1E,    // Bias setting BS1=1                                                         send_command(0x1e); // set BS1 (1/6 bias)
+        0x39,    // 8-Bit data length extension Bit RE=0; IS=1                                 send_command(0x39); // 8bit, 4line, IS=1 , RE=0
+        0x1c,    // BS0=1 -> Bias=1/6                                                          send_command(0x1c); // set BS0 (1/6 bias) + osc
+        0x6d,    // 0110 Set DON and amp ratio                                                 send_command(0x6d); // Set DON and amp ratio
+        0x5d,    // 0101 Set ION, BON, contrast bits 4&5                                       send_command(0x5d); // Set ION, BON, contrast bits 4&5
+        0x79,    // Set contrast (DB3-DB0=C3-C0)                                               send_command(0x79); // Set contrast lower 4bits
+        0x38,    // 8-Bit data length extension Bit RE=0; IS=0
+        Comm_DisplayOnOff,
+        Comm_ClearDisplay,
+        Comm_EntryModeSet,
+    };
+
+    //  i2c_addr    = SLAVEADRESS;
+
+    wait( 0.04 );    // 40ms    interval after hardware reset
+
+    for ( unsigned int i = 0; i < sizeof( init_seq0 ); i++ ) {
+        lcd_command( init_seq0[ i ] );
+        wait(30e-6);// wait(30e-6);
+    }
+
+    set_CGRAM( 7, '\x1F' );
+
+    curs[0] = 0;
+    curs[1] = 0;
+    curs[2] = 0;
+    curs[3] = 0;
+
+    if ( init_message ) {
+        //i2c.frequency(100000);
+        puts( 0, init_message );
+        curs[0] = 0;
+//        puts( 1, "Dit is de 2e regel 2" ); curs[1] = 0;
+//        puts( 2, "Dit is de 3e regel 3" ); curs[2] = 0;
+//        puts( 3, "Dit is de 4e regel 4" ); curs[3] = 0;
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::printf( const char line, const char *format, ... )
+{
+    char    s[ 32 ];
+    va_list args;
+
+    va_start( args, format );
+    vsnprintf( s, 32, format, args );
+    va_end( args );
+
+    puts( line, s );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void LCD_COG::printf( char x, unsigned char y, const char *format, ... )
+{
+    char    s[ 32 ];
+    va_list args;
+
+    va_start( args, format );
+    vsnprintf( s, 32, format, args );
+    va_end( args );
+
+    curs[ y ] = x;
+    puts( y, s );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::putc( unsigned char line, char c )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    if ( (c == '\n') || (c == '\r') ) {
+        clear_rest_of_line( line );
+        curs[ line ]    = 0;
+        return;
+    }
+
+    putcxy( c, curs[line]++, line );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::puts( char line, const char *s )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    while ( char c    = *s++ )
+        putc( line, c );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::putcxy( char c, unsigned char x, unsigned char y )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    const char    Comm_SetDDRAMAddress        =   LCD_HOME_L1;
+    const char    DDRAMAddress_Ofst[]         = { LINE1, LINE2, LINE3, LINE4 };
+
+    if ( (x >= charsInLine) || (y >= LINES) )
+        return;
+
+    lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[y]) + x );
+    lcd_data( c );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::clear( void )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    lcd_command( Comm_ClearDisplay );
+    wait( 2e-3 );
+    curs[ 0 ]    = 0;
+    curs[ 1 ]    = 0;
+    curs[ 2 ]    = 0;
+    curs[ 3 ]    = 0;
+}
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::contrast( char contrast )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    lcd_command( Comm_FunctionSet_Extended );
+    lcd_command( Comm_ContrastSet         |  (contrast     & 0x0f) );
+    lcd_command( Comm_PwrIconContrast     | ((contrast>>4) & 0x03) );
+    lcd_command( Comm_FunctionSet_Normal   );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::put_custom_char( char c_code, const char *cg, char x, char y )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    for ( int i = 0; i < 5; i++ ) {
+        set_CGRAM( c_code, cg );
+        putcxy( c_code, x, y );
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::set_CGRAM( char char_code, const char* cg )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    for ( int i = 0; i < 8; i++ ) {
+        lcd_command( (Comm_SetCGRAM | (char_code << 3) | i) );
+        lcd_data( *cg++ );
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::set_CGRAM( char char_code, char v )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    char    c[ 8 ];
+
+    for ( int i = 0; i < 8; i++ )
+        c[ i ]    = v;
+
+    set_CGRAM( char_code, c );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+void LCD_COG::clear_rest_of_line( unsigned char line )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    for ( int i = curs[ line ]; i < charsInLine; i++ )
+        putcxy( ' ', i, line );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+int LCD_COG::lcd_write( char first, char second )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    char cmd[2];
+
+    cmd[ 0 ]    = first;
+    cmd[ 1 ]    = second;
+
+    return ( i2c.write( SLAVEADRESS, cmd, 2 ) );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+int LCD_COG::lcd_command( char command )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    return ( lcd_write( COMMAND, command ) );
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+int LCD_COG::lcd_data( char data )
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    return ( lcd_write( DATA, data ) );
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCC0G42005A6W.h	Mon Dec 07 20:58:00 2020 +0000
@@ -0,0 +1,371 @@
+#ifndef        _MCC0G42005A6W_H
+#define        _MCC0G42005A6W_H
+
+#include    <stdarg.h>
+#include    "mbed.h"
+#include    "MCC0G42005A6W.h"
+
+/**
+* LCD example
+*
+* @code
+* #include    <stdarg.h>
+* #include    "mbed.h"
+* #include    "MCC0G42005A6W.h"
+*
+* // MCCOG42005A6W-BNMLWI
+* // Alphanumeric LCD, 20 x 4, White on Blue, 3V to 5V, I2C, English, Japanese, Transmissive
+* // Farnell nr. 2218946
+* // example PCB  LCD I2C 4x20 https://circuitmaker.com/User/Details/Rob-Keij-4
+*
+*  LCD_COG lcd(SDA, SCL, "==LCD=Driver=V1.00==");  //  SDA, SCL
+*
+* int main()
+* {
+*  lcd.printf( 0, 0, "Hello world!" );
+*  lcd.printf( 4, 1, "pi = %.6f", 3.14159265 );
+*  lcd.printf( 2, 2, "This is Row %d",2 );
+*  lcd.printf( 3, 3, "This is Row %d",3 );
+*
+*    while(1) {
+*
+*    }
+* }
+* @endcode
+*/
+
+
+class LCD_COG
+{
+public:
+
+    /** Create a LCD instance which is connected to specified I2C pins with specified address
+     *
+     * @param I2C_sda I2C-bus SDA pin
+     * @param I2C_scl I2C-bus SCL pin
+     * @param init_message string to initialize the LCD
+     */
+    LCD_COG( PinName I2C_sda, PinName I2C_scl, const char *init_message = NULL );
+
+    /** Create a LCD instance connected to specified I2C pins with specified address
+     *
+     * @param I2C object (instance)
+     * @param init_message string to initialize the LCD
+     */
+    LCD_COG( I2C &i2c_, const char* init_message = NULL );
+
+    /** Destructor
+     */
+    ~LCD_COG();
+
+    /** Printf
+     *
+     *  printf function with line number.
+     *  it can be used like
+     *
+     *  lcd.printf( 0, "Hello world!" );
+     *  lcd.printf( 1, "pi = %.6f", 3.14159265 );
+     *  lcd.printf( 2, "This is Row %d",2 );
+     *  lcd.printf( 3, "This is Row %d",3 );
+     *
+     * @param line line# (0 for upper, 1 for lower)
+     * @param format following parameters are compatible to stdout's printf
+     */
+    void printf( char line, const char *format, ... );
+
+    /** Printf
+     *
+     *  printf function with X and Y character position on the LCD.
+     *  it can be used like
+     *
+     *  lcd.printf( 0, 0, "Hello world!" );
+     *  lcd.printf( 4, 1, "pi = %.6f", 3.14159265 );
+     *  lcd.printf( 2, 2, "This is Row %d",2 );
+     *  lcd.printf( 3, 3, "This is Row %d",3 );
+     *
+     * @param x X horizontal character position on the LCD
+     * @param y Y vertical character position on the LCD
+     * @param format following parameters are compatible to stdout's printf
+     */
+    void printf( char x, unsigned char y, const char *format, ... );
+
+    /** Put character : "putc()"
+     *
+     * @param line line# (0 for upper, 1 for lower)
+     * @param c character code
+     */
+    void putc( unsigned char line, char c );
+
+    /** Put string : "puts()"
+     *
+     * @param line line# (0 for upper, 1 for lower)
+     * @param s pointer to a string data
+     */
+    void puts( char line, const char *s );
+
+    /** Put character into specified screen position
+     *
+     * @param c character code
+     * @param x horizontal character position on the LCD
+     * @param y vertical character position on the LCD
+     */
+    void putcxy( char c, unsigned char x, unsigned char y );
+
+    /** Clear the LCD
+     */
+    void clear( void );
+
+    /** Contrast adjustment
+     *
+     * @param contrast value (from 0x00 to 0x3E)
+     */
+    void contrast( char contrast );
+
+    /** Put a custom character given as bitmap data
+     *
+     * @param c_code character code
+     * @param cg pointer to bitmap data (array of 8 bytes)
+     * @param x horizontal character position on the LCD
+     * @param y vertical character position on the LCD
+     */
+    void put_custom_char( char c_code, const char *cg, char x, char y );
+
+    /** Set CGRAM (set custom bitmap as a character)
+     *
+     * @param c_code character code
+     * @param cg pointer to bitmap data (array of 8 bytes)
+     */
+    void set_CGRAM( char char_code, const char* cg );
+
+    /** Set CGRAM (set custom bitmap as a character)
+     *
+     * @param c_code character code
+     * @param v bitmap data (5 bit pattern in this variable are copied to all row of a character bitmap)
+     */
+    void set_CGRAM( char char_code, char v );
+
+
+    /** Set number of characters in a line
+     *
+     * @param ch number of charactors in a line
+     */
+    void setCharsInLine( char ch )
+    {
+        charsInLine = ch;
+    };
+
+private:
+
+    typedef enum {
+
+        SLAVEADRESS                  = 0x78,
+        LINES                        = 4,
+        LCD_HOME_L1                  = 0x80,
+        LINE1                        = 0x00,
+        LINE2                        = LINE1+0x20,
+        LINE3                        = LINE1+0x40,
+        LINE4                        = LINE1+0x60,
+
+        DISPLAY_ON                   = 0x04,
+        DISPLAY_OFF                  = 0x03,
+        CURSOR_ON                    = 0x02,
+        CURSOR_OFF                   = 0x05,
+        BLINK_ON                     = 0x01,
+        BLINK_OFF                    = 0x06,
+
+        TOPVIEW                      = 0x05,
+        BOTTOMVIEW                   = 0x06,
+
+        ROMA                         = 0x00,
+        ROMB                         = 0x04,
+        ROMC                         = 0x0C,
+
+        Comm_FunctionSet_Normal      = 0x38,
+        Comm_FunctionSet_Extended    = 0x39,
+        Comm_InternalOscFrequency    = 0x14,
+        Comm_DisplayOnOff            = 0x0C,
+        Comm_ClearDisplay            = 0x01,
+        Comm_ReturnHome              = 0x02,
+        Comm_ContrastSet             = 0x70,
+        Comm_PwrIconContrast         = 0x5C,
+        Comm_FollowerCtrl            = 0x60,
+        Comm_EntryModeSet            = 0x04,
+        Comm_SetCGRAM                = 0x40
+
+
+//Instruction     IS RE RS R/W   DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Description
+//Clear display           XX00   0   0   0   0   0   0   0   1   Write "20H" to DDRAM. and set DDRAM address to "00H" from AC.
+//Comm_ClearDisplay = 0x01,
+//
+//Return home             X000   0   0   0   0   0   0   1   X   Set DDRAM address to "00H" from AC and return cursor to its original position if shifted. The contents of DDRAM are not changed.
+//Comm_ReturnHome   = 0x02,
+//
+//Power down mode         X100   0   0   0   0   0   0   1   PD  Set power down mode bit.  PD = "1": power down mode set,  PD = "0": power down mode disable (POR)
+//
+//Entry mode set          X000   0   0   0   0   0   1   I/D S   Assign cursor/ blink moving direction with DDRAM address I/D = "1": cursor/ blink moves to right
+//                                                               and DDRAM address is increased by 1 (POR)
+//                                                               I/D = "0": cursor/ blink moves to left and DDRAM address is decreased by 1
+//                                                               Assign display shift with DDRAM address S = "1": make display shift of the enabled lines by the DS4 to DS1 bits in the shift enable instruction.
+//                                                               Left/right direction depends on I/D bit selection. S = "0": display shift disable (POR)
+//
+//                        X100   0   0   0   0   0   1   BDC BDS Segment bi-direction function.
+//                                                               BDS = "0": Seg100 -> Seg1,
+//                                                               BDS = "1": Seg1 -> Seg100.
+//                                                               Segment bi-direction function.
+//                                                               BDC = "0": Com32 -> Com1
+//                                                               BDC = "1": Com1 -> Com32
+//
+//Display On/Off control  X000   0   0   0   0   1   D   C   B   Set display/cursor/blink on/off
+//Comm_DisplayOnOff = 0x0C, // 0000 1100
+//                                                               D = "1": display on,
+//                                                               D = "0": display off (POR),
+//                                                               C = "1": cursor on,
+//                                                               C = "0": cursor off (POR),
+//                                                               B = "1": blink on,
+//                                                               B = "0": blink off (POR).
+//
+//Extended function set   X100   0   0   0   0   1   FW  B/W NW  Assign font width, black/white inverting of cursor, and 4-line display mode control bit.
+//                                                               FW = "1": 6-dot font width,
+//                                                               FW = "0": 5-dot font width (POR),
+//                                                               B/W = "1": black/white inverting of cursor enable,
+//                                                               B/W = "0": black/white inverting of cursor disable (POR)
+//                                                               NW = "1": 3-line or 4-line display mode,
+//                                                               NW = "0": 1-line or 2-line display mode
+//
+//Cursor or display shift 0000   0   0   0   1   S/C  R/L x  x   Set cursor moving and display shift control bit, and the direction, without changing DDRAM data.
+//                                                               S/C = "1": display shift,
+//                                                               S/C = "0": cursor shift,
+//                                                               R/L = "1": shift to right,
+//                                                               R/L = "0": shift to left.
+//
+//Double height(4-line)/  0100   0   0   0   1   UD2 UD1 BS1 DH’ UD2~1: Assign different doubt height format (POR=11)
+//Bias/Display-dotshift                                          BS1:BS0 = “00”: 1/5 bias (POR)
+//                                                               BS1:BS0 = “01”: 1/4 bias
+//                                                               BS1:BS0 = “10”: 1/7 bias
+//                                                               BS1:BS0 = “11”: 1/6 bias
+//                                                               DH’ = "1": display shift enable
+//                                                               DH’ = "0": dot scroll enable (POR)
+
+
+//Internal OSC frequency  1000   0   0   0    1  BS0 F2  F1  F0  F2~0: adjust internal OSC frequency for FE frequency (POR: 011)
+//Comm_InternalOscFrequency   = 0x14,
+//
+//Shiftenable             1100   0   0   0    1  DS4 DS3 DS2 DS1 (when DH’ = "1") POR DS4~1=1111 Determine the line for display shift.
+//                                                               DS1 = "1/0": 1st line display shift enable/disable
+//                                                               DS2 = "1/0": 2nd line display shift enable/disable
+//                                                               DS3 = "1/0": 3rd line display shift enable/disable
+//                                                               DS4 = "1/0": 4th line display shift enable/disable.
+//Scroll enable           1100   0   0   0    1  HS4 HS3 HS2 HS1 (when DH’ = "0") POR HS4~1=1111 Determine the line for horizontal smooth scroll.
+//                                                               HS1 = "1/0": 1st line dot scroll enable/disable
+//                                                               HS2 = "1/0": 2nd line dot scroll enable/disable
+//                                                               HS3 = "1/0": 3rd line dot scroll enable/disable
+//                                                               HS4 = "1/0": 4th line dot scroll enable/disable.
+//
+//Function set            X000   0   0   1    DL  N  DH  RE(0) IS Set interface data length  DL = "1": 8-bit (POR),
+//                                                                                           DL = "0": 4-bit
+//                                                                Numbers of display line     N = "1": 2-line (NW=0)/ 4-line(NW=1),
+//                                                                                            N = "0": 1-line (NW=0)/ 3-line(NW=1)
+//                                                                Extension register, RE("0") at this instruction, RE must be "0".
+//                                                                Shift/scroll enable DH = “ 1/0”: Double height font control for 2-line mode enable/ disable (POR=0)
+//                                                                IS Special registers enable bit at this moment, must be "0".
+
+
+//Comm_FunctionSet_Normal    = 0x3a, // 0011 1010
+//Comm_FunctionSet_Normal    = 0x38, // 0011 1000
+
+
+//
+//
+//                        X100   0   0   1    DL  N BE RE(1) REV Set DL, N, RE("1") CGRAM/SEGRAM blink enable BE = " 1/0": CGRAM/SEGRAM blink enable/disable (POR=0)
+//                                                               Reverse bit REV = "1": reverse display, REV = "0": normal display (POR).
+//
+//set CGRAM address       0000   0   1   AC5  AC4 AC3 AC2 AC1 AC0 Set CGRAM address in address counter. (POR=00 0000)
+
+//set SEGRAM address      1000   0   1   0    0   AC3 AC2 AC1 AC0 Set SEGRAM address in address counter. (POR=0000)
+//
+//Power/
+//Icon control/
+//Contrast set            1000   0   1   0    1   Ion Bon C5 C4   Ion = “1/0”: ICON (SEGRAM) display on/off (POR=0)
+//                                                                Bon = “1/0”: set booster and regulator circuit on/off (POR=0)
+//                                                                C5, C4: Contrast set for internal follower mode (POR=10)
+//
+//Follower Control        1000   0   1   1    0  Don Rab2 Rab1 Rab0 Don: Set divider circuit on/ off (POR=0)
+//                                                                Rab2~0: Select Amplifier internal resistor ratio (POR=010)
+//
+//Contrast Set            1000   0   1   1    1  C3  C2   C1   C0 C3~0: Contrast set for internal follower mode (POR=0000)
+//
+//set DDRAM address       X000   1  AC6 AC5  AC4 AC3 AC2 AC1  AC0 Set DDRAM address in address counter. (POR=000 0000)
+//
+//set scroll quantity     X100   1  X   SQ5  SQ4 SQ3 SQ2 SQ1  SQ0 Set the quantity of horizontal dot scroll. (POR=00 0000)
+//
+//Read busy flag and                                               Can be known whether during internal operation or not by reading BF.
+//address/part ID         XX01  BF  AC6  AC5  AC4  AC3 AC2 AC1 AC0 The contents of address counter or the part ID can also be read.
+//                                   /    /    /    /   /   /   /  When it is read the first time, the address counter can be read.
+//                                  ID6  ID5  ID4  ID3 ID2 ID1 ID0 When it is read the second time, the part ID can be read.
+//
+//                                                                  BF = "1": busy state
+//                                                                  BF = "0": ready state
+//
+//write data              XX10  D7  D6   D5 D4 D3 D2 D1 D0          Write data into internal RAM (DDRAM / CGRAM / SEGRAM).
+//read data               XX11  D7  D6   D5 D4 D3 D2 D1 D0          Read data from internal RAM (DDRAM / CGRAM / SEGRAM).
+//
+//
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//                                               Extended Instruction Set
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+//Temperature             X100  0   1    1   1  0  1  1  0          Set Temperature Coefficient TC2~0:
+//Coefficient                                                       000: Reserved
+//Control                                                           001: Reserved
+//                                                                  010: -0.05%/゚C (POR)
+//Temperature             XX10  0   0    0   0  0 TC2 TC1 TC0       011: Reserved
+//Coefficient                                                       100: -0.10%/゚C
+//Control                                                           101: Reserved
+//Settings                                                          110: -0.15%/゚C
+//                                                                  111: -0.20%/゚C
+//
+//ROM Selection           X100  0   1    1   1    0   0   1 0       Writing data into ROM selection
+//ROM Selection Settings  XX10  0   0    0   0  ROM2 ROM1 0 0       register enables the selection of
+//                                                                  ROM A, B or C.
+//                                                                  ROM2~1:
+//                                                                  00: ROMA
+//                                                                  01: ROMB
+//                                                                  10: ROMC
+//                                                                  11: Invalid
+
+    } _commands;
+
+    typedef enum {
+        MaxCharsInALine            = 0x14, //    buffer depth for one line (no scroll function used)
+        COMMAND                    = 0x00,
+        DATA                       = 0x40
+    } _constants;
+
+
+    char    curs[LINES];                          // Character position on line
+    void    init( const char* init_message );
+    void    clear_rest_of_line( unsigned char line );
+    int     lcd_write( char first, char second );
+    int     lcd_command( char command );
+    int     lcd_data( char data );
+    I2C     *i2c_p;
+    I2C     &i2c;
+    char    i2c_addr;
+    char    charsInLine;
+
+};
+
+
+#endif
+
+
+
+
+
+
+
+
+
+