ERC1602-4 i2c Text LCD library for East Rising COG display in i2c mode using the ST7032i controller IC.
TextLCD_ERC1602_4.h@0:5b8f0de660ec, 2014-05-04 (annotated)
- Committer:
- star297
- Date:
- Sun May 04 11:31:31 2014 +0000
- Revision:
- 0:5b8f0de660ec
v1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | ; |