Contrast not optimal

Fork of SB1602E by Tedd OKANO

Revision:
0:995f80348e02
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SB1002E.cpp	Mon Oct 20 12:54:53 2014 +0000
@@ -0,0 +1,250 @@
+/** Text LCD module "SB1602E" class library
+ *
+ *  @author  Tedd OKANO & Masato YAMANISHI
+ *  @version 2.0
+ *  @date    20-Oct-2014
+ *
+ *  SB1602E is an I2C based low voltage text LCD panel (based Sitronix ST7032 chip)
+ *  The module by StrawberryLinux
+ *  http://strawberry-linux.com/catalog/items?code=27002 (Online shop page (Japanese))
+ *  http://strawberry-linux.com/pub/ST7032i.pdf (datasheet of the chip)
+ *
+ *  This is a library to operate this module easy.
+ *
+ *  Released under the Apache 2 license License
+ *
+ *  revision history (class lib name was "TextLCD_SB1602E")
+ *    revision 1.0  22-Jan-2010   a. 1st release
+ *    revision 1.1  23-Jan-2010   a. class name has been changed from lcd_SB1602E to TextLCD_SB1602E
+ *                                b. printf() added
+ *                                c. copyright notice added
+ *    revision 1.3  02-May-2014   a. puticon() added (for SB1602B) by Masato YAMANISHI san
+ *    revision 2.0  20-Oct-2014   a. class name is changed and published as "SB1602E"
+ *                                b. re-written for better usability
+ */
+
+#include    <stdarg.h>
+#include    "mbed.h"
+#include    "SB1602E.h"
+
+
+SB1602E::SB1602E( PinName I2C_sda, PinName I2C_scl, char *init_massage ) : i2c_p( new I2C( I2C_sda, I2C_scl ) ), i2c( *i2c_p )
+{
+    init( init_massage );
+}
+
+SB1602E::SB1602E( I2C &i2c_, char *init_massage ) : i2c_p( NULL ), i2c( i2c_ )
+{
+    init( init_massage );
+}
+
+SB1602E::~SB1602E()
+{
+    if ( NULL != i2c_p )
+        delete  i2c_p;
+}
+
+void SB1602E::init( char *init_massage )
+{
+    const char init_seq0[]  = {
+        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[]  = {
+        Comm_DisplayOnOff,
+        Comm_ClearDisplay,
+        Comm_EntryModeSet,
+    };
+    
+    i2c_addr    = 0x7C;
+
+    wait( 0.04 );    //    interval after hardware reset
+
+    for ( int i = 0; i < sizeof( init_seq0 ); i++ ) {
+        lcd_command( init_seq0[ i ] );
+        wait( 30e-6 );
+    }
+
+    wait( 0.2 );
+
+    for ( int i = 0; i < sizeof( init_seq1 ); i++ ) {
+        lcd_command( init_seq1[ i ] );
+        wait( 2e-3 );
+    }
+
+    set_CGRAM( 7, '\x1F' );
+
+    curs[ 0 ]    = 0;
+    curs[ 1 ]    = 0;
+
+    if ( init_massage )
+    {
+        puts( 0, init_massage );
+        curs[ 0 ]    = 0;
+    }
+}
+
+void SB1602E::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 );
+}
+
+void SB1602E::putc( char line, char c )
+{
+    if ( (c == '\n') || (c == '\r') ) {
+        clear_lest_of_line( line );
+        curs[ line ]    = 0;
+        return;
+    }
+
+    putcxy( c, curs[ line ]++, line );
+}
+
+void SB1602E::puts( char line, char *s )
+{
+    while ( char c    = *s++ )
+        putc( line, c );
+}
+
+void SB1602E::putcxy( char c, char x, char y )
+{
+    const char    Comm_SetDDRAMAddress        = 0x80;
+    const char    DDRAMAddress_Ofst[]         = { 0x00, 0x40 };
+
+    if ( (x >= MaxCharsInALine) || (y >= 2) )
+        return;
+
+    lcd_command( (Comm_SetDDRAMAddress | DDRAMAddress_Ofst[ y ]) + x );
+    lcd_data( c );
+}
+
+void SB1602E::clear( void )
+{
+    lcd_command( Comm_ClearDisplay );
+    wait( 2e-3 );
+    curs[ 0 ]    = 0;
+    curs[ 1 ]    = 0;
+}
+
+void SB1602E::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 SB1602E::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 SB1602E::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 SB1602E::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 SB1602E::clear_lest_of_line( char line )
+{
+    for ( int i = curs[ line ]; i < MaxCharsInALine; i++ )
+        putcxy( ' ', i, line );
+}
+
+int SB1602E::lcd_write( char first, char second )
+{
+    char cmd[2];
+
+    cmd[ 0 ]    = first;
+    cmd[ 1 ]    = second;
+
+    return ( i2c.write( i2c_addr, cmd, 2 ) );
+
+}
+
+int SB1602E::lcd_command( char command )
+{
+    return ( lcd_write( COMMAND, command ) );
+}
+
+int SB1602E::lcd_data( char data )
+{
+    return ( lcd_write( DATA, data ) );
+}
+
+//  Following function has been imported from Masato YAMANISHI san's code.
+//  Thank you!
+//  http://developer.mbed.org/users/masato/code/TextLCD_SB1602E/file/39110c58e55c/TextLCD_SB1602E.h
+
+const unsigned char icon_data[]= {
+    // アイコンアドレス, 該当ビット
+    0x00, 0x10, // 0b10000,
+    0x02, 0x10, // 0b10000,
+    0x04, 0x10, // 0b10000,
+    0x06, 0x10, // 0b10000,
+
+    0x07, 0x10, // 0b10000,
+    0x07, 0x08, // 0b01000,
+    0x09, 0x10, // 0b10000,
+    0x0B, 0x10, // 0b10000,
+
+    0x0D, 0x08, // 0b01000,
+    0x0D, 0x04, // 0b00100,
+    0x0D, 0x02, // 0b00010,
+    0x0D, 0x10, // 0b10000,
+
+    0x0F, 0x10, // 0b10000, // アンテナマーク
+};
+
+void SB1602E::puticon(unsigned short flg)
+{
+    static unsigned char icon_buff[16]; // アイコンの編集用
+    unsigned char i;
+
+    for(i=0; i<sizeof(icon_data)/2; i++) {
+        if(flg & (0x1000>>i)) { // 該当ビットが立っていたら
+            icon_buff[icon_data[i*2]] |= icon_data[i*2+1];  // バッファを立てます。
+        } else {
+            icon_buff[icon_data[i*2]] &= ~icon_data[i*2+1]; // バッファをクリアします。
+        }
+    }
+    // 一括でLCDに書き込みます。
+    for(i=0; i<16; i++) {
+        lcd_command(Comm_FunctionSet_Extended); // 0b00111001); // コマンド
+        lcd_command(Comm_SetCGRAM + i); // 0b01000000+i);       // アイコン領域のアドレスを設定
+        lcd_data(icon_buff[i]); // アイコンデータ
+    }
+}
+
+
+
+
+
+