Dependencies:   mbed

Committer:
okano
Date:
Sat Jan 23 13:45:32 2010 +0000
Revision:
0:188e389bc1b7

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:188e389bc1b7 1 /*
okano 0:188e389bc1b7 2 * LCD module "SB1602E" library
okano 0:188e389bc1b7 3 *
okano 0:188e389bc1b7 4 * SB1602E is an I2C based low voltage text LCD panel (based Sitronix ST7032 chip)
okano 0:188e389bc1b7 5 * The module by StrawberryLinux
okano 0:188e389bc1b7 6 * http://strawberry-linux.com/catalog/items?code=27002 (Online shop page (Japanese))
okano 0:188e389bc1b7 7 * http://strawberry-linux.com/pub/ST7032i.pdf (datasheet of the chip)
okano 0:188e389bc1b7 8 *
okano 0:188e389bc1b7 9 * This is a library to operate this module easy.
okano 0:188e389bc1b7 10 *
okano 0:188e389bc1b7 11 * Copyright (c) 2010 Tedd OKANO
okano 0:188e389bc1b7 12 * Released under the MIT License: http://mbed.org/license/mit
okano 0:188e389bc1b7 13 *
okano 0:188e389bc1b7 14 * revision 1.0 22-Jan-2010 a. 1st release
okano 0:188e389bc1b7 15 * revision 1.1 23-Jan-2010 a. class name has been changed from lcd_SB1602E to TextLCD_SB1602E
okano 0:188e389bc1b7 16 * b. printf() added
okano 0:188e389bc1b7 17 * c. copyright notice added
okano 0:188e389bc1b7 18 */
okano 0:188e389bc1b7 19
okano 0:188e389bc1b7 20 #ifndef MBED_TextLCD_SB1602E
okano 0:188e389bc1b7 21 #define MBED_TextLCD_SB1602E
okano 0:188e389bc1b7 22
okano 0:188e389bc1b7 23 #include <stdarg.h>
okano 0:188e389bc1b7 24 #include "mbed.h"
okano 0:188e389bc1b7 25 #include "I2cBusDevice.h"
okano 0:188e389bc1b7 26
okano 0:188e389bc1b7 27 // SB1602E IIC address
okano 0:188e389bc1b7 28
okano 0:188e389bc1b7 29 const char SB1602E_addr = 0x7C;
okano 0:188e389bc1b7 30
okano 0:188e389bc1b7 31 // SB1602E initialization command sequence
okano 0:188e389bc1b7 32
okano 0:188e389bc1b7 33 #ifdef INIT_VALUE_DATASHEET_ORIGINAL
okano 0:188e389bc1b7 34
okano 0:188e389bc1b7 35 const char Comm_FunctionSet_Normal = 0x38;
okano 0:188e389bc1b7 36 const char Comm_FunctionSet_Extended = 0x39;
okano 0:188e389bc1b7 37 const char Comm_InternalOscFrequency = 0x14;
okano 0:188e389bc1b7 38 const char Comm_ContrastSet = 0x78;
okano 0:188e389bc1b7 39 const char Comm_PwrIconContrast = 0x5E;
okano 0:188e389bc1b7 40 const char Comm_FollowerCtrl = 0x6A;
okano 0:188e389bc1b7 41 const char Comm_DisplayOnOff = 0x0C;
okano 0:188e389bc1b7 42 const char Comm_ClearDisplay = 0x01;
okano 0:188e389bc1b7 43 const char Comm_EntryModeSet = 0x06;
okano 0:188e389bc1b7 44
okano 0:188e389bc1b7 45 #else
okano 0:188e389bc1b7 46
okano 0:188e389bc1b7 47 const char Comm_FunctionSet_Normal = 0x38;
okano 0:188e389bc1b7 48 const char Comm_FunctionSet_Extended = 0x39;
okano 0:188e389bc1b7 49 const char Comm_InternalOscFrequency = 0x14;
okano 0:188e389bc1b7 50 const char Comm_ContrastSet = 0x70;
okano 0:188e389bc1b7 51 const char Comm_PwrIconContrast = 0x5C;
okano 0:188e389bc1b7 52 const char Comm_FollowerCtrl = 0x60;
okano 0:188e389bc1b7 53 const char Comm_DisplayOnOff = 0x0C;
okano 0:188e389bc1b7 54 const char Comm_ClearDisplay = 0x01;
okano 0:188e389bc1b7 55 const char Comm_EntryModeSet = 0x04;
okano 0:188e389bc1b7 56 const char Comm_ReturnHome = 0x02;
okano 0:188e389bc1b7 57
okano 0:188e389bc1b7 58 #endif
okano 0:188e389bc1b7 59
okano 0:188e389bc1b7 60 // SB1602E general commands
okano 0:188e389bc1b7 61
okano 0:188e389bc1b7 62 const char Comm_SetDDRAMAddress = 0x80;
okano 0:188e389bc1b7 63 const char DDRAMAddress_Ofst[] = { 0x00, 0x40 };
okano 0:188e389bc1b7 64
okano 0:188e389bc1b7 65 const char Comm_SetCGRAM = 0x40;
okano 0:188e389bc1b7 66
okano 0:188e389bc1b7 67 // SB1602E setting values
okano 0:188e389bc1b7 68
okano 0:188e389bc1b7 69 const char default_Contrast = 0x35;
okano 0:188e389bc1b7 70
okano 0:188e389bc1b7 71 const char COMMAND = 0x00;
okano 0:188e389bc1b7 72 const char DATA = 0x40;
okano 0:188e389bc1b7 73
okano 0:188e389bc1b7 74 const char MaxCharsInALine = 0x10; // buffer deoth for one line (no scroll function used)
okano 0:188e389bc1b7 75
okano 0:188e389bc1b7 76 const char init_seq0_length = 7;
okano 0:188e389bc1b7 77 const char init_seq0[ init_seq0_length ]
okano 0:188e389bc1b7 78 = {
okano 0:188e389bc1b7 79 Comm_FunctionSet_Normal,
okano 0:188e389bc1b7 80 Comm_ReturnHome, // This may be required to reset the scroll function
okano 0:188e389bc1b7 81 Comm_FunctionSet_Extended,
okano 0:188e389bc1b7 82 Comm_InternalOscFrequency,
okano 0:188e389bc1b7 83 Comm_ContrastSet | ( default_Contrast & 0xF),
okano 0:188e389bc1b7 84 Comm_PwrIconContrast | ((default_Contrast >> 4) & 0x3),
okano 0:188e389bc1b7 85 Comm_FollowerCtrl | 0x0A,
okano 0:188e389bc1b7 86
okano 0:188e389bc1b7 87 };
okano 0:188e389bc1b7 88 // required 30us interval
okano 0:188e389bc1b7 89
okano 0:188e389bc1b7 90 const char init_seq1_length = 3;
okano 0:188e389bc1b7 91 const char init_seq1[ init_seq1_length ]
okano 0:188e389bc1b7 92 = {
okano 0:188e389bc1b7 93 Comm_DisplayOnOff,
okano 0:188e389bc1b7 94 Comm_ClearDisplay,
okano 0:188e389bc1b7 95 Comm_EntryModeSet,
okano 0:188e389bc1b7 96 };
okano 0:188e389bc1b7 97 // required 30us, 2ms interval
okano 0:188e389bc1b7 98
okano 0:188e389bc1b7 99
okano 0:188e389bc1b7 100 class TextLCD_SB1602E : I2cBusDevice {
okano 0:188e389bc1b7 101 public:
okano 0:188e389bc1b7 102
okano 0:188e389bc1b7 103 explicit TextLCD_SB1602E( I2C *i2c, char dev_address = SB1602E_addr, char *init_massage = NULL ) : I2cBusDevice( i2c, dev_address ) {
okano 0:188e389bc1b7 104 wait( 0.04 ); // interval after hardware reset
okano 0:188e389bc1b7 105
okano 0:188e389bc1b7 106 for ( int i = 0; i < init_seq0_length; i++ ) {
okano 0:188e389bc1b7 107 lcd_command( init_seq0[ i ] );
okano 0:188e389bc1b7 108 wait( 30e-6 );
okano 0:188e389bc1b7 109 }
okano 0:188e389bc1b7 110
okano 0:188e389bc1b7 111 wait( 0.2 );
okano 0:188e389bc1b7 112
okano 0:188e389bc1b7 113 for ( int i = 0; i < init_seq1_length; i++ ) {
okano 0:188e389bc1b7 114 lcd_command( init_seq1[ i ] );
okano 0:188e389bc1b7 115 wait( 2e-3 );
okano 0:188e389bc1b7 116 }
okano 0:188e389bc1b7 117
okano 0:188e389bc1b7 118 if ( init_massage )
okano 0:188e389bc1b7 119 puts( 0, init_massage );
okano 0:188e389bc1b7 120
okano 0:188e389bc1b7 121 set_CGRAM( 7, '\x1F' );
okano 0:188e389bc1b7 122
okano 0:188e389bc1b7 123 curs[ 0 ] = 0;
okano 0:188e389bc1b7 124 curs[ 1 ] = 0;
okano 0:188e389bc1b7 125 }
okano 0:188e389bc1b7 126
okano 0:188e389bc1b7 127
okano 0:188e389bc1b7 128 ~TextLCD_SB1602E() {
okano 0:188e389bc1b7 129 }
okano 0:188e389bc1b7 130
okano 0:188e389bc1b7 131 void clear( void ) {
okano 0:188e389bc1b7 132 lcd_command( Comm_ClearDisplay );
okano 0:188e389bc1b7 133 wait( 2e-3 );
okano 0:188e389bc1b7 134 curs[ 0 ] = 0;
okano 0:188e389bc1b7 135 curs[ 1 ] = 0;
okano 0:188e389bc1b7 136 }
okano 0:188e389bc1b7 137
okano 0:188e389bc1b7 138
okano 0:188e389bc1b7 139 void put_custom_char( char c_code, const char *cg, char x, char y ) {
okano 0:188e389bc1b7 140 for ( int i = 0; i < 5; i++ ) {
okano 0:188e389bc1b7 141 set_CGRAM( c_code, cg );
okano 0:188e389bc1b7 142 putcxy( c_code, x, y );
okano 0:188e389bc1b7 143 }
okano 0:188e389bc1b7 144 }
okano 0:188e389bc1b7 145
okano 0:188e389bc1b7 146 void contrast( char contrast ) {
okano 0:188e389bc1b7 147 lcd_command( Comm_FunctionSet_Extended );
okano 0:188e389bc1b7 148 lcd_command( Comm_ContrastSet | (contrast & 0x0f) );
okano 0:188e389bc1b7 149 lcd_command( Comm_PwrIconContrast | ((contrast>>4) & 0x03) );
okano 0:188e389bc1b7 150 lcd_command( Comm_FunctionSet_Normal );
okano 0:188e389bc1b7 151 }
okano 0:188e389bc1b7 152
okano 0:188e389bc1b7 153 void set_CGRAM( char char_code, const char* cg ) {
okano 0:188e389bc1b7 154 for ( int i = 0; i < 8; i++ ) {
okano 0:188e389bc1b7 155 lcd_command( (Comm_SetCGRAM | (char_code << 3) | i) );
okano 0:188e389bc1b7 156 lcd_data( *cg++ );
okano 0:188e389bc1b7 157 }
okano 0:188e389bc1b7 158 }
okano 0:188e389bc1b7 159
okano 0:188e389bc1b7 160 void set_CGRAM( char char_code, char v ) {
okano 0:188e389bc1b7 161 char c[ 8 ];
okano 0:188e389bc1b7 162
okano 0:188e389bc1b7 163 for ( int i = 0; i < 8; i++ )
okano 0:188e389bc1b7 164 c[ i ] = v;
okano 0:188e389bc1b7 165
okano 0:188e389bc1b7 166 set_CGRAM( char_code, c );
okano 0:188e389bc1b7 167 }
okano 0:188e389bc1b7 168
okano 0:188e389bc1b7 169 void putcxy( char c, char x, char y ) {
okano 0:188e389bc1b7 170 if ( (x >= MaxCharsInALine) || (y >= 2) )
okano 0:188e389bc1b7 171 return;
okano 0:188e389bc1b7 172
okano 0:188e389bc1b7 173 lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[ y ]) + x );
okano 0:188e389bc1b7 174 lcd_data( c );
okano 0:188e389bc1b7 175 }
okano 0:188e389bc1b7 176
okano 0:188e389bc1b7 177 void putc( char line, char c ) {
okano 0:188e389bc1b7 178 if ( (c == '\n') || (c == '\r') ) {
okano 0:188e389bc1b7 179 clear_lest_of_line( line );
okano 0:188e389bc1b7 180 curs[ line ] = 0;
okano 0:188e389bc1b7 181 return;
okano 0:188e389bc1b7 182 }
okano 0:188e389bc1b7 183
okano 0:188e389bc1b7 184 putcxy( c, curs[ line ]++, line );
okano 0:188e389bc1b7 185 }
okano 0:188e389bc1b7 186
okano 0:188e389bc1b7 187 void puts( char line, char *s ) {
okano 0:188e389bc1b7 188 while ( char c = *s++ )
okano 0:188e389bc1b7 189 putc( line, c );
okano 0:188e389bc1b7 190 }
okano 0:188e389bc1b7 191
okano 0:188e389bc1b7 192 void printf( char line, char *format, ... ) {
okano 0:188e389bc1b7 193 char s[ 32 ];
okano 0:188e389bc1b7 194 va_list args;
okano 0:188e389bc1b7 195
okano 0:188e389bc1b7 196 va_start( args, format );
okano 0:188e389bc1b7 197 vsnprintf( s, 32, format, args );
okano 0:188e389bc1b7 198 va_end( args );
okano 0:188e389bc1b7 199
okano 0:188e389bc1b7 200 puts( line, s );
okano 0:188e389bc1b7 201 }
okano 0:188e389bc1b7 202
okano 0:188e389bc1b7 203 private:
okano 0:188e389bc1b7 204 char curs[2];
okano 0:188e389bc1b7 205
okano 0:188e389bc1b7 206 void clear_lest_of_line( char line ) {
okano 0:188e389bc1b7 207 for ( int i = curs[ line ]; i < MaxCharsInALine; i++ )
okano 0:188e389bc1b7 208 putcxy( ' ', i, line );
okano 0:188e389bc1b7 209 }
okano 0:188e389bc1b7 210
okano 0:188e389bc1b7 211 int lcd_write( char first, char second ) {
okano 0:188e389bc1b7 212 char cmd[2];
okano 0:188e389bc1b7 213
okano 0:188e389bc1b7 214 cmd[ 0 ] = first;
okano 0:188e389bc1b7 215 cmd[ 1 ] = second;
okano 0:188e389bc1b7 216
okano 0:188e389bc1b7 217 return ( write( cmd, 2 ) );
okano 0:188e389bc1b7 218
okano 0:188e389bc1b7 219 }
okano 0:188e389bc1b7 220
okano 0:188e389bc1b7 221 int lcd_command( char command ) {
okano 0:188e389bc1b7 222 return ( lcd_write( COMMAND, command ) );
okano 0:188e389bc1b7 223 }
okano 0:188e389bc1b7 224
okano 0:188e389bc1b7 225 int lcd_data( char data ) {
okano 0:188e389bc1b7 226 return ( lcd_write( DATA, data ) );
okano 0:188e389bc1b7 227 }
okano 0:188e389bc1b7 228 }
okano 0:188e389bc1b7 229 ;
okano 0:188e389bc1b7 230
okano 0:188e389bc1b7 231 #endif
okano 0:188e389bc1b7 232
okano 0:188e389bc1b7 233
okano 0:188e389bc1b7 234
okano 0:188e389bc1b7 235
okano 0:188e389bc1b7 236
okano 0:188e389bc1b7 237
okano 0:188e389bc1b7 238
okano 0:188e389bc1b7 239