Create Library

MCC0G42005A6W.h

Committer:
qynx
Date:
2021-04-13
Revision:
1:3ea320ddd830
Parent:
0:bf6598759869

File content as of revision 1:3ea320ddd830:

#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