ERC1602-4 i2c Text LCD library for East Rising COG display in i2c mode using the ST7032i controller IC.

Committer:
star297
Date:
Sun May 04 11:31:31 2014 +0000
Revision:
0:5b8f0de660ec
v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:5b8f0de660ec 1 #include <stdarg.h>
star297 0:5b8f0de660ec 2 #include "mbed.h"
star297 0:5b8f0de660ec 3 #include "I2cBusDevice.h"
star297 0:5b8f0de660ec 4
star297 0:5b8f0de660ec 5 //EastRising ERC1602-4 i2c display using ST7032i
star297 0:5b8f0de660ec 6
star297 0:5b8f0de660ec 7
star297 0:5b8f0de660ec 8 // i2c address
star297 0:5b8f0de660ec 9 const char ERC1602_4_addr = 0x7C;
star297 0:5b8f0de660ec 10
star297 0:5b8f0de660ec 11 // initialization command sequence
star297 0:5b8f0de660ec 12 const char Comm_FunctionSet_Normal = 0x38;
star297 0:5b8f0de660ec 13 const char Comm_FunctionSet_Extended = 0x39;
star297 0:5b8f0de660ec 14 const char Comm_InternalOscFrequency = 0x1C;
star297 0:5b8f0de660ec 15 const char Comm_ContrastSet = 0x70;
star297 0:5b8f0de660ec 16 const char Comm_PwrIconContrast = 0x57;
star297 0:5b8f0de660ec 17 const char Comm_FollowerCtrl = 0x6C;
star297 0:5b8f0de660ec 18 const char Comm_DisplayOnOff = 0x0C;
star297 0:5b8f0de660ec 19 const char Comm_ClearDisplay = 0x01;
star297 0:5b8f0de660ec 20 const char Comm_EntryModeSet = 0x04;
star297 0:5b8f0de660ec 21 const char Comm_ReturnHome = 0x02;
star297 0:5b8f0de660ec 22
star297 0:5b8f0de660ec 23 // general commands
star297 0:5b8f0de660ec 24 const char Comm_SetDDRAMAddress = 0x80;
star297 0:5b8f0de660ec 25 const char DDRAMAddress_Ofst[] = {0x00, 0x40};
star297 0:5b8f0de660ec 26 const char Comm_SetCGRAM = 0x40;
star297 0:5b8f0de660ec 27
star297 0:5b8f0de660ec 28 // setting values
star297 0:5b8f0de660ec 29 const char default_Contrast = 0x35;
star297 0:5b8f0de660ec 30 const char COMMAND = 0x00;
star297 0:5b8f0de660ec 31 const char DATA = 0x40;
star297 0:5b8f0de660ec 32 const char MaxCharsInALine = 0x10; //buffer depth for one line (no scroll function used)
star297 0:5b8f0de660ec 33 const char init_seq0_length = 7;
star297 0:5b8f0de660ec 34 const char init_seq0[ init_seq0_length ]
star297 0:5b8f0de660ec 35 = {
star297 0:5b8f0de660ec 36 Comm_FunctionSet_Normal,
star297 0:5b8f0de660ec 37 Comm_ReturnHome, //This may be required to reset the scroll function
star297 0:5b8f0de660ec 38 Comm_FunctionSet_Extended,
star297 0:5b8f0de660ec 39 Comm_InternalOscFrequency,
star297 0:5b8f0de660ec 40 Comm_ContrastSet | ( default_Contrast & 0xF),
star297 0:5b8f0de660ec 41 Comm_PwrIconContrast | ((default_Contrast >> 4) & 0x3),
star297 0:5b8f0de660ec 42 Comm_FollowerCtrl | 0x0A,
star297 0:5b8f0de660ec 43
star297 0:5b8f0de660ec 44 };
star297 0:5b8f0de660ec 45
star297 0:5b8f0de660ec 46 const char init_seq1_length = 3;
star297 0:5b8f0de660ec 47 const char init_seq1[ init_seq1_length ]
star297 0:5b8f0de660ec 48 = {
star297 0:5b8f0de660ec 49 Comm_DisplayOnOff,
star297 0:5b8f0de660ec 50 Comm_ClearDisplay,
star297 0:5b8f0de660ec 51 Comm_EntryModeSet,
star297 0:5b8f0de660ec 52 };
star297 0:5b8f0de660ec 53
star297 0:5b8f0de660ec 54 class TextLCD_ERC1602_4 : I2cBusDevice {
star297 0:5b8f0de660ec 55 public:
star297 0:5b8f0de660ec 56
star297 0:5b8f0de660ec 57 explicit TextLCD_ERC1602_4( I2C *LCD, char dev_address = ERC1602_4_addr, char *init_massage = NULL ) : I2cBusDevice( LCD, dev_address ) {
star297 0:5b8f0de660ec 58 restart();
star297 0:5b8f0de660ec 59 }
star297 0:5b8f0de660ec 60 ~TextLCD_ERC1602_4() {
star297 0:5b8f0de660ec 61 }
star297 0:5b8f0de660ec 62
star297 0:5b8f0de660ec 63 void restart( void ) {
star297 0:5b8f0de660ec 64 char *init_massage = NULL;
star297 0:5b8f0de660ec 65 wait_ms(1); // interval after hardware reset
star297 0:5b8f0de660ec 66 for ( int i = 0; i < init_seq0_length; i++ ) {
star297 0:5b8f0de660ec 67 lcd_command( init_seq0[ i ] );
star297 0:5b8f0de660ec 68 wait_us(30);}
star297 0:5b8f0de660ec 69 for ( int i = 0; i < init_seq1_length; i++ ) {
star297 0:5b8f0de660ec 70 lcd_command( init_seq1[ i ] );}
star297 0:5b8f0de660ec 71 if ( init_massage )
star297 0:5b8f0de660ec 72 puts( 0, init_massage );
star297 0:5b8f0de660ec 73 set_CGRAM( 7, '\x1F' );
star297 0:5b8f0de660ec 74 curs[ 0 ] = 0;
star297 0:5b8f0de660ec 75 curs[ 1 ] = 0;
star297 0:5b8f0de660ec 76 }
star297 0:5b8f0de660ec 77
star297 0:5b8f0de660ec 78 void cls( void ) {
star297 0:5b8f0de660ec 79 lcd_command( Comm_ClearDisplay );
star297 0:5b8f0de660ec 80 wait_ms(2);
star297 0:5b8f0de660ec 81 curs[ 0 ] = 0;
star297 0:5b8f0de660ec 82 curs[ 1 ] = 0;
star297 0:5b8f0de660ec 83 }
star297 0:5b8f0de660ec 84 void put_custom_char( char c_code, const char *cg, char x, char y ) {
star297 0:5b8f0de660ec 85 for ( int i = 0; i < 5; i++ ) {
star297 0:5b8f0de660ec 86 set_CGRAM( c_code, cg );
star297 0:5b8f0de660ec 87 putcxy( c_code, x, y );
star297 0:5b8f0de660ec 88 }
star297 0:5b8f0de660ec 89 }
star297 0:5b8f0de660ec 90
star297 0:5b8f0de660ec 91 void contrast( char contrast ) {
star297 0:5b8f0de660ec 92 lcd_command( Comm_FunctionSet_Extended );
star297 0:5b8f0de660ec 93 lcd_command( Comm_ContrastSet | (contrast & 0x0f) );
star297 0:5b8f0de660ec 94 lcd_command( Comm_PwrIconContrast | ((contrast>>4) & 0x03) );
star297 0:5b8f0de660ec 95 lcd_command( Comm_FunctionSet_Normal );
star297 0:5b8f0de660ec 96 }
star297 0:5b8f0de660ec 97
star297 0:5b8f0de660ec 98 void set_CGRAM( char char_code, const char* cg ) {
star297 0:5b8f0de660ec 99 for ( int i = 0; i < 8; i++ ) {
star297 0:5b8f0de660ec 100 lcd_command( (Comm_SetCGRAM | (char_code << 3) | i) );
star297 0:5b8f0de660ec 101 lcd_data( *cg++ );
star297 0:5b8f0de660ec 102 }
star297 0:5b8f0de660ec 103 }
star297 0:5b8f0de660ec 104
star297 0:5b8f0de660ec 105 void set_CGRAM( char char_code, char v ) {
star297 0:5b8f0de660ec 106 char c[ 8 ];
star297 0:5b8f0de660ec 107 for ( int i = 0; i < 8; i++ )
star297 0:5b8f0de660ec 108 c[ i ] = v;
star297 0:5b8f0de660ec 109 set_CGRAM( char_code, c );
star297 0:5b8f0de660ec 110 }
star297 0:5b8f0de660ec 111
star297 0:5b8f0de660ec 112 void putcxy( char c, char x, char y ) {
star297 0:5b8f0de660ec 113 if ( (x >= MaxCharsInALine) || (y >= 2) )
star297 0:5b8f0de660ec 114 return;
star297 0:5b8f0de660ec 115
star297 0:5b8f0de660ec 116 lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[ y ]) + x );
star297 0:5b8f0de660ec 117 lcd_data( c );
star297 0:5b8f0de660ec 118 }
star297 0:5b8f0de660ec 119
star297 0:5b8f0de660ec 120 void putc( char line, char c ) {
star297 0:5b8f0de660ec 121 if ( (c == '\n') || (c == '\r') ) {
star297 0:5b8f0de660ec 122 clear_rest_of_line( line );
star297 0:5b8f0de660ec 123 curs[ line ] = 0;
star297 0:5b8f0de660ec 124 return;
star297 0:5b8f0de660ec 125 }
star297 0:5b8f0de660ec 126 putcxy( c, curs[ line ]++, line );
star297 0:5b8f0de660ec 127 }
star297 0:5b8f0de660ec 128
star297 0:5b8f0de660ec 129 void puts( char line, char *s ) {
star297 0:5b8f0de660ec 130 while ( char c = *s++ )
star297 0:5b8f0de660ec 131 putc( line, c );
star297 0:5b8f0de660ec 132 }
star297 0:5b8f0de660ec 133
star297 0:5b8f0de660ec 134 void printf( char line, char *format, ... ) {
star297 0:5b8f0de660ec 135 char s[ 32 ];
star297 0:5b8f0de660ec 136 va_list args;
star297 0:5b8f0de660ec 137 va_start( args, format );
star297 0:5b8f0de660ec 138 vsnprintf( s, 32, format, args );
star297 0:5b8f0de660ec 139 va_end( args );
star297 0:5b8f0de660ec 140 puts( line, s );
star297 0:5b8f0de660ec 141 }
star297 0:5b8f0de660ec 142
star297 0:5b8f0de660ec 143 private:
star297 0:5b8f0de660ec 144 char curs[2];
star297 0:5b8f0de660ec 145 void clear_rest_of_line( char line ) {
star297 0:5b8f0de660ec 146 for ( int i = curs[ line ]; i < MaxCharsInALine; i++ )
star297 0:5b8f0de660ec 147 putcxy( ' ', i, line );
star297 0:5b8f0de660ec 148 }
star297 0:5b8f0de660ec 149
star297 0:5b8f0de660ec 150 int lcd_write( char first, char second ) {
star297 0:5b8f0de660ec 151 char cmd[2];
star297 0:5b8f0de660ec 152 cmd[ 0 ] = first;
star297 0:5b8f0de660ec 153 cmd[ 1 ] = second;
star297 0:5b8f0de660ec 154 return ( write( cmd, 2 ) );
star297 0:5b8f0de660ec 155 }
star297 0:5b8f0de660ec 156
star297 0:5b8f0de660ec 157 int lcd_command( char command ) {
star297 0:5b8f0de660ec 158 return ( lcd_write( COMMAND, command ) );
star297 0:5b8f0de660ec 159 }
star297 0:5b8f0de660ec 160 int lcd_data( char data ) {
star297 0:5b8f0de660ec 161 return ( lcd_write( DATA, data ) );
star297 0:5b8f0de660ec 162 }
star297 0:5b8f0de660ec 163 }
star297 0:5b8f0de660ec 164 ;