ERC1602-4 i2c Text LCD library for East Rising COG display in i2c mode using the ST7032i controller IC.
Revision 0:5b8f0de660ec, committed 2014-05-04
- Comitter:
- star297
- Date:
- Sun May 04 11:31:31 2014 +0000
- Commit message:
- v1.0
Changed in this revision
I2cBusDevice.h | Show annotated file Show diff for this revision Revisions of this file |
TextLCD_ERC1602_4.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 5b8f0de660ec I2cBusDevice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/I2cBusDevice.h Sun May 04 11:31:31 2014 +0000 @@ -0,0 +1,36 @@ +#include "mbed.h" + +class I2cBusDevice { +public: + + I2cBusDevice( I2C *LCD, char dev_address ) { + bus = LCD; + device = dev_address; + } + + ~I2cBusDevice() { + } + + int write( char *data, int length ) { + return ( bus->write( device, data, length) ); + } + + int read( char *data, int length ) { + return ( bus->read( device, data, length) ); + } + + int read( char reg_ptr, char *data, int length ) { + if ( bus->write( device, ®_ptr, 1 ) ) + return ( 1 ); + if ( bus->read( device, data, length ) ) + return ( 1 ); + return ( 0 ); + } + +protected: + I2C *bus; + char device; +} +; + +
diff -r 000000000000 -r 5b8f0de660ec TextLCD_ERC1602_4.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TextLCD_ERC1602_4.h Sun May 04 11:31:31 2014 +0000 @@ -0,0 +1,164 @@ +#include <stdarg.h> +#include "mbed.h" +#include "I2cBusDevice.h" + +//EastRising ERC1602-4 i2c display using ST7032i + + +// i2c address +const char ERC1602_4_addr = 0x7C; + +// initialization command sequence +const char Comm_FunctionSet_Normal = 0x38; +const char Comm_FunctionSet_Extended = 0x39; +const char Comm_InternalOscFrequency = 0x1C; +const char Comm_ContrastSet = 0x70; +const char Comm_PwrIconContrast = 0x57; +const char Comm_FollowerCtrl = 0x6C; +const char Comm_DisplayOnOff = 0x0C; +const char Comm_ClearDisplay = 0x01; +const char Comm_EntryModeSet = 0x04; +const char Comm_ReturnHome = 0x02; + +// general commands +const char Comm_SetDDRAMAddress = 0x80; +const char DDRAMAddress_Ofst[] = {0x00, 0x40}; +const char Comm_SetCGRAM = 0x40; + +// setting values +const char default_Contrast = 0x35; +const char COMMAND = 0x00; +const char DATA = 0x40; +const char MaxCharsInALine = 0x10; //buffer depth for one line (no scroll function used) +const char init_seq0_length = 7; +const char init_seq0[ init_seq0_length ] += { + Comm_FunctionSet_Normal, + Comm_ReturnHome, //This may be required to reset the scroll function + Comm_FunctionSet_Extended, + Comm_InternalOscFrequency, + Comm_ContrastSet | ( default_Contrast & 0xF), + Comm_PwrIconContrast | ((default_Contrast >> 4) & 0x3), + Comm_FollowerCtrl | 0x0A, + +}; + +const char init_seq1_length = 3; +const char init_seq1[ init_seq1_length ] += { + Comm_DisplayOnOff, + Comm_ClearDisplay, + Comm_EntryModeSet, +}; + +class TextLCD_ERC1602_4 : I2cBusDevice { +public: + + explicit TextLCD_ERC1602_4( I2C *LCD, char dev_address = ERC1602_4_addr, char *init_massage = NULL ) : I2cBusDevice( LCD, dev_address ) { + restart(); + } + ~TextLCD_ERC1602_4() { + } + + void restart( void ) { + char *init_massage = NULL; + wait_ms(1); // interval after hardware reset + for ( int i = 0; i < init_seq0_length; i++ ) { + lcd_command( init_seq0[ i ] ); + wait_us(30);} + for ( int i = 0; i < init_seq1_length; i++ ) { + lcd_command( init_seq1[ i ] );} + if ( init_massage ) + puts( 0, init_massage ); + set_CGRAM( 7, '\x1F' ); + curs[ 0 ] = 0; + curs[ 1 ] = 0; +} + + void cls( void ) { + lcd_command( Comm_ClearDisplay ); + wait_ms(2); + curs[ 0 ] = 0; + curs[ 1 ] = 0; + } + void 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 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 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 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 putcxy( char c, char x, char y ) { + if ( (x >= MaxCharsInALine) || (y >= 2) ) + return; + + lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[ y ]) + x ); + lcd_data( c ); + } + + void putc( char line, char c ) { + if ( (c == '\n') || (c == '\r') ) { + clear_rest_of_line( line ); + curs[ line ] = 0; + return; + } + putcxy( c, curs[ line ]++, line ); + } + + void puts( char line, char *s ) { + while ( char c = *s++ ) + putc( line, c ); + } + + void printf( char line, char *format, ... ) { + char s[ 32 ]; + va_list args; + va_start( args, format ); + vsnprintf( s, 32, format, args ); + va_end( args ); + puts( line, s ); + } + +private: + char curs[2]; + void clear_rest_of_line( char line ) { + for ( int i = curs[ line ]; i < MaxCharsInALine; i++ ) + putcxy( ' ', i, line ); + } + + int lcd_write( char first, char second ) { + char cmd[2]; + cmd[ 0 ] = first; + cmd[ 1 ] = second; + return ( write( cmd, 2 ) ); + } + + int lcd_command( char command ) { + return ( lcd_write( COMMAND, command ) ); + } + int lcd_data( char data ) { + return ( lcd_write( DATA, data ) ); + } +} +; \ No newline at end of file